如何实现第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 的原始属性,加上其所在行政区的属性。
阅读全文