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

7.1. 开始使用 Shapely

Shapely的基本技术特征包括

  1. 得到二维形状的联合分析,交叉分析,或者差异分析的结果;

  2. 决定二维形状是否相交,接触,或者一个中包含另一个。

以及更多。

  1. 关系 空间数据模型有一组几何对象之间关系的自然语言 – 包含,相交,叠置,相切等– 和一个理论框架用于理解它们 使用它们的组成点集的相互交叉的3x3矩阵。

  2. 运算符 承接JTS技术规格, 本手册将区别构造(缓冲,凸壳)和 理论集操作(相交,联合等)。

  3. 坐标系 虽然地球是不平的,但是有很多分析类的问题能够通过试验的和真正的算法,将地球特征转化到直角平面,接着将结果转为地理坐标来解决。这种做法与传统的精确纸质地图一样古老。

Shapely不支持坐标系统转换。 所有2个或更多特征的操作假定特征在同一个直角平面。

7.1.1. 空间关系与操作计算

GEOS主要支持的操作和计算:

空间关系

空间关系计算,主要支持的计算

OGC Filter定义了一些xml标签,从而实现了查询Feature集合的接口。 程序可以将它转换为查询语言,检索Feature集合后返回有效的Feature子集合。

  • 相等(Equals)几何形状拓扑上相等。

  • 脱节(Disjoint)几何形状没有共有的点。

  • 相交(Intersects)几何形状至少有一个共有点(区别于脱节)

  • 接触(Touches)几何形状有至少一个公共的边界点,但是没有内部点。

  • 交叉(Crosses)几何形状共享一些但不是所有的内部点。

  • 内含(Within)几何形状A的线都在几何形状B内部。

  • 包含(Contains)几何形状B的线都在几何形状A内部(区别于内含)

  • 重叠(Overlaps)几何形状共享一部分但不是所有的公共点,而且相交处有他们自己相同的区域。

一些情况下,确切定义有些微妙。 你可以参考JTS技术说明书来完全确定在任何情况下的返回情况。

以上的运算返回的都是 true 或者 false

空间操作

另外一种是空间叠加分析操作。主要有下面几个操作:

  • 缓冲区分析(Buffer)包含所有的点在一个指定距离内的多边形和多多边形。

  • 凸壳分析(ConvexHull)包含几何形体的所有点的最小凸壳多边形,(就是外包多边形啦)

  • 交叉分析(Intersection)交叉操作就是多边形AB中所有共同点的集合。

  • 联合分析(Union)AB的联合操作就是AB所有点的集合。

  • 差异分析(Difference)AB形状的差异分析就是A里有B里没有的所有点的集合。

  • 对称差异分析(SymDifference)AB形状的对称差异分析就是位于A中或者B中但不同时在AB中的所有点的集合

另外还支持多边形化,连接有向线段,压出节点等等操作。

7.1.2. 在 Python 中调用 Shapely

Shapely版本,GEOS库版本和GEOS C API版本均可通过shapely访问。

>>> from osgeo import ogr
>>> import shapely
>>>
>>> print(shapely.__version__)
>>> import shapely.geos
>>>
>>> print(shapely.geos.geos_version)
>>> print(shapely.geos.geos_version_string)
1.8.5
(3, 11, 1)
3.11.1-CAPI-1.17.1

缓冲一个点

>>> from shapely.geometry import Point
>>> point = Point(10, 10)
>>> pt_buf = point.buffer(5)
>>> pt_buf
_images/sec1_intro_5_0.svg
>>> pt_buf.wkt[:300]
'POLYGON ((15 10, 14.975923633360985 9.509914298352196, 14.903926402016152 9.024548389919358, 14.784701678661044 8.548576613727688, 14.619397662556434 8.08658283817455, 14.409606321741776 7.643016315870012, 14.157348061512726 7.222148834901989, 13.865052266813684 6.828033579181772, 13.535533905932738'

Shapely 中的数据自有其结构。

下面通过 GDAL/OGC 类库读取 Shapefile ,并同样实现几何图形有缓冲操作。 可以作为对比。

>>> datasource = ogr.Open('/gdata/GSHHS_c.shp')
>>> layer = datasource.GetLayer(0)
>>> feature = layer.GetFeature(0)
>>> polygon = feature.GetGeometryRef()
>>>
>>> buf = polygon.Buffer(2)
>>> buf.ExportToWkt()[:300]
'POLYGON ((-10.9650568460992 37.4224192942467,-10.9964842742299 37.4560159298094,-11.0643714777975 37.5367271580722,-11.1279096469525 37.6209048025887,-11.1869220983316 37.7083147869049,-11.2412447334328 37.7987140462579,-11.2907264949312 37.8918512034774,-11.3352297867305 37.9874672680008,-11.374630'

7.1.3. Numpy接口

所有的Shapely几何实例都提供了Numpy数组接口:

>>> from numpy import asarray
>>> a = asarray(point)
>>> a.size
>>> a.shape
(2,)

Numpy数组也可以被调整为Shapely的点和线串(linestrings)。

>>> from shapely.geometry import asLineString
>>> a = asarray([[1.0, 2.0], [3.0, 4.0]])
>>> line = asLineString(a)
>>> print(line.wkt)
LINESTRING (1 2, 3 4)

7.1.4. 性能

Shapely 使用 GEOS 库来完成所有的操作。 GEOS 是使用 C++ 来完成的并且得到广泛的应用, 可以相信它已经得到了高度的优化。

shapely.speedups 模块包含用C编写的性能增强功能。 当Python在安装过程中访问编译器时,它们会自动安装。

您可以检查加速功能是否与可用属性一起安装。 默认情况下禁用构造函数加速。 你可以启用加速调用 enable() 。 你也可以使用 disable() 恢复默认的实现。

>>> from shapely import speedups
>>> speedups.available
True
>>> speedups.enable()