Geopandas检查点是否在面内

tyg4sfes  于 2023-04-28  发布在  其他
关注(0)|答案(1)|浏览(324)

我有海洋geopandas,其中包含1个multipolygon(来源:naturalearthdata.com
我还有另一个数据框,其中包含了大量的经度和纬度信息
我想添加一个新列,如果Point在海洋中(在多重多边形内),该列将为True

zipfile = "ne_10m_ocean/ne_10m_ocean.shp"
ocean_gpd = geopandas.read_file(zipfile)

df = pd.DataFrame({
    'lon': [120.0,120.1,120.2,120.3,120.4],
    'lat': [10.0,10.1,10.2,10.3,10.4]
})

for index, row in df.iterrows():
    df.loc[index,'is_ocean'] = ocean_gpd.contains(Point(x['lon'],x['lat'])

但是它太慢了,我试着这样使用lambda函数

df = df.assign(is_ocean = lambda x: ocean_gpd.contains(Point(x['lon'],x['lat']))

但失败,错误为cannot convert the series to <class 'float'>
有谁知道如何在geopandas中做更好的个人点检查?
注意:我刚刚意识到,对于多边形数据,我使用了10m一个(更详细的多边形),如果我使用110m它要好得多,但在未来,也许我需要使用10m

qpgpyjmq

qpgpyjmq1#

你可以这样使用apply

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

ocean_gpd = geopandas.read_file('ne_10m_ocean.shp')

df = pd.DataFrame({
    'lon': [120.0, 120.1, 120.2, 120.3, 120.4],
    'lat': [10.0, 10.1, 10.2, 10.3, 10.4]
})

def in_ocean(row):
    point = Point(row['lon'], row['lat'])
    return ocean_gpd.contains(point).any()

df['is_ocean'] = df.apply(in_ocean, axis=1)

其返回:

lon   lat  is_ocean
0  120.0  10.0     False
1  120.1  10.1     False
2  120.2  10.2     False
3  120.3  10.3     False
4  120.4  10.4     False

相关问题