如何为GeoDataFrame中的点匹配对应英国NUTS1区域名称?
给地理空间新手的解决方案:匹配点到英国NUTS1区域
作为刚接触地理空间数据的新手,手动用Shapely遍历每个点确实容易碰壁——其实GeoPandas内置的空间连接功能就能完美解决这个问题,效率比手动循环高得多,而且代码也简洁。下面是具体的步骤:
1. 确保你的点数据格式正确
首先要确认你的GeoDataFrame有正确的地理几何对象和坐标系:
- 如果你用的是单独的
Lat(纬度)和Long(经度)列,需要先把它们转换成geometry列:
import geopandas as gpd from shapely.geometry import Point # 假设你的点数据存储在变量points_gdf中 points_gdf['geometry'] = points_gdf.apply(lambda row: Point(row['Long'], row['Lat']), axis=1) # 设置坐标系为WGS84(全球通用的经纬度坐标系,EPSG代码4326) points_gdf = points_gdf.set_crs(epsg=4326)
- 如果你的数据已经有
geometry列,先检查坐标系是否正确:
print(points_gdf.crs)
输出应该包含EPSG:4326或者和你的NUTS1 GeoJSON一致的坐标系代码。
2. 加载并预处理NUTS1区域数据
加载你的英国NUTS1 GeoJSON文件,同时精简数据只保留需要的列(区域名称和几何对象):
# 替换成你的GeoJSON文件路径 nuts1_gdf = gpd.read_file('your_nuts1_data.geojson') # 只保留区域名称列和几何列,减少数据量 nuts1_gdf = nuts1_gdf[['nuts118nm', 'geometry']] # 确保NUTS1数据的坐标系和点数据一致,如果不一致就转换 if nuts1_gdf.crs != points_gdf.crs: nuts1_gdf = nuts1_gdf.to_crs(points_gdf.crs)
3. 空间连接:自动匹配点到所属区域
用GeoPandas的sjoin方法(空间连接),自动把每个点匹配到对应的NUTS1区域:
# 空间连接:how='left'表示保留所有点数据,op='within'表示匹配"点在多边形内"的关系 joined_gdf = gpd.sjoin(points_gdf, nuts1_gdf, how='left', op='within') # 把匹配到的区域名称列重命名为更直观的名字,比如'region_name' joined_gdf = joined_gdf.rename(columns={'nuts118nm': 'region_name'}) # 处理不在任何NUTS1区域内的点(比如英国境外的点),填充默认值 joined_gdf['region_name'] = joined_gdf['region_name'].fillna('Unknown')
为什么不用手动遍历?
手动循环每个点调用Shapely的contains方法不仅代码繁琐,而且当你的点数据量很大时(比如上万条),速度会非常慢。GeoPandas的空间连接是基于底层优化的矢量数据处理逻辑,效率会高很多,同时也能避免手动循环可能出现的错误。
内容的提问来源于stack exchange,提问作者REESJ
相关产品推荐
相关产品推荐

