使用游标在ArcPy中搜索和选择

时间:2015-09-02 20:48:01

标签: python gis arcgis python-2.5 arcpy

我正在开发一种工具,用于识别功能并使用现有工具对其进行修复。目前,我正努力将我的想法转化为代码。 目的是使用“按位置选择要素”图层中的搜索光标来识别并选择原始数据中的要素并执行其他工具。 截至目前,我的代码看起来像这样(在ArcMap 9.3中):

Junctions_Lyr = "Junctions_Lyr"
gp.MakeFeatureLayer_management(Junctions, Junctions_Lyr, "", "", "")
gp.SelectLayerByLocation_management(Junctions_Lyr, "INTERSECT", Corrupt_Lyr, "", "NEW_SELECTION")
gp.SaveToLayerFile_management(Junctions_Lyr, "Junctions.lyr", Workspace)
rows = gp.SearchCursor(Junctions, "OBJECTID")
curs = gp.SearchCursor(Junctions_Lyr, "OBJECTID")
for row in rows:
    if row.OBJECTID = curs.OBJECTID:
        # Something to select the feature and run clean up tool.
        rows.next()
    else:
        rows.next()

基本上,如果它们与损坏的图层相交,这将(有希望)选择Junctions Feature类中的特征。然后将选择它们并将其保存到文件中。然后,原始要素类将在其中运行搜索光标,如果对象ID与已保存图层文件中的对象ID匹配,则它将选择该要素并运行清理工具。

我接近这个吗?我认为我无法正确表达这一点,这使得问题难以解决。

1 个答案:

答案 0 :(得分:1)

总的来说,这是一个很好的方法。但是我可以看到代码中有一些可能的改进:

  • 虽然您确实需要在内存中创建一个图层来进行选择,但您不需要将其另存为图层文件。
  • 您不需要使用两种不同的功能集。只需在要素图层上选择并使用选择集。
  • row.OBJECTID = curs.OBJECTID是一项任务,而非比较。使用==进行比较,而不是=
  • 如果您的修复工具可以使用整套功能,那么只需在选择后为其提供要素图层,并且应该遵循选择。如果您的修复工具只使用一项功能,则需要像您一样运行SearchCursor(但只需执行一次)。我的下面的示例假设修复工具一次只能使用一个功能。

这里有一些我认为可以满足你需要的代码:

Junctions_Lyr = "Junctions_Lyr"
gp.MakeFeatureLayer_management(Junctions, Junctions_Lyr, "", "", "")
gp.SelectLayerByLocation_management(Junctions_Lyr, "INTERSECT", \
    Corrupt_Lyr, "", "NEW_SELECTION")
for row in gp.SearchCursor(Junctions_Lyr):
    pt = row.SHAPE.getPart(0)
    print("TODO run tool on selected feature " + str(row.OBJECTID) \
        + ", x = " + str(pt.X) + ", y = " + str(pt.Y))