GeoPandas中点在多边形内的判断

33

我有一个包含多边形的GeoDataFrame(约30个)和一个包含点的GeoDataFrame(约10k个)。

我希望在我的点的GeoDataFrame中创建30个新列(带有适当的多边形名称),如果该点位于多边形中,则为简单布尔值True/False。

举个例子,这是多边形的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))

点的 GeoDataFrame 如下所示:

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

我可以通过手动方式完成此操作:

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个多边形,我想知道是否有更好的方法。感谢任何帮助!


简化几何图形,以便我可以将其复制/粘贴到笔记本中。 - Paul H
@PaulH 已更新问题并提供了多边形的详细信息。如果这样可以,请告诉我。 - Kvothe
1个回答

45

不太清楚您实际拥有哪些数据结构。此外,您所有的预期结果都是False,这让检查变得有点困难。假设您拥有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)

那给了我:

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

啊哈,很好地运用了 melt。谢谢! - WGS
3
@pksingh,“shapely”的一个重要细微之处是它用于几何而不是地理操作。换句话说,Polygon([(90,0),(0,180),(0,-180)]是一个三角形,而不是半球体。 - Paul H
谢谢@PaulH,有没有直接的方法呢? - jolly
@Jolly,你需要将你的纬度/经度投影到UTM或其他投影坐标系中。顺便问一下,“fails”的意思是什么?您是指引发了一个错误还是返回了一个意外的结果?在平面坐标中,您的点位于三角形之外。 - Paul H
谢谢@PaulH,Fail确实是你说的。问题是点确实在2D三角形外面。但是有没有办法检查它是否在3D三角形内部? - jolly
显示剩余11条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接