问题描述
我有一个多边形的GeoDataFrame(〜30)和一个点的GeoDataFrame(〜10k)
I have a GeoDataFrame of polygons (~30) and a GeoDataFrame of Points (~10k)
我要在我的Point GeoDataFrame中创建30个新列(使用适当的多边形名称),如果该点存在于多边形中,则使用简单的布尔值True/False来创建.
I'm looking to create 30 new columns (with appropriate polygon names) in my GeoDataFrame of Points with a simple boolean True/False if the point is present in the polygon.
例如,多边形的GeoDataFrame是这样的:
As an example, the GeoDataFrame of Polygons is this:
id geometry
foo POLYGON ((-0.18353,51.51022, -0.18421,51.50767, -0.18253,51.50744, -0.1794,51.50914))
bar POLYGON ((-0.17003,51.50739, -0.16904,51.50604, -0.16488,51.50615, -0.1613,51.5091))
点的GeoDataFrame是这样的:
The GeoDataFrame of Points is like this:
counter points
1 ((-0.17987,51.50974))
2 ((-0.16507,51.50925))
预期输出:
counter points foo bar
1 ((-0.17987,51.50974)) False False
1 ((-0.16507,51.50925)) False False
我可以通过以下方式手动执行此操作:
I can do this manually by:
foo = df_poly.loc[df_poly.id=='foo']
df_points['foo'] = df_points['points'].map(lambda x: True if foo.contains(x).any()==True else False
但是考虑到我有30个多边形,我想知道是否有更好的方法.感谢任何帮助!
But given that I have 30 polygons, I was wondering if there is a better way.Appreciate any help!
推荐答案
不是很清楚您实际上拥有哪种数据结构.另外,您所有的预期结果都是False,因此很难检查.假设使用GeoSeries和GeoDataFrames,我将执行以下操作:
Not really clear what kind of data structures you actually have. Also, all your expected results are False, so that's kind of hard to check. Assuming GeoSeries and GeoDataFrames, I would do this:
from shapely.geometry import Point, Polygon
import geopandas
polys = geopandas.GeoSeries({
'foo': Polygon([(5, 5), (5, 13), (13, 13), (13, 5)]),
'bar': Polygon([(10, 10), (10, 15), (15, 15), (15, 10)]),
})
_pnts = [Point(3, 3), Point(8, 8), Point(11, 11)]
pnts = geopandas.GeoDataFrame(geometry=_pnts, index=['A', 'B', 'C'])
pnts = pnts.assign(**{key: pnts.within(geom) for key, geom in polys.items()})
print(pnts)
那给了我
geometry bar foo
A POINT (3 3) False False
B POINT (8 8) False True
C POINT (11 11) True True
这篇关于多边形中的geopandas点的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!