使用 Python 和 GeoJSON 计算多边形的边界框(Bounding Box)

文摘   2024-10-16 19:52   广东  

在地理信息系统 (GIS) 中,边界框 (Bounding Box) 是用来描述一个几何图形的最小矩形区域的。它可以简单地表示为两个坐标:左下角和右上角的点。在这篇文章中,我们将介绍如何使用 Python 的 geojson 库计算一个多边形的边界框。

1 代码实现

下面是一段简单的 Python 代码,它接受一个坐标列表,计算出包含这些坐标的边界框,并返回一个表示这个边界框的字符串:

import geojson
def bbox(coord_list): # 获取所有的x坐标和y坐标 xs, ys = zip(*coord_list) # 计算最小最大值 min_x, max_x = min(xs), max(xs) min_y, max_y = min(ys), max(ys) # 返回边界框 return (min_x, min_y, max_x, max_y)
# 测试数据:一个简单的 GeoJSON 多边形poly = geojson.Polygon([[ (2.38, 57.322), (23.194, -20.28), (-120.43, 19.15), (2.38, 57.322)]])
# 提取坐标coords = list(geojson.utils.coords(poly))
# 计算边界框boundary_box = bbox(coords)
print("边界框:", boundary_box)

2 代码实现

  1. 导入 geojson 模块:我们使用了 geojson 库来处理 GeoJSON 格式的多边形。这是一个非常常见的格式,广泛用于地理数据的表示。

    import geojson
  2. 定义 bbox 函数:该函数接受一个包含坐标的列表(即一个二维点的集合),然后通过按 X 和 Y 坐标分别排序来计算边界框。边界框的 X 维度和 Y 维度分别取最小和最大的值。

    def bbox(coord_list):
      # 获取所有的x坐标和y坐标
      xs, ys = zip(*coord_list)
      # 计算最小最大值
      min_x, max_x = min(xs), max(xs)
      min_y, max_y = min(ys), max(ys)
      # 返回边界框
      return (min_x, min_y, max_x, max_y)
  • 我们分别对 X 坐标和 Y 坐标进行排序。

  • box 存储的是最小 X 坐标到最大 X 坐标,以及最小 Y 坐标到最大 Y 坐标。

  • 最后返回一个表示边界框的数据,格式为 (min_x, min_y, max_x, max_y)

  • 创建一个多边形:我们使用了 geojson.Polygon() 来定义一个 GeoJSON 格式的多边形,该多边形由一组坐标组成。这里的坐标定义了一个简单的闭合多边形,最后一个点与第一个点相同。

    poly = geojson.Polygon([[
      (2.38, 57.322),
      (23.194, -20.28),
      (-120.43, 19.15),
      (2.38, 57.322)
    ]])
  • 计算边界框:我们使用 geojson.utils.coords() 来提取多边形的坐标,并将它们传递给 bbox() 函数进行计算。最后,打印出计算结果。

    # 提取坐标
    coords = list(geojson.utils.coords(poly))

    # 计算边界框
    boundary_box = bbox(coords)

    print("边界框:", boundary_box)
  • 输出结果

    当运行这段代码时,输出如下:


    (-120.43 -20.28, 23.194 57.322)

    这个输出表示的是该多边形的边界框,左下角的坐标为 (-120.43, -20.28),右上角的坐标为 (23.194, 57.322)

    3 使用 Folium 进行可视化

    部分代码如下:

    import folium
    # 创建一个地图,中心点设置为多边形的大致中心位置center_lat = sum([coord[1] for coord in coords]) / len(coords)center_lon = sum([coord[0] for coord in coords]) / len(coords)m = folium.Map(location=[center_lat, center_lon], zoom_start=4)
    # 将GeoJSON数据添加到地图上folium.GeoJson(poly).add_to(m)
    # 显示地图(如果你在Jupyter环境中)m


    4 完整代码


    import geojsonimport folium
    def bbox(coord_list): # 获取所有的x坐标和y坐标 xs, ys = zip(*coord_list) # 计算最小最大值 min_x, max_x = min(xs), max(xs) min_y, max_y = min(ys), max(ys) # 返回边界框 return (min_x, min_y, max_x, max_y)
    # 测试数据:一个简单的 GeoJSON 多边形poly = geojson.Polygon([[ (2.38, 57.322), (23.194, -20.28), (-120.43, 19.15), (2.38, 57.322)]])
    # 提取坐标coords = list(geojson.utils.coords(poly))
    # 计算边界框boundary_box = bbox(coords)
    print("边界框:", boundary_box)
    # 创建一个地图,中心点设置为多边形的大致中心位置center_lat = sum([coord[1] for coord in coords]) / len(coords)center_lon = sum([coord[0] for coord in coords]) / len(coords)m = folium.Map(location=[center_lat, center_lon], zoom_start=4)
    # 将GeoJSON数据添加到地图上folium.GeoJson(poly).add_to(m)
    # 添加边界框到地图folium.Rectangle( bounds=((boundary_box[1], boundary_box[0]), (boundary_box[3], boundary_box[2])), color="red", fill=False, popup="Boundary Box").add_to(m)
    # 显示地图(如果你在Jupyter环境中)m
    # 保存地图为HTML文件(可选)m.save("polygon_with_bbox_map.html")

    5 总结

    通过这段简短的代码,我们展示了如何使用 Python 计算 GeoJSON 多边形的边界框。

    曾经我使用这段代码将矢量文件转为yolo样本,今天把部分的过程记录下来。

    至于folium的可视化的内容,是为了写这篇博客而增加的部分。




    往期文章回顾

    避免 Python 中 GDAL/OGR 绑定导致的崩溃

    从原图中提取GPS信息并创建Shapefile(第5版)| 把文件名字写入shp、txt

    这么多年下来,我确实是没处理过modis影像 | hdf格式转为tif格式

    为什么我经常使用python,原因在于Python 是地理信息系统(GIS)和遥感领域的热门编程语言。

    在Ubuntu 24.04系统上安装Rust编程语言环境

    从原图中提取GPS信息并创建Shapefile(第四版)允许文件夹里同时存在原图、非原图



    remote sensing
    一个专注于测绘、地信、遥感的公众号
     最新文章