如何为每个点几何创建1英里缓冲区并正确投影到地图
问题根因
代码存在两个核心错误,直接导致缓冲区尺寸异常、显示错位:
- 坐标系方法使用错误:
points_from_xy生成的点来自经纬度字段,原始坐标系为EPSG:4326(WGS84地理坐标系,单位为度),直接调用set_crs("EPSG:6588")只是强行给坐标打上投影坐标系标记,不会做实际坐标转换,相当于把度单位的数值直接当成英尺单位使用,点位完全错位。 - 缓冲区半径单位不匹配:EPSG:6588是适用于德州中部的投影坐标系,单位为美制英尺,代码中传入0.1作为缓冲半径,和1英里的预期完全不符。
修复方案
- 先给原始经纬度点正确标记自身的源坐标系EPSG:4326
- 使用
to_crs方法将点图层、底图图层统一转换到EPSG:6588投影坐标系下(如果底图本身已经是EPSG:6588坐标系,无需重复转换) - 按单位换算缓冲半径:1英里 = 5280美制英尺,传入对应数值生成缓冲区
- 统一坐标系后再绘图,保证图层对齐
修正后可运行代码
import geopandas as gpd import matplotlib.pyplot as plt # 读取/生成点图层,先标记真实源坐标系 gdf_2017 = gpd.GeoDataFrame( df_2017, geometry=gpd.points_from_xy(df_2017.longitude, df_2017.latitude) ) gdf_2017 = gdf_2017.set_crs("EPSG:4326") # 统一转换到EPSG:6588投影坐标系(单位:美制英尺,适合本地距离计算) gdf_2017 = gdf_2017.to_crs("EPSG:6588") # 若底图本身不是EPSG:6588,执行下一行转换;若已是该坐标系可注释跳过 gdf_dem17 = gdf_dem17.to_crs("EPSG:6588") # 生成1英里半径缓冲区(1英里=5280美制英尺) gdf_2017.geometry = gdf_2017.geometry.buffer(5280) # 绘图 fig, ax = plt.subplots(figsize=(12, 10)) gdf_dem17.plot(ax=ax) gdf_2017.plot(ax=ax, color="red", alpha=0.5) plt.show()
关键API说明
set_crs:仅用于给没有坐标系标记的矢量数据标注它本身真实的坐标系,不会修改坐标数值,不能用来做跨坐标系转换to_crs:用于不同坐标系之间的坐标数值转换,所有参与空间计算、叠加绘图的图层必须通过该方法统一到同一坐标系下- 涉及距离、面积的空间计算,必须使用单位为米/英尺等固定长度单位的投影坐标系,禁止使用单位为度的经纬度地理坐标系直接计算
内容的提问来源于stack exchange,提问作者code8848
相关产品推荐
相关产品推荐

