>>> from env_helper import info; info()
页面更新时间: 2024-01-18 10:03:23
运行环境:
    Linux发行版本: Debian GNU/Linux 12 (bookworm)
    操作系统内核: Linux-6.1.0-17-amd64-x86_64-with-glibc2.36
    Python版本: 3.11.2

7.6. 合并线性要素

相邻接的线序列可以利用 shapely.ops 函数的模块,合并成多元线或者多边形。

7.6.1. shapely.ops.polygonize(lines)

返回一个由输入的线构成的多边形的迭代。

正如 MultiLineString 构造函数,输入的元素可能是任何线性对象。

>>> from shapely.ops import polygonize
>>> lines = [
>>>     ((0, 0), (1, 1)),
>>>     ((0, 0), (0, 1)),
>>>     ((0, 1), (1, 1)),
>>>     ((1, 1), (1, 0)),
>>>     ((1, 0), (0, 0))
>>>     ]

7.6.2. shapely.ops.linemerge(lines)

返回一条线或者多元线,代表线的所有相邻元素的合并。

就像 shapely.ops.polygonize() 中, 输入元素可能是任何线性对象。

>>> from shapely.ops import linemerge
>>> linemerge(lines)
_images/sec6_operate_4_0.svg
>>> pprint(list(linemerge(lines)))
Pretty printing has been turned OFF

7.6.3. 级联合并

对于shapely的几何要素合并来讲, shapely.ops 中有 unary_union() (原为 cascaded_union() ) 函数和 union() 函数。 unary_union() 函数实现级联合并算法。

shapely.ops.unary_union(geoms) 返回一个给定几何对象合并的结果。例如:

>>> from shapely.geometry import Point
>>> from shapely.ops import unary_union
>>> polygons = [Point(i, 0).buffer(0.7) for i in range(5)]
>>> polygons[0].union(polygons[1]).area
2.8052569090548314
>>> polygons[0].area
1.53690876036751
>>> unary_union(polygons)
_images/sec6_operate_10_0.svg

这个功能在解决多元多边形中特别有用。例如:

>>> from shapely.geometry import MultiPolygon
>>> m = MultiPolygon(polygons)
>>> m.area
7.684543801837549
>>> unary_union(m).area
6.610301355116799

7.6.4. 使用级联合并处理缓冲结果

还是回到前面的例子,来看一下如何对缓冲的结果进行合并操作。有了上面的代码,实现起来就非常简单了。

7.6.5. 预制的几何操作

Shapely几何体能够被加工为一种可以支持高效批次的操作的形式。

prepared.prep(ob)

创造和返回编写的几何对象。

为了测试一个多边形对大批点的包含关系, 应该首先使用 prepared.prep() 函数。

>>> from shapely.geometry import Point
>>> from shapely.prepared import prep
>>> points = [...] # large list
>>> from shapely.geometry import Point
>>> polygon = Point(0.0, 0.0).buffer(1.0)
>>> prepared_polygon = prep(polygon)
>>> prepared_polygon
<shapely.prepared.PreparedGeometry object at 0x7f817831a5d0>
>>> hits = filter(prepared_polygon.contains, points)
>>> hits
<filter object at 0x7f8190213340>

准备几何实例有以下几种方法: contains, contains_properly, covers, 与 intersects 。在非准备几何对象中 作为副本使用。

7.6.6. 对象的有效性判断方法

validation.explain_validity(ob)

返回一个解释对象有效性或无效性的字符。

>>> from shapely.geometry import Point
>>> from shapely.geometry import Polygon
>>> coords = [(0, 0), (0, 2), (1, 1), (2, 2), (2, 0), (1, 1), (0, 0)]
>>> p = Polygon(coords)
>>> from shapely.validation import explain_validity
>>> explain_validity(p)
'Ring Self-intersection[1 1]'