一组几何的最小包络 - Geopandas
Minimal Envelope of set of geometries - Geopandas
为了能够对 geopandas 数据框中的一组几何图形进行操作,我需要能够确定对象是否位于该集合的外部“边缘”。几何集合如下:
为此,我想创建一个与几何对象集的外边界完美匹配的多边形。我首先想到的是使用集合的凸包:
convex_hull = Sectioned_geostore_obstacles_geometry.unary_union.convex_hull
convex_hull = geopandas.GeoDataFrame({'geometry': convex_hull, 'convex_hull':[1]})
ax = Sectioned_geostore_obstacles_geometry['Gondola'].plot(color='red')
convex_hull.plot(ax=ax, color='green', alpha=0.5)
这导致
但这不太正确,因为我要找的不是凸面的。第二个想法是使用信封:
envelope = Sectioned_geostore_obstacles_geometry.unary_union.envelope
envelope = geopandas.GeoDataFrame({'geometry': envelope, 'convex_hull':[1]})
ax = Sectioned_geostore_obstacles_geometry['Gondola'].plot(color='red')
envelope.plot(ax=ax, color='green', alpha=0.5)
也就是
再一次,不是这样。另一种尝试是使用 shapely 中的 cascade_union 功能:
from shapely.ops import cascaded_union
polygons = list(Sectioned_geostore_obstacles_geometry.Gondola)
boundary = gpd.GeoSeries(cascaded_union(polygons))
即:
但是,这也不是它,因为它 returns 是一个多重多边形,而不是最小的发展多边形。
基本上,我需要缩小信封以跟随对象集的轮廓。
如有任何见解,我们将不胜感激。
为了对此进行测试,我添加了以下示例数据:
test_df = geopandas.GeoSeries([Polygon([(0,0), (2,0), (2,2), (0,2)]),
Polygon([(2,2), (4,2), (4,4), (2,4)])])
test_df = geopandas.GeoDataFrame({'geometry': test_df, 'df1':[1,2]})
convex_hull = test_df.unary_union.convex_hull
convex_hull = geopandas.GeoDataFrame({'geometry': convex_hull, 'convex_hull':[1]})
ax1 = test_df['geometry'].plot(color='red')
convex_hull.plot(ax=ax1, color='green', alpha=0.5)
envelope = test_df.unary_union.envelope
envelope = geopandas.GeoDataFrame({'geometry': envelope, 'convex_hull':[1]})
ax2 = test_df['geometry'].plot(color='red')
envelope.plot(ax=ax2, color='green', alpha=0.5)
为了能够对 geopandas 数据框中的一组几何图形进行操作,我需要能够确定对象是否位于该集合的外部“边缘”。几何集合如下:
为此,我想创建一个与几何对象集的外边界完美匹配的多边形。我首先想到的是使用集合的凸包:
convex_hull = Sectioned_geostore_obstacles_geometry.unary_union.convex_hull
convex_hull = geopandas.GeoDataFrame({'geometry': convex_hull, 'convex_hull':[1]})
ax = Sectioned_geostore_obstacles_geometry['Gondola'].plot(color='red')
convex_hull.plot(ax=ax, color='green', alpha=0.5)
这导致
但这不太正确,因为我要找的不是凸面的。第二个想法是使用信封:
envelope = Sectioned_geostore_obstacles_geometry.unary_union.envelope
envelope = geopandas.GeoDataFrame({'geometry': envelope, 'convex_hull':[1]})
ax = Sectioned_geostore_obstacles_geometry['Gondola'].plot(color='red')
envelope.plot(ax=ax, color='green', alpha=0.5)
也就是
再一次,不是这样。另一种尝试是使用 shapely 中的 cascade_union 功能:
from shapely.ops import cascaded_union
polygons = list(Sectioned_geostore_obstacles_geometry.Gondola)
boundary = gpd.GeoSeries(cascaded_union(polygons))
即:
但是,这也不是它,因为它 returns 是一个多重多边形,而不是最小的发展多边形。 基本上,我需要缩小信封以跟随对象集的轮廓。
如有任何见解,我们将不胜感激。
为了对此进行测试,我添加了以下示例数据:
test_df = geopandas.GeoSeries([Polygon([(0,0), (2,0), (2,2), (0,2)]),
Polygon([(2,2), (4,2), (4,4), (2,4)])])
test_df = geopandas.GeoDataFrame({'geometry': test_df, 'df1':[1,2]})
convex_hull = test_df.unary_union.convex_hull
convex_hull = geopandas.GeoDataFrame({'geometry': convex_hull, 'convex_hull':[1]})
ax1 = test_df['geometry'].plot(color='red')
convex_hull.plot(ax=ax1, color='green', alpha=0.5)
envelope = test_df.unary_union.envelope
envelope = geopandas.GeoDataFrame({'geometry': envelope, 'convex_hull':[1]})
ax2 = test_df['geometry'].plot(color='red')
envelope.plot(ax=ax2, color='green', alpha=0.5)