级联合并

shapely的级联合并

对于shapely的级联合并来讲, shapely.ops中的cascaded_union()函数和union()函数。

image

shapely.ops.cascaded_union(geoms)

返回一个给定几何对象合并的结果。例如:

In [5]:
from shapely.geometry import Point
from shapely.ops import cascaded_union
polygons = [Point(i, 0).buffer(0.7) for i in range(5)]
In [12]:
polygons[0].union(polygons[1]).area
Out[12]:
2.8052569090548327
In [13]:
polygons[0].area
Out[13]:
1.5369087603675098
In [2]:
cascaded_union(polygons)
Out[2]:

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

In [3]:
from shapely.geometry import MultiPolygon
m = MultiPolygon(polygons)
m.area
Out[3]:
7.684543801837549
In [4]:
cascaded_union(m).area
Out[4]:
6.610301355116797

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

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

预制的几何操作

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

prepared.prep(ob)

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

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

In [1]:
from shapely.geometry import Point
In [2]:
from shapely.prepared import prep
In [3]:
points = [...] # large list
In [4]:
from shapely.geometry import Point
polygon = Point(0.0, 0.0).buffer(1.0)
prepared_polygon = prep(polygon) 
prepared_polygon
Out[4]:
<shapely.prepared.PreparedGeometry at 0x7f93c424a860>
In [5]:
hits = filter(prepared_polygon.contains, points)
hits
Out[5]:
<filter at 0x7f93ad061d30>

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

对象的有效性判断方法

validation.explain_validity(ob)

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

In [1]:
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)
Out[1]:
'Ring Self-intersection[1 1]'

合并线性要素

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

shapely.ops.polygonize(lines)

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

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

In [1]:
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))
    ]

shapely.ops.linemerge(lines)

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

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

In [2]:
from shapely.ops import linemerge
linemerge(lines)
Out[2]:
In [3]:
pprint(list(linemerge(lines)))
Pretty printing has been turned OFF
In [ ]: