Python PANDAS-GEOPANDAS:形状文件中点的本地化

Python PANDAS-GEOPANDAS:形状文件中点的本地化,python,pandas,geolocation,shapefile,geopandas,Python,Pandas,Geolocation,Shapefile,Geopandas,使用pandas和geopandas,我想定义一个应用于数据帧每一行的函数,其操作如下: 输入:带坐标的列 输出:点所在的区域 我试过了,但花了很长时间 def zone_assign(point,zones,codes): try: zone_label=zones[zones['geometry'].contains(point)][codes].values[0] except: zone_label=np.NaN return(zo

使用pandas和geopandas,我想定义一个应用于数据帧每一行的函数,其操作如下: 输入:带坐标的列 输出:点所在的区域

我试过了,但花了很长时间

def zone_assign(point,zones,codes):
    try:
        zone_label=zones[zones['geometry'].contains(point)][codes].values[0]
    except:
        zone_label=np.NaN
    return(zone_label)
其中: 点是包含地理坐标的行的单元格; zones是随geopandas导入的形状文件;
代码是shapefile的列,其中包含要分配给该点的标签。

答案的一部分取自我前面的另一个答案

您的情况看起来像是
空间联接
非常有用的典型情况。空间连接的思想是使用地理坐标而不是属性来合并数据

geopandas
中的三种可能性:

  • 相交
  • 包含
您似乎希望
包含
,可以使用以下语法:

geopandas.sjoin(多边形、点、how=“inner”、op='contains')
注意:您需要安装
rtree
才能执行此类操作。如果需要安装此依赖项,请使用
pip
conda
安装它

实例 作为例子,让我们随机抽取相关城市和情节国家。这两个示例数据集是

import geopandas
将matplotlib.pyplot作为plt导入
world=geopandas.read\u文件(geopandas.dataset.get\u路径('naturalearth\u lowres'))
cities=geopandas.read_文件(geopandas.dataset.get_路径('naturalearth_cities'))
城市=城市。样本(n=50,随机状态=1)
世界银行行长(2)
流行大陆名称iso_a3 gdp_md_est几何体
0 920938大洋洲斐济FJI 8374.0多边形((180.00000-16.06713180.00000。。。
153950935非洲坦桑尼亚TZA 150600.0多边形((33.90371-0.95000,34.07262-1.05982。。。
城市。负责人(3)
命名几何体
196波哥大角(-74.08529 4.59837)
95第比利斯点(44.78885 41.72696)
173首尔点(126.99779 37.56829)
world
是一个全球数据集,
cities
是一个子集

两个数据集需要位于同一投影系统中。如果不是,请在合并前使用
。以\u crs

data\u merged=geopandas.sjoin(国家、城市,how=“内部”,op='contains')
最后,为了查看结果,让我们绘制一张地图

f,ax=plt.子批次(1,figsize=(20,10))
数据图(轴=轴)
国家。绘图(轴=轴,α=0.25,线宽=0.1)
plt.show()
底层数据集将我们需要的信息合并在一起

数据合并头(2)
最流行的大陆名称左iso a3 gdp最流行的几何索引右名称右
7 6909701大洋洲巴布亚新几内亚巴布亚新几内亚28020.0多边形((141.00021-2.60015,142.73525…59莫尔兹比港
944293293南美洲阿根廷阿尔格879400.0多边形((-68.63401-52.6363637,-68.25000…182布宜诺斯艾利斯

在这里,我使用了
internal
join方法,但这是一个可以更改的参数,例如,如果您希望保留所有点,包括不在多边形内的点。

您正在查找
geopandas.sjoin
()因此,在您的示例中,您将城市与国家关联。要将国家与城市关联,我应该使用类似的方法吗?data\u merged=geopandas.sjoin(cities,countries,how=“inner”,op='inner')例如,在cites数据集中,我想在“布宜诺斯艾利斯”行中添加一个单元格“阿根廷”。是的,我认为应该可以。在这种情况下,
data\u merged=geopandas.sjoin(cities,countries,how=“internal”,op='intersects')
也可能产生所需的输出。