首页 编程与开发 Python GeoPandas 缓冲区分析 buffer 的单位为什么不对?投影坐标系是关键

GeoPandas 缓冲区分析 buffer 的单位为什么不对?投影坐标系是关键

作者: GIS研习社 更新时间:2026-05-30 13:49:20 分类:Python

很多人第一次用 GeoPandas 做缓冲区分析时,会写出类似 gdf.buffer(1000) 的代码,然后发现结果不是 1000 米缓冲区,甚至大得离谱。这不是 GeoPandas 算错了,而是坐标系单位没有弄清楚。

buffer 使用的是坐标单位

GeoPandas 的 buffer 方法并不知道你心里想的是“米”还是“公里”,它只会使用当前几何坐标的单位。如果数据是 EPSG:4326,也就是常见的 WGS84 经纬度坐标,单位是“度”。此时 buffer(1000) 表示 1000 度,结果当然不合理。

正确流程

标准做法是先确认原始 CRS,再转换到适合研究区的投影坐标系,做完缓冲后视需要转回 WGS84。

import geopandas as gpd

gdf = gpd.read_file("points.geojson")
gdf = gdf.to_crs(epsg=32650)  # 示例:UTM 50N,单位为米
gdf["geometry"] = gdf.buffer(1000)
gdf = gdf.to_crs(epsg=4326)
gdf.to_file("buffer_1km.geojson", driver="GeoJSON")

投影怎么选

如果研究区范围不大,可以使用当地 UTM 分带或地方常用投影。中国区域项目中,也常见 CGCS2000 高斯克吕格投影。不要为了省事直接在经纬度下缓冲,尤其是涉及面积、距离、邻近分析时,误差会非常明显。

排查清单

  • gdf.crs 查看 CRS 是否为空。
  • gdf.total_bounds 判断坐标值像经纬度还是投影坐标。
  • 缓冲前用 to_crs 转到米制投影坐标系。
  • 输出 Web 地图前再转回 EPSG:4326 或 EPSG:3857。

一句话总结:GeoPandas 的距离分析先问坐标系,再写 buffer。这个习惯能避免大量“结果看起来能出图,但数值完全不可信”的问题。