使用Python实现多边形六边形填充的可用空间模块及函数问询
可用方案汇总
有多个成熟的Python空间工具链可以实现和PostGIS的ST_HexagonGrid一致的多边形区域六边形网格填充能力,以下是最常用的实现方案:
方案1:Uber H3 库(推荐)
H3是工业界应用最广的全球统一六边形格网库,搭配geopandas、shapely可以快速完成需求,生成效率高,格网支持全球唯一编码。
依赖安装命令:pip install h3 geopandas shapely
示例代码:
import geopandas as gpd import h3 from shapely.geometry import Polygon # 读取待填充的多边形矢量,也可直接构造shapely Polygon对象 input_gdf = gpd.read_file("your_polygon.geojson") input_poly = input_gdf.iloc[0].geometry # 定义H3分辨率:数值越大六边形越小,0级边长约110km,10级约150m resolution = 8 # 获取覆盖多边形的所有六边形索引 hex_ids = h3.polyfill(input_poly.__geo_interface__, resolution, geo_json_conformant=True) # 将索引转为六边形矢量面 hex_polygons = [Polygon(h3.h3_to_geo_boundary(h, geo_json=True)) for h in hex_ids] # 转为GeoDataFrame可直接导出或后续分析 hex_gdf = gpd.GeoDataFrame({"hex_id": hex_ids}, geometry=hex_polygons, crs=input_gdf.crs)
方案2:Tobler 库
Tobler是PySAL空间分析生态下的工具库,内置封装好的格网生成接口,代码更简洁。
依赖安装命令:pip install tobler geopandas
示例代码:
import geopandas as gpd from tobler.util import h3fy input_gdf = gpd.read_file("your_polygon.geojson") # 直接传入多边形GeoDataFrame和分辨率即可生成格网 hex_gdf = h3fy(input_gdf, resolution=8)
方案3:自定义边长实现(非固定分辨率)
如果需要自定义六边形边长、不使用H3的固定分辨率体系,可以用pyhexgrid库实现,参数可完全对齐PostGIS的ST_HexagonGrid输出。
依赖安装命令:pip install pyhexgrid geopandas shapely
示例代码:
import geopandas as gpd from pyhexgrid import HexGrid input_gdf = gpd.read_file("your_polygon.geojson") input_poly = input_gdf.iloc[0].geometry # 定义六边形边长(单位和输入坐标系单位一致,如投影坐标系下可设为米),flat_top=True对应PostGIS默认的平顶点六边形 grid = HexGrid(side_length=1000, flat_top=True) # 筛选和输入多边形相交的所有六边形 hex_polygons = grid.get_intersecting_polygons(input_poly) hex_gdf = gpd.GeoDataFrame(geometry=hex_polygons, crs=input_gdf.crs)
补充说明
上述所有方案都支持调整参数匹配尖顶点/平顶点六边形、格网偏移、边长等需求,输出结果可与PostGIS的ST_HexagonGrid完全对齐。
内容的提问来源于stack exchange,提问作者four-eyes
相关产品推荐
相关产品推荐

