Python Esri Arcpy 比较多边形和折线中的几何

问题描述

我在 ArcMap 上有两个图层:

  • 图层 A 几何多边形
  • B 层几何折线(关闭) 我想将 A 层的每条记录与 B 层的轮廓进行比较。 B 层(折线)具有围绕多边形(配菜)的线条。 因此,我必须比较线 B 是多边形 A 与 python 2.7 和 arcpy 的边界

如果我在折线中转换第一个多边形

#arcpy.polygonToLine_management("inLayerpolygon","outFeaturepolyline","IGnorE_NEIGHBORS")

所以你有两条折线

然后 我可以比较 Shape 字段吗?

''''
#LIST LAYERS ON THE MAP
for lyr in arcpy.mapping.ListLayers(self.mxd,'*'):             
    self.listLayer[lyr.name] = lyr.dataSource   
    
LayerP = 'LayerA'
LayerB = 'LayerB'
dsLayer = self.listLayer.get(layer,0)  
arr = arcpy.da.FeatureClasstoNumPyArray(in_table= ds,field_names= ["ID","SHAPE"])                     
for row in arr:
    cursor = arcpy.da.SearchCursor("LayerB","SHAPE"],where_clause = "ID = " + str(row[0]))
    for r in cursor:
        if row["SHAPE"] == r["SHAPE"]:
            arcpy.AddMessage('YES') 
        else:
            arcpy.AddMessage('NO') 
''''

谢谢

解决方法

我找到了这个解决方案:

#LIST LAYERS
for lyr in arcpy.mapping.ListLayers(self.mxd,'*'):             
    self.listLayer[lyr.name] = lyr.dataSource   
    
    desc = arcpy.Describe(lyr.dataSource)
    arcpy.AddMessage("Feature Type:  " + desc.featureType) 
    arcpy.AddMessage("Shape Type :   " + desc.shapeType) 
    arcpy.AddMessage("Spatial Index: " + str(desc.hasSpatialIndex)) 

layer1 = 'LayerA' (Polyline)
layer2 = 'LayerB' (Polygon)
newLayer = 'newLayer'

ds1 = self.listLayer.get(layer1,0)
ds2 = self.listLayer.get(layer2,0)

geodb = 'C:/GEODB/chk.gdb'
arcpy.MakeFeatureLayer_management(ds1,newLayer)

# Select all cities that overlap the chihuahua polygon
arcpy.SelectLayerByLocation_management(newLayer,"BOUNDARY_TOUCHES",ds2,"","NEW_SELECTION")

num = arcpy.GetCount_management(newLayer)
arcpy.AddMessage("num = " + str(num)) 

# Write the selected features to a new featureclass
arcpy.CopyFeatures_management(newLayer,geodb + "/newfc")

我想获取未选择的功能

,

这是一个更好的解决方案

arr = arcpy.da.FeatureClassToNumPyArray(in_table= ds,field_names= '*',where_clause= sWhere)

for row in arr:

    if arcpy.Exists(fcLayerPolyline):
        arcpy.Delete_management(fcLayerPolyline)

    if arcpy.Exists(fcLayerPolygon):
        arcpy.Delete_management(fcLayerPolygon)

    arcpy.MakeFeatureLayer_management(dsPolyline,fcLayerPolyline,"ID_GMO = " + str(row["ID"]))
    arcpy.MakeFeatureLayer_management(dsPolygon,fcLayerPolygon)

    #Seleziono Poligono ST011PAT
    arcpy.SelectLayerByLocation_management(fcLayerPolygon,"SHARE_A_LINE_SEGMENT_WITH","NEW_SELECTION")

    num = arcpy.GetCount_management(fcLayerPolygon)

    
    with arcpy.da.SearchCursor(fcLayerPolygon,['TIPO']) as cursor:
        for r in cursor:
            if r[0] == row["TIPO"]
                ....