从不规则形状组中获取周长

问题描述 投票:0回答:3

我正在研究几乎连续的形状组(想想城市街区组),如下所示:

我想做的是得到这个组的外周的形状。对于更常规的形式,这几乎有效:

per_df = gpd.GeoSeries(df.geometry.unary_union.convex_hull).boundary

带来这样的东西:

但是在不规则的形状上它会带来这样的结果:

是否有某种方法可以“融合”或将我的形状连接成一个,以便更容易计算其周长/边界?

这是一个更简单的可重现示例:

p1=Polygon([(0,0),(10,0),(10,9.8),(0,9.8)])
p2=Polygon([(10.2,10),(20,10),(20,20),(10.2,20)])
p3=Polygon([(10,10),(9.8,20),(0,10)])

df=gpd.GeoDataFrame(geometry=[p1,p2,p3])
per_df = gpd.GeoSeries(df.geometry.unary_union.convex_hull).boundary
ax = df.plot()

我想得到这组形状的周长,即使它们之间有一点分离:

谢谢!

python geopandas shapely
3个回答
1
投票

您可以选择:

buf = df.geometry.buffer(10) #or a value that suits you better
unary = buf.unary_union
print(unary.length)

您还可以在计算长度之前使用 -10(或所选值)缓冲一元并集,使其更接近真实形状。


1
投票

您可以尝试对几何图形执行缓冲,使它们重叠,然后进行溶解,生成单个几何图形。您可以获取该几何图形的边界。 (可选)可以应用负缓冲区以使边界拟合更接近原始数据,尽管可能会丢失一些细节

p1=Polygon([(0,0),(10,0),(10,9.8),(0,9.8)])
p2=Polygon([(10.2,10),(20,10),(20,20),(10.2,20)])
p3=Polygon([(10,10),(9.8,20),(0,10)])

df=gpd.GeoDataFrame(geometry=[p1,p2,p3])
df["geometry"] = df.buffer(0.5)
dissolved_df = df.dissolve()
dissolved_df["geometry"] = dissolved_df.buffer(-0.5)
per_df = dissolved_df.boundary

0
投票

如果您想让输出尽可能接近原始形状和/或需要一个能够很好地适应大型输入文件的解决方案,您可以尝试 geofileops.dissolve_within_distance

示例脚本:

from pathlib import Path
import geofileops as gfo
import geopandas as gpd
from matplotlib import pyplot as plt
from shapely import Polygon

# Prepare input
p1 = Polygon([(0, 0), (10, 0), (10, 9.8), (0, 9.8)])
p2 = Polygon([(10.2, 10), (20, 10), (20, 20), (10.2, 20)])
p3 = Polygon([(10, 10), (9.8, 20), (0, 10)])
df = gpd.GeoDataFrame(geometry=[p1, p2, p3])
input_path = Path("input.gpkg")
df.to_file("input.gpkg")

# Process
output_path = Path("output.gpkg")
gfo.dissolve_within_distance(input_path, output_path, distance=1, gridsize=0.0)

# Visualize
result_df = gpd.read_file("output.gpkg")
ax = result_df.plot(color="green")
df.plot(ax=ax, edgecolor="blue", facecolor="none")
plt.show()

结果为绿色,输入为蓝色:

免责声明:我是 geofileops 的开发者。

© www.soinside.com 2019 - 2024. All rights reserved.