如何按位置选择空间图层并写入属性?

2 投票
1 回答
5460 浏览
提问于 2025-04-17 22:32

我正在整理一个全球油井的数据集。其中一个必要的属性是油井是位于陆地上还是海上。我们超过两万条记录中,只有大约三分之一的记录有这个属性。我的问题是:我该如何自动填充这个字段,利用一个点是否在国家边界内来判断它是陆上还是海上的位置?我更倾向于使用Python而不是SQL,因为我们现在还在使用File GDB格式。

谢谢,
詹姆斯

更新

我得提一下,我对ArcPY还比较陌生,所以不太确定从哪里开始写代码。这些点特征存储在File GDB中的特征类里。直到周二我才能回办公室发布记录,但地理空间表中已经填充了唯一ID、经纬度、高度、陆上/海上等信息。这个表通过关系类与其他三个表相连,这些关系是由我们的类型字段决定的。我们有国家和海洋边界的矢量文件,所以使用这两种拓扑关系中的任何一种作为条件都可以。

1 个回答

0

你可以通过“按位置选择”和“更新光标”来实现这个功能。截图展示了附加脚本的结果。这里的基本思路是选择那些与土地相交的点,然后根据这些点是否位于土地上,在属性表中写入“y”或“n”。

enter image description here


import arcpy, os

ws = r'C:\temp\analysis.gdb\albers'

oilwells = r'C:\temp\analysis.gdb\albers\oilwells'
land = r'C:\temp\analysis.gdb\albers\usa'
oilwells_lyr = "oilwells_lyr"

# Make the first selection and write to attributes
arcpy.MakeFeatureLayer_management(oilwells, oilwells_lyr)
arcpy.SelectLayerByLocation_management (oilwells_lyr, "INTERSECT", land, "", "NEW_SELECTION")

arcpy.AddField_management(oilwells_lyr, "land", "TEXT")

with arcpy.da.UpdateCursor(oilwells_lyr, ["land"]) as cursor:
    for row in cursor:
        row[0] = "y"
        cursor.updateRow(row)

arcpy.MakeFeatureLayer_management(oilwells_lyr, "oilwells_y_lyr")

# Make the second selection and write to attributes
arcpy.SelectLayerByLocation_management (oilwells_lyr, "INTERSECT", land, "", "SWITCH_SELECTION")

with arcpy.da.UpdateCursor(oilwells_lyr, ["land"]) as cursor:
    for row in cursor:
        row[0] = "n"
        cursor.updateRow(row)

arcpy.MakeFeatureLayer_management(oilwells_lyr, "oilwells_n_lyr")

# Merge the two temp layers and create a permanent feature class
arcpy.Merge_management (["oilwells_y_lyr", "oilwells_n_lyr"], os.path.join(ws, "out_fc"))

撰写回答