2026/2/23 15:37:10
网站建设
项目流程
linux wordpress 权限设置,东莞seo 公司,网站开发年收入,教育平台小程序Python GIS神器#xff1a;一行代码搞定空间数据匹配#xff08;Point in Polygon#xff09;——tablegis库match_layer详解
前言
在数据分析、城市规划、物流配送、网格管理等领域#xff0c;我们经常遇到这样的需求#xff1a;
城市规划/地产#xff1a;手头有一堆POI…Python GIS神器一行代码搞定空间数据匹配Point in Polygon——tablegis库match_layer详解前言在数据分析、城市规划、物流配送、网格管理等领域我们经常遇到这样的需求城市规划/地产手头有一堆POI兴趣点经纬度想知道它们分别属于哪个行政区、哪个商圈物流/外卖成千上万个订单地址如何快速划分到不同的配送站或责任网格环保/气象监测站点数据如何对应到具体的流域或气象分区在GIS地理信息系统中这叫做**空间连接Spatial Join或点在多边形内Point in Polygon**的问题。通常我们需要安装庞大的ArcGIS/QGIS软件或者编写复杂的Geopandas/Shapely代码来处理。今天介绍一个Python库tablegis它封装了这些复杂操作让你一行代码就能完成空间匹配并且支持处理一对多一个点在多个区域重叠的复杂情况。1. 安装与准备首先确保你的Python环境已经安装了tablegis。pipinstalltablegis准备工作你需要两份数据点数据DataFrame包含经纬度的表格如Excel、CSV比如店铺列表、订单记录。面数据GeoDataFrame/Shapefile包含区域边界的矢量数据比如行政区划、网格围栏。2. 核心方法match_layermatch_layer是tablegis的核心功能之一用于将“面数据”的属性“挂”到“点数据”上。函数签名importtablegisastg resulttg.match_layer(df,# 你的点数据DataFramelayer,# 你的面数据GeoDataFrame 或 shp文件路径lonlon,# 点数据中经度列名latlat,# 点数据中纬度列名columnsNone,# 你想获取面数据里的哪些列比如 district_name, zone_iddefault_valueNone,# 如果点不在任何区域内填什么值比如 未知区域match_methodone,# 匹配模式one (取第一个), multi_cell (合并), multi_row (炸裂)sep;,# 当 match_methodmulti_cell 时的分隔符predicateintersects# 空间关系通常用默认的即可)3. 实战案例场景一城市规划/商业分析 - 确定店铺所属行政区假设你有一个店铺列表shops.csv和北京市行政区划beijing_districts.shp。需求给每个店铺加上“所属区县”字段。importpandasaspdimportgeopandasasgpdimporttablegisastg# 1. 读取数据df_shopspd.read_csv(shops.csv)# 假设数据长这样# | shop_name | longitude | latitude |# |-----------|-----------|----------|# | 肯德基A店 | 116.40 | 39.90 |gdf_districtsgpd.read_file(beijing_districts.shp)# 假设数据长这样带有geometry# | district_name | district_code | geometry |# |---------------|---------------|----------|# | 朝阳区 | 110105 | POLYGON...|# 2. 一行代码匹配# 我们想要 district_name 这一列resulttg.match_layer(df_shops,gdf_districts,lonlongitude,latlatitude,columns[district_name])print(result)# 结果会自动添加 district_name 列# | shop_name | longitude | latitude | district_name |# |-----------|-----------|----------|---------------|# | 肯德基A店 | 116.40 | 39.90 | 东城区 |场景二物流配送 - 处理重叠区域一对多匹配有时候区域是重叠的。比如一个快递点可能同时属于“朝阳区”和“CBD商圈”两个图层要素如果它们在同一个图层里或者在网格管理中边界处的点可能算作两个网格的重叠区。需求如果一个点落在两个区域里我要把两个区域的名字都记下来用分号隔开。# 使用 match_methodmulti_cellresulttg.match_layer(df_shops,gdf_zones,columns[zone_name],match_methodmulti_cell,# 关键参数合并单元格sep;# 分隔符)# 结果# | shop_name | zone_name |# |-----------|-----------------|# | 某某店铺 | 责任区A;责任区B |场景三数据清洗 - 找出不在服务区的数据需求找出所有不在任何服务范围内的订单标记为“超区”。# 使用 default_valueresulttg.match_layer(df_orders,gdf_service_areas,columns[station_name],default_value超区# 关键参数缺失填充)# 结果# | order_id | station_name |# |----------|--------------|# | 1001 | 望京站 |# | 1002 | 超区 |场景四精细化分析 - 一行拆多行Explode需求如果一个点属于多个区域我希望它变成多行数据每一行对应一个区域方便后续透视表统计。# 使用 match_methodmulti_rowresulttg.match_layer(df_points,gdf_layers,columns[type],match_methodmulti_row# 关键参数多行炸裂)# 原始数据1行 - 结果可能变2行4. 参数详解速查表参数类型默认值说明dfDataFrame必填你的左表点数据。layerGeoDataFrame/str必填你的右表面数据可以是变量也可以是文件路径。lon/latstr‘lon’/‘lat’指定df中经纬度的列名。columnslist/strNone最重要指定要从layer中获取哪些属性列。不填则获取除geometry外的所有列。default_valueanyNone当点不在任何面上时新列填充的值默认是NaN。match_methodstr‘one’‘one’: 随便取一个匹配到的默认‘multi_cell’: 匹配到多个时将值合并成字符串如 “A,B”‘multi_row’: 匹配到多个时复制该行数据产生多行。sepstr‘;’当模式为 ‘multi_cell’ 时的连接符。总结tablegis.match_layer是一个非常适合非GIS专业背景开发者使用的工具。它屏蔽了坐标系转换自动处理EPSG:4326、空间索引构建等底层细节让你能像用Excel的VLOOKUP一样轻松实现“空间VLOOKUP”。无论你是做数据清洗、特征工程还是地理分析这个函数都能极大地提高效率。本文基于 tablegis 库编写欢迎在 PyPI 下载使用。