python-3.x - 过滤多边形内的 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)
该值所在的行应从数据框中删除,因为它不在多边形/国家中
我怎样才能做到这一点?
解决方案
需要空间操作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
推荐阅读
- r - 使用 dplyr 1.0.0 绕过 for 循环
- javascript - 世博会相机第一次显示黑屏:React-Native
- apache - 子进程的 LLVM 分析
- amazon-web-services - 在主动-被动故障转移的情况下,被动 EC2 实例如何工作?
- python - 我可以使用 python 在 onedrive 上编辑 excel 文件吗?
- python - 如何在python中合并dict的dict
- google-cloud-platform - 如何在没有 GPU 的 GCP 实例上运行 Parsec 流服务?(错误代码 15000)
- node.js - 在 Req 中是安全的 JWT 存储吗?会议?
- node.js - 无法执行发布
- elasticsearch - 使用 filebeat/logstash 合并两个日志文件