如何使用ArcPy游标遍历列表,进行属性和空间选择以及填充字段

时间:2019-07-01 17:43:15

标签: python arcpy arcmap

我有两个shapefile,一个是点,另一个多边形,它们共享一个公共属性字段Field_Name,该属性字段仅填充在点shapefile中。我想创建一个Python / ArcPy脚本来完成以下任务:

  • 从点shapefile中填充字段中的值创建唯一列表。
  • 针对每个值遍历唯一列表:
  • 根据属性在唯一列表中根据名称选择点要素。
  • 使用多边形中包含的先前选择的点按位置选择多边形要素。
  • 使用选定点要素中的值(与唯一列表中的值相同)填充多边形shapefile中的空字段。

到目前为止,这就是我所拥有的,任何人都知道如何使它工作?

    import arcpy
    arcpy.env.workspace = r"C:\Users\*****\Desktop\GIS_test\shapefiles"

    Point = r'C:\Users\*****\Desktop\GIS_test\shapefiles\Point.shp'
    field = 'Field_Name'
    Polygons = r'C:\Users\*****\Desktop\GIS_test\shapefiles\Polygons.shp'

    # Use SearchCursor to return a unique set of values in the specified field    and create set.
    values = [row[0] for row in arcpy.da.SearchCursor(Point, field)]
    uniqueValues = set(values)

    # Convert the set to a list.
    unique_list = (list(uniqueValues)) 

    #Loop through list of unique values.
    for x in unique_list: 
        #SelectLayerByAttribute(in_layer_or_view, {selection_type}, {where_clause}, {invert_where_clause})
        arcpy.SelectLayerByAttribute_management(Point, 'NEW_SELECTION', [Field_Name] = '{0}'.format(x))

        #SelectLayerByLocation_management (in_layer, {overlap_type}, {select_features}, {search_distance},      
        #{selection_type},{invert_spatial_relationship})
        arcpy.SelectLayerByLocation_management(Polygons, 'CONTAINS', Point)

        #Update Field_Name attribute value in Polygon attribute table with name in unique list from Point.shp
        with arcpy.da.UpdateCursor(Polygons, 'Field_Name') as cursor:
            for row in cursor:
                row[0] = x
                cursor.updateRow(row)

该脚本执行到第18行(第一个选择语句)。

1 个答案:

答案 0 :(得分:0)

在我看来,您要执行的操作是空间连接。

空间连接from Arcmap documentation:根据空间关系将属性从一个要素连接到另一个要素。

文档将比我更好地解释如何使用它。

注1: 如果一个多边形中有多个具有不同值的点,则该多边形将仅具有一个点的字段。

注2: 空间联接功能将join_featurestarget_feature的所有字段联接在一起。因此,如果只希望添加一列,则必须隐藏其他字段。这是一个如何隐藏字段(必须创建一个新层)的示例:

input_layer = 'your_layer_name'
desired_fields =  #['field1', 'field2', ...] 
field_info = arcpy.Describe(input_layer).fieldInfo
for i in range(field_info.count):
    if field_info.getfieldname(i) not in desired_fields:
        field_info.setvisible(i, 'HIDDEN')
arcpy.MakeFeatureLayer_management(input_layer, 'new_layer_name', '', '', field_info)