代码之家  ›  专栏  ›  技术社区  ›  Kvothe

多边形中的geopandas点

  •  28
  • Kvothe  · 技术社区  · 7 年前

    我有一个多边形的GeoDataFrame(~ 30)和一个点的GeoDataFrame(~ 10k)

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

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

    1 回复  |  直到 7 年前
        1
  •  40
  •   Paul H    7 年前

    不太清楚您实际拥有什么样的数据结构。而且,您所有的预期结果都是错误的,所以这很难检查。假设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