如何实现第16章所述的空间连接(Spatial Join)的高级应用?
摘要:layout: default title: "第16章:空间连接(Spatial Join)" 第16章:空间连接(Spatial Join) 空间连接是地理空间分析中最常用的操作之一。
第16章:空间连接(Spatial Join)
空间连接是地理空间分析中最常用的操作之一。它根据两组地理要素之间的空间关系(如相交、包含、邻近等),将一个 GeoDataFrame 的属性信息关联到另一个 GeoDataFrame 上。本章将全面介绍 GeoPandas 中 sjoin() 和 sjoin_nearest() 的使用方法、参数配置与性能优化策略。
16.1 空间连接概述
16.1.1 什么是空间连接
空间连接(Spatial Join)是指根据两个数据集中要素之间的空间关系,将一方的属性附加到另一方的过程。与 pandas 中基于列值的 merge() 类似,空间连接基于 几何对象的空间关系 进行匹配。
例如:
将每个 POI(兴趣点)关联到它所在的行政区
将建筑物关联到其所在的洪水风险区域
将交通事故关联到最近的道路段
16.1.2 空间连接与属性连接的区别
特征
属性连接(merge)
空间连接(sjoin)
连接依据
列值匹配
空间关系匹配
输入数据
DataFrame / GeoDataFrame
两个 GeoDataFrame
匹配方式
精确值匹配或键值匹配
几何关系判定
典型场景
合并统计表
点落入多边形分析
性能影响
取决于数据量
取决于几何复杂度与空间索引
16.1.3 空间连接的工作流程
空间连接通常经过以下步骤:
空间索引过滤:利用 R-tree 快速筛选可能匹配的候选要素对
精确谓词判定:对候选对执行精确的空间关系判断(如 intersects、within)
属性合并:将匹配要素的属性按指定方式合并到结果中
import geopandas as gpd
from shapely.geometry import Point, Polygon
# 创建点数据 - POI
pois = gpd.GeoDataFrame({
'poi_name': ['商场A', '学校B', '医院C', '公园D', '餐厅E'],
'category': ['商业', '教育', '医疗', '休闲', '餐饮'],
'geometry': [
Point(116.40, 39.92), Point(116.42, 39.94),
Point(116.38, 39.90), Point(116.44, 39.96),
Point(116.41, 39.93)
]
}, crs="EPSG:4326")
# 创建面数据 - 行政区
districts = gpd.GeoDataFrame({
'district': ['朝阳区', '海淀区'],
'geometry': [
Polygon([(116.39, 39.91), (116.45, 39.91),
(116.45, 39.97), (116.39, 39.97)]),
Polygon([(116.36, 39.88), (116.41, 39.88),
(116.41, 39.93), (116.36, 39.93)])
]
}, crs="EPSG:4326")
print("POI 数据:")
print(pois)
print("\n行政区数据:")
print(districts)
16.2 sjoin() 基础用法
16.2.1 基本语法
sjoin() 是 GeoPandas 提供的空间连接函数,基本语法如下:
geopandas.sjoin(left_df, right_df, how='inner', predicate='intersects')
也可以使用 GeoDataFrame 的方法形式:
left_df.sjoin(right_df, how='inner', predicate='intersects')
16.2.2 最简单的空间连接
# 将 POI 与行政区进行空间连接
result = gpd.sjoin(pois, districts, how='inner', predicate='intersects')
print(result)
输出结果将包含每个 POI 的原始属性,加上其所在行政区的属性。
