目录

上一个主题

5.4. 生成新几何对象的方法

下一个主题

5.6. Shapely互操作接口

关注公众号


常见问题

  1. Windows下的安装说明
  2. Jupyter免费在线实验环境
  3. 勘误与补充


>>> from helper import info; info()
待更新

5.5. 合并线性要素

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

5.5.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))
>>>     ]

5.5.2. shapely.ops.linemerge(lines)

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

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

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

级联合并

shapely的级联合并

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

shapely.ops.cascaded_union(geoms)

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

>>> from shapely.geometry import Point
>>> from shapely.ops import cascaded_union
>>> polygons = [Point(i, 0).buffer(0.7) for i in range(5)]
>>> polygons[0].union(polygons[1]).area
2.8052569090548327
>>> polygons[0].area
1.5369087603675098
>>> cascaded_union(polygons)
_images/shapely-operate_10_0.svg

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

>>> from shapely.geometry import MultiPolygon
>>> m = MultiPolygon(polygons)
>>> m.area
7.684543801837549
>>> cascaded_union(m).area
6.610301355116797

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

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

预制的几何操作

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 0x7f4060dc1438>
>>> hits = filter(prepared_polygon.contains, points)
>>> hits
<filter object at 0x7f404817f710>

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

对象的有效性判断方法

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]'