You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

点数据匹配美国州地理区域:多边形内点判断及映射问题

问题分析与修正代码

你的代码存在几个关键问题:

  • 函数参数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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 22:40:32