简体   繁体   English

geopandas指向多边形

[英]geopandas point in polygon

I have a GeoDataFrame of polygons (~30) and a GeoDataFrame of Points (~10k) 我有一个GeoDataFrame的多边形(~30)和一个GeoDataFrame的点(~10k)

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中创建30个新的列(具有适当的多边形名称),如果该点存在于多边形中,则使用简单的布尔值True / False。

As an example, the GeoDataFrame of Polygons is this: 例如,多边形的GeoDataFrame是这样的:

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))

The GeoDataFrame of Points is like this: Points的GeoDataFrame是这样的:

counter     points
   1     ((-0.17987,51.50974))
   2     ((-0.16507,51.50925))

Expected output: 预期产量:

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

But given that I have 30 polygons, I was wondering if there is a better way. 但鉴于我有30个多边形,我想知道是否有更好的方法。 Appreciate any help! 感谢任何帮助!

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: 假设GeoSeries和GeoDataFrames,我会这样做:

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)

And that gives me: 这给了我:

        geometry    bar    foo
A    POINT (3 3)  False  False
B    POINT (8 8)  False   True
C  POINT (11 11)   True   True

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM