资讯动态

ArcGIS六边形渔网生成工具箱:空间均匀采样与蜂窝图实战

发布时间:2026/10/27 7:08:21 来源:尧图企业网站定制
简介本资源是一款面向GIS从业者与空间分析学习者的ArcGIS工具箱用于在ArcGIS中快速生成正六边形渔网蜂窝图解决传统渔网工具难以直接产出规则六边形格网的问题适用于城市规划、生态分区、格网统计等场景。压缩包共83个文件约889KB包含tbx工具箱、lyr图层文件、mxd工程文档、py脚本以及配套gdb示例地理数据库含gdbtable、gdbtablx、atx索引等解压后可直接加载使用双击工具箱输入研究区与六边形边长即可生成结果支持ArcGIS 10.2及以上版本永久可用。目前已有363人学习下载适合需要快速构建蜂窝格网、开展格网化空间分析的中初级用户参考使用。1. 六边形渔网不是花架子从蜂窝图到空间均匀采样的真实需求做空间分析的人迟早会撞上一个问题用规则方格网做采样或统计边缘效应和方向偏差总是阴魂不散。方格网在对角线方向上的邻接距离是边长的 1.414 倍这意味着同一套数据在不同方向上被看见的方式根本不一样。六边形渔网蜂窝图就是冲着这个痛点来的——每个六边形的六条边到中心距离完全相等邻接方向只有六个各向同性远好于方格。ArcGIS 自带的渔网工具Fishnet只能生成矩形网格想要六边形得自己动手。这份工具箱干的事很明确在 ArcGIS 里一键生成指定范围、指定大小的六边形蜂窝渔网输出可直接用于采样、聚合、制图和分析的要素类。适合做土地利用统计、生态样方布设、客流热力聚合、遥感影像分块的人。下面把它怎么落地、参数怎么调、哪里容易翻车一条条拆开讲。2. 工具箱的底层逻辑六边形怎么在 ArcGIS 里被画出来2.1 为什么不用 ArcGIS 自带 Fishnet 硬凑ArcGIS 的 Fishnet 工具CreateFishnet生成的是正交矩形网格它的几何构造逻辑是给定原点、Y 轴角度、格网宽高、行列数逐个计算每个矩形的四个角点。这套逻辑天生只认矩形你没法通过改参数让它输出六边形。有人试过用 Fishnet 生成点阵再手动连线但那样得到的六边形要么边长不一致要么在投影坐标系下发生形变后期做邻接分析时拓扑错误一堆。常见做法是绕开 Fishnet直接用脚本按六边形几何公式逐行逐列计算中心点坐标再构造 Polygon。工具箱本质上就是这个思路的封装输入范围、六边形外接圆半径或边长脚本算出所有六边形中心点然后以每个中心点为基准生成六边形面。这样做的好处是几何精度可控不会因为投影变形导致蜂窝歪斜——前提是你得用投影坐标系地理坐标系下算出来的六边形会随纬度变形这是后面要重点说的坑。2.2 六边形几何参数与坐标计算六边形分平顶flat-top和尖顶pointy-top两种朝向。平顶六边形的宽是2 * size高是sqrt(3) * size尖顶六边形反过来宽是sqrt(3) * size高是2 * size。这里size是外接圆半径也等于边长。工具箱一般默认尖顶朝向因为它在南北方向上排列更紧凑适合做纵向采样。行与行之间的垂直间距是1.5 * size尖顶情况下同一行内相邻六边形中心水平间距是sqrt(3) * size奇数行要水平偏移sqrt(3) * size / 2。这套偏移逻辑是蜂窝图的核心写错了就会得到一堆重叠或间隙的六边形。下面是一段典型的中心点计算代码工具箱内部逻辑与此一致import math def gen_hex_centers(xmin, ymin, xmax, ymax, size, pointy_topTrue): 生成覆盖指定范围的六边形中心点坐标 size: 外接圆半径等于边长 pointy_top: True 为尖顶六边形False 为平顶 centers [] if pointy_top: # 尖顶水平间距 sqrt(3)*size垂直间距 1.5*size dx math.sqrt(3) * size dy 1.5 * size row 0 y ymin while y ymax size: # 奇数行水平偏移半个间距 x_offset (dx / 2) if (row % 2 1) else 0 x xmin x_offset while x xmax size: centers.append((x, y)) x dx y dy row 1 else: # 平顶水平间距 1.5*size垂直间距 sqrt(3)*size dx 1.5 * size dy math.sqrt(3) * size col 0 x xmin while x xmax size: y_offset (dy / 2) if (col % 2 1) else 0 y ymin y_offset while y ymax size: centers.append((x, y)) y dy x dx col 1 return centers这段代码的关键参数就两个size和pointy_top。size直接决定蜂窝密度size越小六边形越多、计算越慢pointy_top决定朝向选错了后续做邻接矩阵时方向定义会全乱。代码里while y ymax size多留了一个size的余量是为了保证边缘六边形完整覆盖范围不然边界上会出现半截六边形。工具箱在调用这段逻辑后会用arcpy.Polygon按六个顶点构造面顶点角度从30°开始每隔60°取一个尖顶情况平顶则从0°开始。2.3 工具箱的输入参数与运行环境工具箱通常以.tbx或.pyt形式提供挂在 ArcGIS 的 ArcToolbox 里。核心输入参数一般包括输出要素类路径、范围可以是要素类、栅格或手动输入的 xmin/ymin/xmax/ymax、六边形大小单位跟随坐标系、朝向选择。运行环境要求 ArcGIS Desktop 10.x 或 ArcGIS Pro需要 Python 2.7Desktop或 Python 3.xPro环境依赖arcpy站点包。参数含义常见取值注意输出路径结果要素类位置地理数据库.gdb内不要输出到 shapefile字段名会截断范围来源决定蜂窝覆盖区域要素类 / 栅格 / 手动坐标手动坐标要和数据同坐标系六边形大小外接圆半径100 / 500 / 1000米单位跟随投影坐标系朝向尖顶或平顶尖顶与后续分析方向定义一致参数设完后点运行工具箱会在后台完成中心点计算、面构造、投影写入、属性表添加通常带一个唯一 ID 字段。如果范围很大、size很小生成过程可能跑几分钟到几十分钟这是正常的不是卡死。3. 从零跑通一遍范围准备、参数设置与结果校验3.1 准备范围和坐标系动手之前先把范围定清楚。最常见的做法是拿一个研究区的面要素作为范围输入工具箱会读取它的extent。但这里有个前置动作容易被跳过确认数据框和输入要素都用了投影坐标系。如果是地理坐标系比如 WGS84 经纬度六边形会随纬度发生形变越往高纬越扁。判断方法很简单看坐标系名称里有没有Degree或经纬度字样有就说明是地理坐标系需要先投影。投影用Project工具选一个适合研究区的投影带。国内常用的是 CGCS2000 高斯克吕格投影或 UTM 分区投影。投影完再拿投影后的要素去生成蜂窝。这一步不做后面所有六边形的面积、邻接距离都不可信。import arcpy # 把研究区面要素投影到适合的投影坐标系 arcpy.Project_management( in_datasetstudy_area_wgs84, out_datasetstudy_area_projected, out_coor_systemarcpy.SpatialReference(4547) # CGCS2000 3度带 中央经线117E )SpatialReference(4547)是 CGCS2000 的 3 度带投影中央经线 117°E适合华东一带。换研究区要换对应的 EPSG 代码别照抄。投影完成后用arcpy.Describe确认一下spatialReference.type是不是Projected是的话再往下走。3.2 调用工具箱生成蜂窝工具箱挂载后在 ArcToolbox 里双击打开按顺序填参数。如果习惯脚本调用也可以用arcpy直接调工具箱里的脚本工具import arcpy # 调用六边形渔网工具箱 arcpy.HexagonFishnet_toolbox( in_featuresstudy_area_projected, out_featuresC:/data/analysis.gdb/hex_grid, hex_size500, # 外接圆半径 500 米 orientationPOINTY, # 尖顶朝向 add_id_fieldTrue # 添加唯一 ID 字段 )hex_size500意味着每个六边形外接圆半径 500 米相邻中心间距约 866 米尖顶水平方向。这个尺度适合做中等分辨率的人口或土地利用聚合。如果研究区是城市街区级别size可以降到 100 甚至 50如果是省级尺度可以放大到 5000 或 10000。add_id_fieldTrue会加一个类似HEX_ID的字段后续做表连接和分组统计时靠它做唯一标识建议开着。运行结束后结果会自动加载到地图。先别急着做分析花两分钟做几何校验。3.3 结果校验面积、邻接与覆盖完整性校验分三步。第一步看面积随便选几个六边形用Calculate Geometry算面积和理论值(3 * sqrt(3) / 2) * size^2对比。size500时理论面积约 649519 平方米。如果算出来差很多说明坐标系或几何构造有问题。第二步看邻接用Polygon Neighbors工具需要 Advanced 许可或手动量测确认每个六边形有 6 个邻居边缘的除外。如果出现 4 个或 8 个邻居说明行偏移逻辑写错了蜂窝变成了错位方格。第三步看覆盖把研究区面要素叠上去目视检查边缘有没有大面积空洞或超出范围太多。工具箱一般会多生成一圈边缘六边形这是正常的可以用Select by Location把与研究区不相交的六边形删掉。# 删除与研究区不相交的边缘六边形 arcpy.MakeFeatureLayer_management(hex_grid, hex_lyr) arcpy.SelectLayerByLocation_management(hex_lyr, INTERSECT, study_area_projected) arcpy.CopyFeatures_management(hex_lyr, hex_grid_clipped)SelectLayerByLocation的INTERSECT关系会把只要碰到研究区的六边形都留下包括只搭了一个角的。如果要求六边形中心点落在研究区内改用HAVE_THEIR_CENTER_IN。这一步做完蜂窝就算真正可用了。4. 避坑与排查六边形渔网最容易翻车的五个地方4.1 地理坐标系下生成六边形变成扁蜂窝现象生成的六边形在高纬度地区明显被压扁面积不一致邻接距离也不等。原因地理坐标系以度为单位经度方向的实际距离随纬度收缩而脚本按等间距度数计算中心点导致几何形变。解决生成前先用Project工具把范围要素投影到投影坐标系确保size参数的单位是米而不是度。判断方法看数据框坐标系名称含Degree就是地理坐标系。4.2 六边形大小设成直径结果密度翻倍现象生成的蜂窝比预期密一倍六边形数量远超估算。原因工具箱的size参数是外接圆半径等于边长不是直径也不是对边距离。有人按直径 1000 米去填size1000实际得到的是半径 1000 米、直径 2000 米的六边形但数量计算时又按 1000 米估导致预期和结果对不上。解决填参数前先确认工具箱文档里size的定义按半径填。如果不确定先生成一小块测试量一下相邻中心间距尖顶情况下水平间距应该是sqrt(3) * size。4.3 输出到 Shapefile 导致字段名截断和中文乱码现象生成的蜂窝要素类属性表里字段名变成HEX_ID_1、HEX_I之类或者中文别名显示为乱码。原因Shapefile 格式限制字段名最长 10 个字符且对 Unicode 支持差。解决输出路径一律指向文件地理数据库.gdb不要用.shp。如果必须用 Shapefile字段名控制在 10 字符以内别名用英文。4.4 范围太大导致内存溢出或运行超时现象工具箱跑到一半报内存错误或者进度条卡住几十分钟不动。原因size设得太小、范围太大六边形数量达到百万级arcpy逐面构造 Polygon 时内存扛不住。解决先估算六边形数量公式是(范围面积) / (六边形面积)六边形面积约2.598 * size^2。如果超过 50 万考虑放大size或分块生成再合并。分块时注意块与块之间要留重叠带避免接缝处出现半截六边形。4.5 邻接分析时发现六边形有重叠现象做Polygon Neighbors或空间连接时发现某些六边形互相重叠或者同一个六边形被重复计数。原因行偏移量算错奇数行偏移了dx而不是dx/2导致相邻行六边形错位重叠。解决检查中心点计算代码里x_offset的值尖顶情况下应该是dx / 2平顶情况下y_offset应该是dy / 2。生成后用Intersect工具自查如果结果非空说明有重叠需要修正偏移逻辑重新生成。5. 进阶用法把蜂窝渔网接进空间统计与制图流程蜂窝图生成只是第一步真正体现价值的是后续怎么用。一个高频场景是空间聚合统计把点数据比如 POI、采样点按六边形分组计数得到每个六边形的密度值再拿去做热力图或聚类分析。做法是用Spatial Join把点要素连接到六边形上match_option选CONTAINS然后按HEX_ID分组统计。# 把 POI 点空间连接到六边形统计每个六边形内的点数 arcpy.SpatialJoin_analysis( target_featureshex_grid_clipped, join_featurespoi_points, out_feature_classhex_with_count, join_operationJOIN_ONE_TO_ONE, join_typeKEEP_ALL, match_optionCONTAINS ) # 此时属性表里 Join_Count 字段就是每个六边形的点数join_typeKEEP_ALL保证没有点的六边形也保留Join_Count为 0。这一步之后可以拿Join_Count做分级设色或者导出到其他工具做空间自相关分析。六边形的邻接关系比方格更均匀做 Morans I 或 Getis-Ord Gi* 时结果更稳这是蜂窝图在空间统计里的核心优势。另一个场景是遥感影像分块采样。把蜂窝渔网叠在影像上每个六边形作为一个采样单元提取六边形范围内的像元均值。用Zonal Statistics as Table工具zone_field选HEX_IDstatistics_type选MEAN输出表格再连接回六边形属性表。这样得到的采样数据在空间上分布均匀不会像方格那样在方向上产生系统性偏差。# 按六边形分区统计栅格均值 arcpy.gp.ZonalStatisticsAsTable( in_zone_datahex_grid_clipped, zone_fieldHEX_ID, in_value_rasterndvi.tif, out_tablehex_ndvi_stats, statistics_typeMEAN )zone_field必须是整型字段HEX_ID如果生成时是字符串要先转成整型。statistics_type除了MEAN还可以选SUM、MAX、MIN、STD按分析目标定。输出表格用HEX_ID和六边形做Join就能在地图上按 NDVI 均值设色。最后说一个我自己的习惯每次生成蜂窝后先跑一遍Check Geometry和Repair Geometry再跑Polygon Neighbors确认邻接数。这三步加起来不到一分钟但能挡掉后面九成的玄学问题。从那以后我每次做蜂窝渔网都强制走一遍这个校验流程宁可多花一分钟也不想在空间统计跑完之后才发现几何有毛病。希望帮到你。本文还有配套的精品资源点击获取

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑