如何基于经纬度点、投影及英里距离创建边界框筛选GeoDataFrame数据
准确生成英里范围正方形边界框并筛选GeoDataFrame点数据
核心思路
摒弃近似值方案,通过坐标投影转换+精准单位计算生成边界框:先将WGS84经纬度点转换到以英里(或可转英里的线性单位)为基准的投影坐标系,在投影空间内扩展指定英里数得到正方形边界,再用该投影后的边界框筛选同投影下的GeoDataFrame数据,最后按需转回WGS84坐标系。
具体实现代码
import geopandas as gpd from shapely.geometry import Point, box from pyproj import CRS, Transformer # ---------------------- 配置参数 ---------------------- # 目标经纬度点 target_lat, target_lng = 34.0522, -118.2437 # 示例:洛杉矶坐标 # 搜索半径(英里) search_radius = 10 # 目标投影CRS(以加州平面坐标系EPSG:2230为例,单位为英尺,需转英里) target_crs = CRS.from_epsg(2230) # WGS84坐标系(原始经纬度默认用这个) wgs84_crs = CRS.from_epsg(4326) # ---------------------- 坐标转换与边界框生成 ---------------------- # 1. 将原始经纬度点转换到目标投影坐标系 # always_xy=True 确保输入顺序为(lng, lat),符合GIS标准 to_proj_transformer = Transformer.from_crs(wgs84_crs, target_crs, always_xy=True) proj_x, proj_y = to_proj_transformer.transform(target_lng, target_lat) # 2. 转换单位并计算边界框(EPSG:2230为英尺单位,转英里需除以5280) proj_x_miles = proj_x / 5280 proj_y_miles = proj_y / 5280 # 正方形边界:上下左右各扩展10英里 min_x = proj_x_miles - search_radius max_x = proj_x_miles + search_radius min_y = proj_y_miles - search_radius max_y = proj_y_miles + search_radius # 将英里单位的边界转回目标投影的原始单位(英尺) min_x_proj = min_x * 5280 max_x_proj = max_x * 5280 min_y_proj = min_y * 5280 max_y_proj = max_y * 5280 # 创建投影坐标系下的边界框几何对象 bbox_proj = box(min_x_proj, min_y_proj, max_x_proj, max_y_proj) # ---------------------- 筛选GeoDataFrame数据 ---------------------- # 将原始GeoDataFrame转换到目标投影 gdf_proj = gdf.to_crs(target_crs) # 筛选落在边界框内的点 filtered_gdf_proj = gdf_proj[gdf_proj.geometry.within(bbox_proj)] # 按需转回WGS84经纬度坐标系 filtered_gdf = filtered_gdf_proj.to_crs(wgs84_crs)
关键注意事项
- 投影CRS选择:优先选用覆盖目标区域的本地投影(如UTM分带、州平面坐标系),确保线性单位准确。若使用米单位CRS,直接将英里转米(1英里=1609.34米)计算即可,无需转英尺。
- 坐标顺序:
Transformer.transform默认要求输入为(lng, lat),必须添加always_xy=True避免顺序错误。 - 统一投影筛选:必须将GeoDataFrame与边界框统一到同一投影坐标系后再筛选,否则会出现计算误差。
内容的提问来源于stack exchange,提问作者user17130
相关产品推荐
相关产品推荐

