本帖最后由 daitianci 于 2015-1-15 10:56 编辑
之前在论坛里看到zaiciyun坛友发的一个求助,内容是如何选取各个区域内面积最小的点位,其中区域字段为bh,而面积字段为Area,以这个为起点做了一系列的思考。 方案一: 在我刚刚看到这个问题的时候,我首先想到的是group by,然后 order by,就是先分类,然后再排序。这个问题如果放到.net中结合linq来分析,分分钟的事。所以当时我给的建议是添加点x,y坐标,然后属性表导出,用自己写的工具分析一下,然后再回来展点。但是后来我又思考了挺多,证明这样做是麻烦的,首先,属性表导入导出就很烦,再来,这样不通用。 方案二: 用arcpy定制自己的工具箱,这样肯定是比较正确的做法。思路是这样的,首先,先在python里读取属性表,然后group by bh,order by Area,这样就可以分析出我们要的结果:{bh1,(Area1,Area2...)} {bh2,(Area1,Area2...)}。接下来我们就可以得到我们要的各个区域最小面积。然后就可以利用这两个条件查询出各个点位,然后生成新的shp即可。里面涉及到的python知识还是蛮多的,首先是group by的方法,然后是字典表的建立,都是比较令人烦恼,因为对python不够熟悉。在这过程中还有一些蛮有意思的地方,就是按区域去循环分析,然后选取结果要累加,然后再复制,之前没想到arcpy开发其实也非常智能。 扩展: 透过这个问题,抽象需求,我们可以这么看待这个事。但凡有一个字段是类型,一个字段是值的,我们都可以用这样去统计分析。例如:类型为商店中的最大最小营业额、某等级道路中的最大最小通行量、某等级医院中的最大最小受益群众数等等。所以在设计这个工具箱的时候,我并没有针对这个面积统计问题来设计,而是做成灵活可变的,因为确实有一定的意义。 附上一个可以使用的工具箱,针对此类问题。 坛友下载以后发现不可用,问题检测以后如下,区域字段的应该为string类型,面积要为数字,例如double类型,这样即可。之前区域我给设置成int了,拼查询sql的时候出的问题。
|