当前位置: 首页 > 知识库问答 >
问题:

围绕带标签的坐标创建形状优美的多边形

谢英耀
2023-03-14

我有一个城市建筑物的框架。这些建筑有一个纬度和经度列,并分组到单独的管理位置。

我已经成功地创建了一个geopandas数据框,每个建筑都有一个“几何”列,其中包含形状优美的点,并在地图上用不同的颜色为每个管理位置绘制这些点。但是,是否有办法按管理位置对geodataframe进行分组,并将“几何体”列作为一个形状良好的多边形,包含每个管理位置内每个建筑对应的点?

我目前有:

geo_poly['geometry'] = geo_poly['geometry'].apply(lambda x: x.coords[0])
geo_poly = geo_poly.groupby('management location')['geometry'].apply(lambda x: Polygon(x.tolist())).reset_index()
geo_poly = gpd.GeoDataFrame(geo_poly, geometry = 'geometry')

但当我绘制它时:

geo_poly.plot(ax = ax)

它显然通过遍历地理平台数据框中的每个点来绘制多边形。

我本以为geopandas会有(或者在某处存在)一种更好的方法来围绕已定义簇边缘的点绘制多边形,但我很难找到一个。

如有任何帮助,我们将不胜感激,谢谢

共有1个答案

昝欣可
2023-03-14

您可以使用GeoDataFrame的溶解函数来融合组中的所有点,然后使用convex_hull属性来提取围绕所有分组/融合/溶解点的多边形。

下面是一个可重复的小示例:

# Importing libraries used
import numpy as np
import geopandas as gpd
import shapely

# Setting the random seed
np.random.seed(6)

# Determining the number of points in the example
npoints = 15

# Generating the GeoDataFrame with random Points
mydf = gpd.GeoDataFrame({'id':range(npoints),
                         'geometry':(pd.Series(list(np.random.rand(npoints,2)))
                                     .apply(shapely.geometry.Point)),
                         'group':np.random.randint(1,3,npoints)})

# Plotting the GeoDataFrame according to the "group" column
mydf.plot(column='group', cmap='Set1')

# Fusing all of the Points based on the "group" column and 
# generating a Polygon that envelops all of the Points in
# each group
new_df = (mydf.dissolve(by='group')
          .convex_hull
          .reset_index()
          .rename({0:'geometry'},axis=1))

# Plotting the original Point and the newly-generated Polygons
ax = new_df.plot(column='group',cmap='tab20c', alpha=.7)
mydf.plot(ax = ax, column='group', cmap='Set1')

以下是原始点的分组图:

这是包围点组的多边形图:

所以,对于你的具体例子,你可以这样做:

from shapely.geometry import Point

# Creating a new column with Point geometries
geo_poly['geometry_pt'] = geo_poly['geometry'].apply(lambda x: Point(x.coords[0]))

# Transforming into a GeoDataFrame
geo_poly = gpd.GeoDataFrame(geo_poly, geometry = 'geometry_pt')

# Dissolving and extracting the new Polygons
new_geo_poly = (geo_poly.dissolve(by='management location')
                .convex_hull
                .reset_index()
                .rename({0:'geometry'},axis=1))

在创建新的“geometry_pt”列时,可能需要调整该行。但一旦你修好了,剩下的就可以用了

 类似资料:
  • 我试图从顶点位置创建一组多边形,保存在X,Y格式。 下面是我的数据的一个例子——每行代表一个多边形的顶点。多边形是正方形 我正在使用,因此我的数据需要在列表中。所以我创建了一个循环来尝试从矩阵中将我的数据转换为列表格式。 我创建了一个循环,遵循我在这个网站上的其他一些问题中找到的代码。我突破了每一步,试图理解为什么我只有一个多边形作为输出,即使我有2组点。 你能帮我理解我如何调整代码写出两个多边形

  • 我有一些关于点为双类型的多边形的问题...我要做的是,给定点,创建多边形,然后测试1个具体点是否在多边形内。 所以我知道在Java中有一个类,叫做多边形,用得像这样:(三角形) 但我的“多边形”必须是“双”类型,而不是“int”(简单示例) 在我的项目中,我真的不需要在小程序或类似物上绘制它,我只需要计算点是否在里面。 所以我的问题是: 有没有什么方法可以用双坐标来处理多边形,可以计算这个点(双坐

  • 我想创建一个多边形从形状点。

  • 我使用以下方法从拉多边形中获取多边形: 但是,我正在尝试从多边形获取坐标,但我不能: poligon@polygons[1]类“Polygons”Slot“Polygon”的对象:[1]类“多边形”Slot”labpt“的对象:[1]-46.37327-23.91955 提前致谢

  • 我在传单地图上有一组无组织的点,在我的实现中,这些点表示Minecraftarium.com/map上Minecraftarium.com/map上地图上的领土节点。目前,我的实现只获取点,并使用传单在点周围画一个圆来大致指示控制区域。 然而,这有点难看,也不代表期望的最终结果,即从给定一组数据的边缘点绘制多边形区域。然而,由于这些点的无组织性质,我没有简单的方法来宣布这些点上的“边缘点”,因为它