【ArcPy】根据空间条件选择要素,与创建图层问题

我的场景:有一个点要素集,我想知道距离每个点最近的几个点要素是什么

以前数据量不大的时候,这种情况我就直接暴力二层循环两两计算距离,但是随着自己对代码要求的提高,不能接受如此笨重的做法,遂查到空间选择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不可用呢?我自己暂时不能解答,目前只做一记录,如有大佬知道原理,望不吝赐教。

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: 您好!您的问题不太清晰,不过我猜测您想要使用 arcpy 打印出最大的图层。如果是这样,您可以使用以下代码: ```python import arcpy # 指定地理数据库或文件地理数据库 arcpy.env.workspace = r"C:\data\mydb.gdb" # 获取所有图层 layers = arcpy.ListFeatureClasses() # 获取最大的图层 max_layer = max(layers, key=lambda layer: arcpy.GetCount_management(layer).getOutput(0)) # 打印最大的图层名称和要素数量 print("最大的图层是:{}".format(max_layer)) print("要素数量为:{}".format(arcpy.GetCount_management(max_layer).getOutput(0))) ``` 这段代码会获取指定地理数据库中的所有图层,然后使用 `max` 函数找到要素数量最多的图层。最后,会打印出最大的图层名称和要素数量。如果您想要打印出这个图层的地图,可以使用 arcpy 的 `ExportToPDF` 或 `ExportToJPEG` 函数。 ### 回答2: 在使用arcpy编写Python脚本时,可以使用arcpy中的工具和函数来打印最大(max)图层。首先,我们需要导入arcpy模块,然后使用ListFeatureClasses函数来获取当前工作空间中的所有要素类。接着,我们可以使用Describe函数来获取每个要素类的属性信息,并找到具有最大名称长度的要素类。最后,使用Print函数来打印最大图层的名称。 下面是一个使用arcpy打印最大图层的示例代码: ```python import arcpy # 设置工作空间 arcpy.env.workspace = "路径/到/工作空间" # 获取所有要素类 feature_classes = arcpy.ListFeatureClasses() # 初始化最大名称长度和最大图层 max_length = 0 max_layer = '' # 遍历每个要素类 for fc in feature_classes: desc = arcpy.Describe(fc) length = len(desc.name) # 判断当前要素类名称长度是否大于最大长度 if length > max_length: max_length = length max_layer = desc.name # 打印最大图层 print("最大图层:", max_layer) ``` 以上代码中,需要将"路径/到/工作空间"替换为实际的工作空间路径。该脚本会遍历工作空间中的每个要素类,并找到具有最大名称长度的要素类,最后打印该图层的名称。 希望以上回答对您有帮助! ### 回答3: 使用ArcPy打印最大图层涉及以下步骤: 1. 导入ArcPy模块: ``` import arcpy ``` 2. 设置工作空间: ``` arcpy.env.workspace = "路径\至\工作空间" ``` 3. 列出所有图层: ``` layer_list = arcpy.ListFeatureClasses() ``` 4. 创建一个变量来存储最大图层名称及其要素数量: ``` max_layer = "" max_count = 0 ``` 5. 循环遍历图层列表并比较要素数量: ``` for layer in layer_list: count = arcpy.GetCount_management(layer) if int(count.getOutput(0)) > max_count: max_count = int(count.getOutput(0)) max_layer = layer ``` 6. 打印最大图层名称及其要素数量: ``` print("最大图层是:", max_layer) print("要素数量:", max_count) ``` 完整代码如下: ```python import arcpy arcpy.env.workspace = "路径\至\工作空间" layer_list = arcpy.ListFeatureClasses() max_layer = "" max_count = 0 for layer in layer_list: count = arcpy.GetCount_management(layer) if int(count.getOutput(0)) > max_count: max_count = int(count.getOutput(0)) max_layer = layer print("最大图层是:", max_layer) print("要素数量:", max_count) ``` 这段代码将打印工作空间中包含最多要素图层名称及其要素数量。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值