如何按指定系数拆分Bounding box为多区域并输出GeoJson格式
边界框网格拆分与GeoJSON输出实现
功能要求
- 输入参数:
- 四个边界坐标:
Northlimit(北界纬度)、Southlimit(南界纬度)、Eastlimit(东界经度)、Westlimit(西界经度) - 拆分系数
Factor:代表经、纬度方向各自的拆分份数,例如Factor=10时最终会生成10×10共100个网格子区域
- 四个边界坐标:
- 输出要求:所有子区域组成的标准GeoJSON格式数据
核心实现逻辑
- 计算单网格步长:分别用东西边界的经度差、南北边界的纬度差除以拆分系数Factor,得到每个网格的经度宽度和纬度高度
- 双重循环遍历生成所有网格:外层循环处理经度方向的网格序列,内层循环处理纬度方向的网格序列,逐个计算每个网格的四个边界值
- 组装为GeoJSON结构:每个网格对应一个Polygon类型的Feature,全部存入FeatureCollection中,最终输出完整的GeoJSON
可运行Python实现代码
import json def split_bbox_to_geojson(Northlimit: float, Southlimit: float, Eastlimit: float, Westlimit: float, Factor: int) -> dict: # 计算单网格经纬度步长 lon_step = (Eastlimit - Westlimit) / Factor lat_step = (Northlimit - Southlimit) / Factor # 初始化GeoJSON根结构 geojson_result = { "type": "FeatureCollection", "features": [] } # 遍历生成所有网格 for lon_idx in range(Factor): grid_west = Westlimit + lon_idx * lon_step grid_east = grid_west + lon_step for lat_idx in range(Factor): grid_south = Southlimit + lat_idx * lat_step grid_north = grid_south + lat_step # 构造闭合多边形坐标,符合GeoJSON规范(坐标顺序为[经度, 纬度],首尾坐标一致) polygon_coords = [[ [grid_west, grid_south], [grid_east, grid_south], [grid_east, grid_north], [grid_west, grid_north], [grid_west, grid_south] ]] # 将当前网格加入要素集合,附带网格索引属性便于后续查询 geojson_result["features"].append({ "type": "Feature", "properties": { "grid_id": f"grid_{lon_idx}_{lat_idx}", "min_lon": grid_west, "max_lon": grid_east, "min_lat": grid_south, "max_lat": grid_north }, "geometry": { "type": "Polygon", "coordinates": polygon_coords } }) return geojson_result # 示例调用,使用你提供的原始边界测试 if __name__ == "__main__": output_geojson = split_bbox_to_geojson( Northlimit=47.808380127, Southlimit=45.8179931641, Eastlimit=10.4920501709, Westlimit=5.9559111595, Factor=10 ) # 导出为本地GeoJSON文件 with open("split_grid_result.geojson", "w", encoding="utf-8") as f: json.dump(output_geojson, f, ensure_ascii=False, indent=2)
注意事项
- GeoJSON的坐标顺序默认是经度在前,纬度在后,不要和常规的lat/lon顺序搞反,否则生成的文件位置会出错
- 如果需要跨国际日期变更线的边界拆分,需要额外处理经度的正负跳转逻辑,上述代码适用于普通的连续经纬度范围
- 你提供的原始边界示例对应瑞士附近的区域,Factor=10拆分后每个网格的大小约为45km×22km,符合预期
内容的提问来源于stack exchange,提问作者Bilal Kamal
相关产品推荐
相关产品推荐

