繁体   English   中英

从 GeoPandas DataFrame 矢量化创建形状多边形

[英]Vectorized creation of shapely Polygons from GeoPandas DataFrame

我有一个带有点几何的 GeoDataFrame。 从点几何,我想以一种非常简单的方式定义一个方形多边形几何。

给定一个点,该点应该是边长为 250 个单位的正方形的左下角。 即,左下角是当前点,右下角是当前点 + x 轴上的 250 等。

我这样做的天真方法如下:在 GeoDataFrame 中将角创建为新列: 在此处输入图像描述

之后,我尝试将新列定义为:

gdf['POLY'] = shapely.Geometry([gdf['BOTTOM_LEFT'], gdf['BOTTOM_RIGHT'], gdf['TOP_LEFT'], gdf['TOP_RIGHT']])

但这会返回以下错误消息:

AttributeError: 'list' object has no attribute '__array_interface__'

您的实现很接近,但您不能使用一组点调用 shapely.geometry.Polygon - 一次只能完成一个。 所以诀窍是使用df.apply在 DataFrame 的每一行上调用 Polygon:

gdf['geometry'] = gdf.apply(
    lambda s: shapely.geometry.Polygon(
        [s['BOTTOM_LEFT'], s['BOTTOM_RIGHT'], s['TOP_LEFT'], s['TOP_RIGHT']],
        axis=1,
    )
)

您可以使用translate来处理您的原始观点:

gdf['geometry'] = gdf.apply(
    lambda s: shapely.geometry.Polygon(
        [
            s['POINT'],
            s['POINT'].translate(xoff=250),
            s['POINT'].translate(yoff=250, xoff=250),
            s['POINT'].translate(yoff=250),
        ],
        axis=1,
    )
)

假设您有一个只有单点的 GeoDataFrame。 它被称为gdf ,它看起来如下:

X   Y   geometry
0   5   6   POINT (5.00000 6.00000)

您可以使用以下 lambda 函数访问该点的 x 和 y 分量:

#Access x and y components of point geometry
X = gdf.geometry.apply(lambda x: x.x)

Y = gdf.geometry.apply(lambda x: x.y)

现在您可以使用shapely.geometry.Polygon创建一个方形对象。 您需要指定正方形的四个顶点。 您可以使用:

gdf_square = shapely.geometry.Polygon([[X[0], Y[0]],
                                      [X[0]+250, Y[0]],
                                     [X[0]+250, Y[0]+250],
                                     [X[0], Y[0]+250]])

您可以得到一个正方形多边形对象,如下所示: 在此处输入图像描述

请注意,如果 GeoDataFrame 中有很多点,请修改最后一个函数,使其为每一行中的点一个接一个地创建方形多边形。

在我的例子中,使用列表理解构建三角形比使用 geopandas.apply 快 5 倍以上:

polys = [Polygon(((x, y), (x, y+d), (x+d, y+d), (x+d, y))) for x in xs for y in ys]

gdf = gpd.GeoDataFrame(geometry=polys)

暂无
暂无

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

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