点数据匹配美国州地理区域:多边形内点判断及映射问题
问题分析与修正代码
你的代码存在几个关键问题:
- 函数参数
row和遍历dfpoly时的row变量名冲突,导致无法正确引用当前处理的dfpoints行数据 - 错误地用dfpoly的索引去匹配dfpoints的点,应该使用当前传入的dfpoints行中的Point对象
- 匹配成功后返回的是整个
dfpoly['state']列,而非当前匹配的州名 - 未处理点不在任何州多边形内的情况
修正后的基础版本
# 提前把dfpoly里的几何转成Shapely对象,避免每次apply重复转换,提升效率 dfpoly['shapely_geom'] = dfpoly['geometry'].apply(shape) def map_states(row): # 遍历所有州的多边形 for _, poly_row in dfpoly.iterrows(): polygon = poly_row['shapely_geom'] # 检查当前行的Point是否在多边形内 if polygon.contains(row['Point']): # 返回匹配到的州名 return poly_row['state'] # 没有匹配到返回None return None # 应用函数生成states列 dfpoints['states'] = dfpoints.apply(map_states, axis=1)
更高效的优化版本(适合大数据量)
如果你的点数据或州数据量较大,上面的逐行遍历效率会很低,可以用geopandas的空间连接功能,这比手动apply快得多:
import geopandas as gpd # 把dfpoints转成GeoDataFrame gdf_points = gpd.GeoDataFrame(dfpoints, geometry='Point', crs=dfpoly.crs) # 把dfpoly转成GeoDataFrame(如果还不是的话) gdf_poly = gpd.GeoDataFrame(dfpoly, geometry='geometry', crs=dfpoly.crs) # 空间连接,找到每个点所在的州 result = gpd.sjoin(gdf_points, gdf_poly, how='left', predicate='within') # 把州名列提取到原dfpoints dfpoints['states'] = result['state']
关键说明
- 确保
dfpoints中的Point列是Shapely的Point对象,dfpoly的geometry列是GeoJSON格式的几何数据 - 空间连接时要保证两个GeoDataFrame的坐标系(CRS)一致,否则会出错
内容的提问来源于stack exchange,提问作者Electronic_Tear
相关产品推荐
相关产品推荐

