我的场景:有一个点要素集,我想知道距离每个点最近的几个点要素是什么
以前数据量不大的时候,这种情况我就直接暴力二层循环两两计算距离,但是随着自己对代码要求的提高,不能接受如此笨重的做法,遂查到空间选择SelectLayerByLocation_management。
这一方法输入的第一个参数(即查询对象)必须是图层,以往我都是要素集操作,不熟悉arcpy中的图层,因此也遇到了问题。
首先贴出正确结果:
#!/usr/bin/python
# -*- coding: UTF-8 -*-
import arcpy
shp='..\gridUTM.shp'
#首先需要从要素集创建图层对象
arcpy.MakeFeatureLayer_management(shp, "lyr")
rows=arcpy.UpdateCursor(shp)
for row in rows:
pg=row.getValue('SHAPE')
#空间选择方法,这里用缓冲区是简化逻辑
arcpy.SelectLayerByLocation_management("lyr",'INTERSECT',pg.buffer(1000))
#最后遍历选择
rows2 = arcpy.SearchCursor('lyr', ["Field1"])
for row2 in rows2:
print row2.getValue('Field1')
#以第一个为例
exit()
关于空间选择方法和上面的代码逻辑就不赘述了,下面讲讲遇到的问题。
SelectLayerByLocation_management方法的第三个参数,是Feature Layer类型的对象,一开始出于担心,我想要不要把缓冲区也图层化再输入:
<
在处理大量点要素时,通过暴力循环计算距离的方式不再适用。本文探讨了如何利用ArcPy的SelectLayerByLocation_management方法进行高效的空间选择。在实践中遇到的问题是,该方法需要图层作为输入,而MakeFeatureLayer_management创建的缓冲区图层在独立脚本中无法正常工作,但在ArcMap的Python窗口中却可以。问题在于缓冲区图层在内存中可能未正确创建,导致无法进行空间选择。作者对此现象进行了记录并寻求解释。
最低0.47元/天 解锁文章
1016





