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

Posted

技术标签:

【中文标题】PANDAS-GEOPANDAS:形状文件中点的本地化【英文标题】:PANDAS-GEOPANDAS: Localization of points in a shapefile 【发布时间】:2020-04-16 14:51:17 【问题描述】:

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

我试过这个,但需要很长时间。

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)

在哪里: point 是包含地理坐标的行的单元格; zone 是使用 geopandas 导入的 shapefile; code 是 shapefile 的列,其中包含要分配给该点的标签。

【问题讨论】:

你在找geopandas.sjoin.(geopandas.readthedocs.io/en/stable/mergingdata.html) 【参考方案1】:

部分答案,取自我之前的另一个答案that needed within rather than contains

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

geopandas中的三种可能:

intersects within contains

您似乎想要contains,可以使用以下语法:

geopandas.sjoin(polygons, points, how="inner", op='contains')

注意:您需要安装rtree 才能执行此类操作。如果需要安装这个依赖,使用pip或者conda来安装

示例

作为示例,让我们随机抽取城市样本并绘制相关的国家/地区。这两个示例数据集是

import geopandas
import matplotlib.pyplot as plt

world = geopandas.read_file(geopandas.datasets.get_path('naturalearth_lowres'))
cities = geopandas.read_file(geopandas.datasets.get_path('naturalearth_cities'))
cities = cities.sample(n=50, random_state=1)

world.head(2)

    pop_est     continent   name    iso_a3  gdp_md_est  geometry
0   920938  Oceania     Fiji    FJI     8374.0  MULTIPOLYGON (((180.00000 -16.06713, 180.00000...
1   53950935    Africa  Tanzania    TZA     150600.0    POLYGON ((33.90371 -0.95000, 34.07262 -1.05982...


cities.head(3)
    name    geometry
196     Bogota  POINT (-74.08529 4.59837)
95  Tbilisi     POINT (44.78885 41.72696)
173     Seoul   POINT (126.99779 37.56829)

world 是一个全球数据集,cities 是一个子集。

两个数据集需要在同一个投影系统中。如果没有,请在合并前使用.to_crs

data_merged = geopandas.sjoin(countries, cities, how="inner", op='contains')

最后,看看结果,让我们做一张地图

f, ax = plt.subplots(1, figsize=(20,10))
data_merged.plot(axes=ax)
countries.plot(axes=ax, alpha=0.25, linewidth=0.1)
plt.show()

并且底层数据集将我们需要的信息合并在一起

data_merged.head(2)

    pop_est     continent   name_left   iso_a3  gdp_md_est  geometry    index_right     name_right
7   6909701     Oceania     Papua New Guinea    PNG     28020.0     MULTIPOLYGON (((141.00021 -2.60015, 142.73525 ...   59  Port Moresby
9   44293293    South America   Argentina   ARG     879400.0    MULTIPOLYGON (((-68.63401 -52.63637, -68.25000...   182     Buenos Aires

在这里,我使用了inner 连接方法,但如果您想保留所有点,包括不在多边形内的点,您可以更改该参数。

【讨论】:

因此,在您的示例中,您将城市与国家/地区相关联。为了将国家与城市联系起来,我应该使用类似的东西吗? data_merged = geopandas.sjoin(cities, countries, how="inner", op='within') 例如。在引用数据集中,我想在“布宜诺斯艾利斯”行中添加一个单元格“阿根廷” 是的,我认为应该没问题。 data_merged = geopandas.sjoin(cities, countries, how="inner", op='intersects') 在这种情况下也可能产生所需的输出。

以上是关于PANDAS-GEOPANDAS:形状文件中点的本地化的主要内容,如果未能解决你的问题,请参考以下文章

R语言自定义ggpot2可视化结果中点形状大小色彩填充色边框线类型边框线色彩点样式pch(plot characters)自定义的核心函数

R语言自定义ggpot2可视化结果中点形状大小色彩填充色边框线类型边框线色彩点样式pch(plot characters)自定义的核心函数

R语言自定义ggpot2可视化结果中点形状大小色彩填充色边框线类型边框线色彩点样式pch(plot characters)自定义的核心函数

R语言ggplot2可视化分组散点图将图例放置在图像内部的指定区域自定义缩放图例中点形状pch的大小(增大或者缩小)change size of shape elements

声测管应用领域

3D,点云重建