使用ArcPy在ArcGIS Desktop中按点选择ArcSDE多边形?


15

我一直认为我必须缺少某些东西,但是ArcGIS 10中似乎没有工具可以通过ArcPy从点(X,Y)位置的图层中选择要素(特别是多边形)。这种工具的参数只是图层名称和XY位置。

目前,我通过创建包含该点的点要素类并对其执行SelectLayerByLocation来解决此问题。但是,当面要素类在Oracle中(可通过ArcSDE 9.x访问)并且包含350万个面时,我认为一两秒钟(用更少的代码)将花费5分钟以上的时间进行选择更合适。要素类具有空间索引,我尝试使用arcpy.env.extent(SelectLayerByLocation似乎忽略了它)来限制访问的地理区域,但性能仍然很差。

有没有使用ArcGIS Desktop 10和ArcPy进行此操作的更快方法?


现在,可以在forums.arcgis.com/threads/…上找到解决方案,今天晚些时候我将把这些信息编辑到这里-非常感谢Jason Scheirer和Chris Snyder
PolyGeo

2
就像对此进行说明一样,您可以在工具参考页底部找到该工具所遵循的环境。SelectByLocation仅支持当前工作区和输出坐标系。help.arcgis.com/en/arcgisdesktop/10.0/help/index.html#//…–
blord-castillo

Answers:


9

另一种方法是使用“空间连接”工具。如上所述,将点用作输入要素图层,将多边形图层用作标识要素。
与SelectLayerByLocation不同,SpatialJoin 确实支持扩展区环境。

targetlayer = layername
joinlayer=arcpy.PointGeometry(arcpy.Point(x, y))
fieldmappings = arcpy.FieldMappings()
fieldmappings.addTable(targetlayer)
arcpy.SpatialJoin_analysis(targetlayer, joinlayer, outputlayer, "JOIN_ONE_TO_MANY", "KEEP_COMMON", fieldmappings)

JOIN_ONE_TO_MANY似乎违反直觉,但是由于您只有一个联接功能,因此此选项的主要功能是关闭聚合和合并规则。KEEP_COMMON将确保您的输出仅限于与您的点相交的多边形。字段映射将输出属性限制为仅多边形图层的形状和属性;默认值也将包括点图层的属性。

其余的默认设置可以正常工作,因此您可以省略其余的参数。


非常感谢此代码包含了一些我没有尝试过的技术。我之前曾尝试过SpatialJoin(这样就可以尊重地理处理环境),但是该测试以及刚才对您的技术的测试仍然给了我4-5分钟的响应时间,而方法只有10-12秒克里斯·斯奈德(Chris Snyder)带领我去了。
PolyGeo

您是否也通过SpatialJoin尝试了Chris Snyder的技术?我认为缓冲技术如此之快的主要原因是它使用了多边形类的内存副本。我认为按位置选择应该比空间联接更快,但是我不确定。
blord-castillo 2011年

最终不使用in_memory位。它已经加速了很多,以至于我保留了下来。我认为关键是要设置获取多边形的程度(从350万个开始),我需要检查该多边形的X,Y,然后迅速将其复制到本地文件地理数据库中。因此,我认为在SpatialJoin之前进行此操作会导致相同/相似的性能提升。
PolyGeo

1

我刚意识到...

如果您使用它来实现地理处理服务,则也可以使用多边形图层来实现要素服务,并在要素服务上使用查询操作。

可以将简单的XY位置与Feature Service Query操作一起使用,以及控制包括形状在内的输出属性。

您可能会限制多边形要素类的公开数量,但是如果您已经使地理处理服务可以访问它,那么您也应该能够构建要素服务。


这是满足其他要求的有用想法,但是在这种情况下,客户端应用程序非常简单,并且不受我的控制,因此我只能提供地理处理服务。
PolyGeo

我认为使用地理处理服务以外的任何东西都可能受到限制:)具有讽刺意味的是,我认为要素服务是实施和维护的简单得多的途径。这也可以解释为什么所需的功能不可用。您已经可以在每个应用程序级别中做到这一点。确保向ESRI发送请求,以将其实现为下一版本的工具。
blord-castillo 2011年

1

这个答案来自旧的ArcGIS论坛

感谢Jason Scheirer提供了一些更简洁的代码:

SelectLayerByLocation(in_layer=arcpy.PointGeometry(arcpy.Point(x, y)), select_features="mylayer") 

特别是克里斯·斯奈德(Chris Snyder)的表演技巧:

更快的解决方法是稍微缓冲一下您的点,然后将缓冲区范围用作分析范围,以对SDE数据进行in_memory副本(CopyFeatures工具),然后在较小的局部in_memory数据集上执行SelectByLocation。这样,您就可以使SelectByLocation工具遵守分析范围环境,而这通常是不行的。顺便说一句:任何与分析范围重叠的要素都将使用CopyFeatures工具进行复制。我当然希望SelectByLocation工具和游标方法能够尊重分析范围...

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.