首页 > 解决方案 > 过滤多边形内的 GeoPandas 数据框,并从数据框中删除不存在的数据框

问题描述

我有一个 .csv 文件,其中包含一些点(经度、纬度)。我使用以下代码将其转换为 DataFrame 并从 DataFrame 转换为 GeoDataFrame:

CSV 文件:

日期;用户 ID;经度;纬度

2020-01-02;824664;-79.8831613;-2.1811152000000003

2020-03-01;123456;80.8831613;2.1811

2020-01-15;147835;-80.78035200000001;-1.4845725

我用来将 .csv 转换为 gdf ​​的代码:

df = pd.read_csv('datos25.csv', sep=';', low_memory=False, decimal='.')
gdf = geopandas.GeoDataFrame(
      df, geometry=geopandas.points_from_xy(df.Longitud, df.Latitud)) 

然后,我使用这段代码来定义我的多边形,它是一个国家:

world = geopandas.read_file(geopandas.datasets.get_path('naturalearth_lowres'))
ec = world[world.name == 'Ecuador'] 

现在,我想要做的是 gdf ​​中的每个 POINT,验证它是否在多边形/国家中,如果不是,从 DataFrame 中删除该行

例如,在这种情况下,几何列中的第二个值是:

点 (80.8831613 2.1811)

该值所在的行应从数据框中删除,因为它不在多边形/国家中

我怎样才能做到这一点?

标签: python-3.xpandasgeopandas

解决方案


需要空间操作within来识别点几何是否位于多边形几何内。在下面的代码中,所有必要的步骤都是为了识别落在多边形(厄瓜多尔)内的所有点的目标而执行的。在最后一步,创建一个绘图以可视化/检查结果。

import pandas as pd
import geopandas
from shapely.geometry import Point  #Polygon

df = pd.read_csv('ecuador_data.csv', sep=';', low_memory=False, decimal='.')
world = geopandas.read_file(geopandas.datasets.get_path('naturalearth_lowres'))
ecuador = world[world.name == 'Ecuador'] 

# add new column to df
df['withinQ'] = ""

withinQlist = []
for lon,lat in zip(df.Longitude, df.Latitude):
    pt = Point(lon, lat)
    withinQ = pt.within(ecuador['geometry'].values[0])
    #print( withinQ )
    withinQlist.append(withinQ)

# update values in the that column, values: True/False
df['withinQ'] = withinQlist

# uncomment next line to see content of `df`
#print(df)

#          Date  User_ID  Longitude  Latitude  withinQ
# 0  2020-01-02   824664   -79.8832   -2.1811     True
# 1  2020-03-01   123456    80.8832    2.1811    False
# 2  2020-01-15   147835   -80.7804   -1.4845     True

# select points within ecuador, assign to `result_df` dataframe
result_df = df[df.withinQ==True]
# select points outside ecuador, assign to `xresult_df` dataframe
xresult_df = df[df.withinQ==False]

# for checking/visualization, create a plot of relevant geometries
ax1 = ecuador.plot(color='pink')
ax1.scatter(result_df.Longitude, result_df.Latitude, s=50, color='green')
#ax1.scatter(xresult_df.Longitude, xresult_df.Latitude, s=30, color='red')

剧情:

厄瓜多尔

对于生成的 dataframe result_df,其内容将如下所示:

         Date  User_ID  Longitude  Latitude  withinQ
0  2020-01-02   824664   -79.8832   -2.1811     True
2  2020-01-15   147835   -80.7804   -1.4845     True

推荐阅读