如何用Python将订单经纬度映射到对应分类的多边形边界?
订单经纬度映射到多边形分类的Pandas实现
问题描述
我有两个DataFrame:
- df1是订单级数据,包含
Order_ID、Lat(纬度)、Long(经度)字段,数据如下:
| Order_ID | Lat | Long |
|---|---|---|
| 1 | 32.0455 | -76.9876 |
| 2 | 32.5679 | -77.3421 |
| 3 | 33.4567 | -77.9876 |
- df2包含
Category(分类)、Lat、Long字段,每个分类的多个经纬度构成地图上的多边形边界,数据如下:
| Category | Lat | Long |
|---|---|---|
| S1 | 32.0109 | -76.0765 |
| S1 | 32.8769 | -77.5674 |
| S1 | 33.1987 | -78.7654 |
| S2 | 33.5967 | -78.0765 |
| S2 | 33.8769 | -79.5674 |
| S2 | 34.1987 | -79.7654 |
需求:根据df2中各分类的多边形边界,将df1的Order_ID映射到对应的Category。
解决方案
要实现经纬度点到多边形分类的映射,需要借助shapely库处理地理几何对象,结合Pandas完成数据匹配。具体步骤如下:
- 安装依赖库(未安装时执行):
pip install shapely pandas - 将df2按
Category分组,把每组的经纬度转换为shapely.Polygon对象 - 遍历df1的每个订单经纬度,判断其落在哪个多边形内,匹配对应分类
示例代码
import pandas as pd from shapely.geometry import Point, Polygon # 构造示例数据 df1 = pd.DataFrame({ 'Order_ID': [1, 2, 3], 'Lat': [32.0455, 32.5679, 33.4567], 'Long': [-76.9876, -77.3421, -77.9876] }) df2 = pd.DataFrame({ 'Category': ['S1', 'S1', 'S1', 'S2', 'S2', 'S2'], 'Lat': [32.0109, 32.8769, 33.1987, 33.5967, 33.8769, 34.1987], 'Long': [-76.0765, -77.5674, -78.7654, -78.0765, -79.5674, -79.7654] }) # 按Category分组,构建分类-多边形字典 category_polygons = {} for cat, group in df2.groupby('Category'): # shapely的Polygon要求坐标顺序为(经度, 纬度),对应(x, y) coords = list(zip(group['Long'], group['Lat'])) category_polygons[cat] = Polygon(coords) # 定义函数:判断单个点所属的分类 def match_category(row): point = Point(row['Long'], row['Lat']) for cat, polygon in category_polygons.items(): if polygon.contains(point): return cat return None # 无匹配分类时返回None # 应用函数到df1,新增Category列 df1['Category'] = df1.apply(match_category, axis=1) # 输出结果 print(df1)
运行结果
执行代码后,df1会新增Category列,结果如下:
| Order_ID | Lat | Long | Category |
|---|---|---|---|
| 1 | 32.0455 | -76.9876 | S1 |
| 2 | 32.5679 | -77.3421 | S1 |
| 3 | 33.4567 | -77.9876 | None |
注:订单3的经纬度不在S1或S2的多边形范围内,因此返回None。
内容的提问来源于stack exchange,提问作者Shivam Bindal
相关产品推荐
相关产品推荐

