|||
转自:https://blog.csdn.net/OldMonkeyYu_s/article/details/90372112
我的场景:有一个点要素集,我想知道距离每个点最近的几个点要素是什么
以前数据量不大的时候,这种情况我就直接暴力二层循环两两计算距离,但是随着自己对代码要求的提高,不能接受如此笨重的做法,遂查到空间选择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.MakeFeatureLayer_management(pg.buffer(1000), "lyr2")
arcpy.SelectLayerByLocation_management("lyr",'INTERSECT', "lyr2")
结果没有查询到任何东西。
然而我把相同的代码放入ArcMap的Python window中运行,则可顺利运行,两个图层也在TOC中添加上了。
问题来了,同样的代码,为何独立脚本不得运行,而ArcMap窗口可以运行呢?
进一步查看了一下:
arcpy.MakeFeatureLayer_management(pg.buffer(1000), "lyr2")
desc = arcpy.Describe("lyr2")
print("Name String: " + desc.nameString)
print("Feature class type: " + desc.featureClass.featureType)
rows2=arcpy.UpdateCursor("lyr2")
for row2 in rows2:
print row2
'''
输出
Name String: lyr2
Feature class type: Simple
'''
似乎说明了缓冲区图层其实并没有创建出来,其中没有内容,即使使用time.sleep等待也同样无结果。
我知道MakeFeatureLayer_management方法创建的是内存中的临时图层,只是为何lyr可用而lyr2不可用呢?我自己暂时不能解答,目前只做一记录,如有大佬知道原理,望不吝赐教。
————————————————
版权声明:本文为CSDN博主「OldMonkeYu」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/OldMonkeyYu_s/article/details/90372112
Archiver|手机版|科学网 ( 京ICP备07017567号-12 )
GMT+8, 2024-10-20 04:59
Powered by ScienceNet.cn
Copyright © 2007- 中国科学报社