>>> 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的基本技术特征包括
得到二维形状的联合分析,交叉分析,或者差异分析的结果;
决定二维形状是否相交,接触,或者一个中包含另一个。
以及更多。
关系 空间数据模型有一组几何对象之间关系的自然语言 – 包含,相交,叠置,相切等– 和一个理论框架用于理解它们 使用它们的组成点集的相互交叉的3x3矩阵。
运算符 承接JTS技术规格, 本手册将区别构造(缓冲,凸壳)和 理论集操作(相交,联合等)。
坐标系 虽然地球是不平的,但是有很多分析类的问题能够通过试验的和真正的算法,将地球特征转化到直角平面,接着将结果转为地理坐标来解决。这种做法与传统的精确纸质地图一样古老。
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
>>> 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()