ArcMap中创建动态叠加网格及多面要素批量生成网格的技术问询
批量为多面要素生成动态尺寸网格(ArcMap 10.7)
别担心,完全可以实现你要的批量动态网格生成需求!针对ArcMap 10.7的环境,我整理了两种实用方案,还会帮你衔接Data Driven Pages的地图集制作:
方案一:用ModelBuilder可视化批量处理(适合非代码用户)
如果不想写代码,用ModelBuilder就能搞定批量迭代和条件判断:
- 先给面要素加面积字段
- 打开
Calculate Field工具,给你的面要素类添加一个Area_M2字段(类型选双精度),表达式用!shape.area@squaremeters!,确保面积单位是平方米。
- 打开
- 构建迭代+条件判断的模型
- 拖入
Iterate Feature Selection工具,设置迭代你的面要素类,按每个要素单独处理。 - 拖入
Calculate Value工具,写个简单的判断逻辑:比如def get_grid_size(area): return 100 if area > 1000000 else 50(这里的阈值和尺寸你可以自己改),输入变量选刚才的Area_M2字段。 - 把
Grid Index Features工具拖进来,设置Extent为迭代出来的单个要素,Grid Width和Grid Height关联Calculate Value的输出结果。 - 最后用
Append工具把每个要素生成的网格合并到一个总要素类里,记得保留原面要素的ID或名称字段,方便后续关联。
- 拖入
- 运行模型
- 确保模型里的临时数据路径设置正确,点击运行就能自动为每个面生成对应尺寸的网格。
方案二:用Python脚本自动化处理(适合批量大、效率要求高的场景)
如果你的面要素数量很多,写个ArcPy脚本会更高效,代码示例如下:
import arcpy import os # 配置参数,这里根据你的实际情况修改 workspace = r"C:\YourProject\YourGDB.gdb" input_polygons = "YourAreaFeatures" output_grid = "DynamicGrid_Output" # 定义面积阈值(平方米)和对应网格尺寸(米) size_rules = [ (500000, 200), # 面积>50万㎡,用200米网格 (100000, 100), # 面积>10万㎡且<=50万㎡,用100米网格 (0, 50) # 面积<=10万㎡,用50米网格 ] # 环境设置 arcpy.env.workspace = workspace arcpy.env.overwriteOutput = True # 创建输出网格要素类,保留原要素ID关联字段 spatial_ref = arcpy.Describe(input_polygons).spatialReference arcpy.CreateFeatureclass_management(workspace, output_grid, "POLYGON", spatial_reference=spatial_ref) arcpy.AddField_management(output_grid, "Original_OID", "LONG") # 遍历每个面要素生成网格 with arcpy.da.SearchCursor(input_polygons, ["OID@", "SHAPE@", "SHAPE@AREA"]) as cursor: for oid, poly_shape, area in cursor: # 匹配对应的网格尺寸 grid_width = grid_height = size_rules[-1][1] # 默认用最小尺寸 for threshold, size in size_rules: if area > threshold: grid_width = grid_height = size break # 生成单个要素的临时网格 temp_grid = arcpy.CreateScratchName("temp_grid", workspace=workspace) arcpy.GridIndexFeatures_cartography( out_feature_class=temp_grid, in_features=poly_shape, grid_width=grid_width, grid_height=grid_height, starting_page_number=1 ) # 关联原要素ID并合并到总输出 arcpy.AddField_management(temp_grid, "Original_OID", "LONG") arcpy.CalculateField_management(temp_grid, "Original_OID", oid) arcpy.Append_management(temp_grid, output_grid, "NO_TEST") # 清理临时数据 arcpy.Delete_management(temp_grid) print(f"动态网格生成完成!结果已保存到 {os.path.join(workspace, output_grid)}")
脚本使用注意:
- 记得替换
workspace、input_polygons等参数为你的实际路径和要素类名 - 调整
size_rules里的阈值和尺寸,匹配你的业务需求 - 如果原面要素是地理坐标系(比如WGS84),建议先转成投影坐标系(比如UTM),不然面积计算会出错
衔接Data Driven Pages制作地图集
生成网格后,就可以设置Data Driven Pages了:
- 打开布局视图,右键点击内容列表里的网格要素类,选择
Data Driven Pages > Set Up Data Driven Pages - 选择网格要素类作为索引图层,设置页码字段(可以在生成网格时添加,或者用
Grid Index Features自动生成的PageNumber字段) - 在
Overview选项卡,添加你的原面要素类作为概览图层,设置高亮样式(比如用红色边框高亮当前网格对应的区域) - 调整详细地图的范围,确保每个页面刚好覆盖对应的网格
- 最后导出地图集即可,支持导出为PDF、图片等格式
小技巧
- 生成网格时,可以给每个网格添加原面要素的名称字段,这样地图集的标题可以动态显示区域名称
- 如果需要统一网格的对齐方式,可以在
Grid Index Features里设置Grid Origin参数
内容的提问来源于stack exchange,提问作者brian_foley




