📜  arcpy 选择可见栅格 - Python (1)

📅  最后修改于: 2023-12-03 15:13:27.831000             🧑  作者: Mango

介绍arcpy模块选择可见栅格

arcpy模块是针对ArcGIS软件的Python库,提供了处理GIS数据的许多函数和工具。其中包括选择可见栅格的函数,可以方便快捷地选择用户视图范围内的栅格数据。

步骤
  1. 导入arcpy模块
import arcpy
  1. 获取地图文档对象,并获取当前激活的数据框
mxd = arcpy.mapping.MapDocument("CURRENT")
df = arcpy.mapping.ListDataFrames(mxd)[0]
  1. 获取数据框的可视范围,并转换为几何对象
extent = df.extent
extent_polygon = arcpy.Polygon(arcpy.Array([arcpy.Point(extent.XMin, extent.YMin), 
                                             arcpy.Point(extent.XMin, extent.YMax),
                                             arcpy.Point(extent.XMax, extent.YMax),
                                             arcpy.Point(extent.XMax, extent.YMin)]))
  1. 获取栅格图层的描述符对象,并使用Where Clause属性选择可见的栅格
raster_lyr = arcpy.mapping.Layer("raster_layer_name")
raster_lyr.definitionQuery = "INTERSECTED_BY_THE_VIEW = 1"
  1. 获取可见栅格的ID列表,并使用SelectLayerByAttribute进行选择
visible_rasters = [row[0] for row in arcpy.da.SearchCursor(raster_lyr, "OID@", spatial_reference=df.spatialReference) if extent_polygon.overlaps(row[1])]
arcpy.SelectLayerByAttribute_management(raster_lyr, "ADD_TO_SELECTION", "OBJECTID IN ({})".format(", ".join(map(str, visible_rasters))))
代码片段
import arcpy

# 获取地图文档对象,并获取当前激活的数据框
mxd = arcpy.mapping.MapDocument("CURRENT")
df = arcpy.mapping.ListDataFrames(mxd)[0]

# 获取数据框的可视范围,并转换为几何对象
extent = df.extent
extent_polygon = arcpy.Polygon(arcpy.Array([arcpy.Point(extent.XMin, extent.YMin), 
                                             arcpy.Point(extent.XMin, extent.YMax),
                                             arcpy.Point(extent.XMax, extent.YMax),
                                             arcpy.Point(extent.XMax, extent.YMin)]))

# 获取栅格图层的描述符对象,并使用Where Clause属性选择可见的栅格
raster_lyr = arcpy.mapping.Layer("raster_layer_name")
raster_lyr.definitionQuery = "INTERSECTED_BY_THE_VIEW = 1"

# 获取可见栅格的ID列表,并使用SelectLayerByAttribute进行选择
visible_rasters = [row[0] for row in arcpy.da.SearchCursor(raster_lyr, "OID@", spatial_reference=df.spatialReference) if extent_polygon.overlaps(row[1])]
arcpy.SelectLayerByAttribute_management(raster_lyr, "ADD_TO_SELECTION", "OBJECTID IN ({})".format(", ".join(map(str, visible_rasters))))
解释

以上代码做了以下操作:

  1. 导入arcpy模块;
  2. 通过arcpy.mapping.MapDocument获取当前地图文档对象;
  3. 使用arcpy.mapping.ListDataFrames获取当前激活的数据框对象;
  4. 使用数据框的extent属性获取当前视图的范围;
  5. 使用arcpy.Polygon函数将范围转换成几何对象;
  6. 获取指定栅格图层的描述符对象;
  7. 使用描述符对象的definitionQuery属性设置Where Clause属性,用于选择可见栅格,其中INTERSECTED_BY_THE_VIEW是一个ESRI默认属性,用于表示数据框视图范围与栅格图层的交集;
  8. 使用arcpy.da.SearchCursor获取栅格图层中与视图相交的栅格对象,其中spatial_reference属性用于指定显示坐标系,row[1]是栅格数据的几何对象;
  9. 根据栅格数据在视图中的位置,将栅格的ID保存在visible_rasters列表中;
  10. 使用arcpy.SelectLayerByAttribute_management函数进行选择,并将可见栅格的ID列表转换成SQL语句中的形式;
参考
  1. arcpy.mapping.MapDocument
  2. arcpy.mapping.ListDataFrames
  3. arcpy.Polygon
  4. arcpy.da.SearchCursor
  5. arcpy.SelectLayerByAttribute_management