Geopandas用contains判断Shapely点所属巴黎行政区返回空是什么原因
问题原因分析
- 最核心的原因是埃菲尔铁塔点对象和行政区数据的空间参考坐标系(CRS)不匹配,且坐标数值范围完全不重叠:
从输出的行政区数据前两行可以看到,行政区geometry的坐标X轴取值在45万左右,Y轴取值在541万左右,但定义的埃菲尔铁塔点坐标是(255422.6, 6250868.9),二者坐标范围完全没有交集,因此contains判断返回全为False,最终筛选结果为空。 - 具体可能的两种诱因:
- 创建
eiffel_tower时使用的坐标来源和行政区数据坐标系不一致,没有做坐标系转换。比如行政区使用的是巴黎常用的UTM 31N(EPSG:32631)投影坐标,而输入的点坐标可能属于其他投影体系。 - 输入的埃菲尔铁塔坐标数值本身有误:埃菲尔铁塔在UTM 31N坐标系下的真实坐标大致为X:448295、Y:5411935,和行政区数据的坐标范围吻合,当前使用的点坐标数值明显不符合该区间。
- 创建
解决方法
- 首先执行
print(districts.crs)确认行政区数据的坐标系 - 确认埃菲尔铁塔坐标对应的原始坐标系,将点对象转换为和行政区一致的CRS后再做空间判断,示例代码如下:
import geopandas as gpd from shapely.geometry import Point # 示例:如果点的原始坐标是WGS84经纬度(埃菲尔铁塔真实经纬度为2.2945°E, 48.8584°N) eiffel_tower = Point(2.2945, 48.8584) # 给点设置原始CRS gdf_point = gpd.GeoDataFrame(geometry=[eiffel_tower], crs="EPSG:4326") # 转换为行政区的CRS gdf_point = gdf_point.to_crs(districts.crs) # 再做包含判断 mask = districts.contains(gdf_point.geometry.iloc[0]) print(districts[mask])
内容的提问来源于stack exchange,提问作者Ferari
相关产品推荐
相关产品推荐

