Shapely的基本技术特征包括
- 得到二维形状的联合分析,交叉分析,或者差异分析的结果;
- 决定二维形状是否相交,接触,或者一个中包含另一个。
以及更多。
- 关系 空间数据模型有一组几何对象之间关系的自然语言 – 包含,相交,叠置,相切等– 和一个理论框架用于理解它们 使用它们的组成点集的相互交叉的3x3矩阵。
- 运算符 承接JTS技术规格, 本手册将区别构造(缓冲,凸壳)和 理论集操作(相交,联合等)。
- 坐标系 虽然地球是不平的,但是有很多分析类的问题能够通过试验的和真正的算法,将地球特征转化到直角平面,接着将结果转为地理坐标来解决。这种做法与传统的精确纸质地图一样古老。
Shapely不支持坐标系统转换。 所有2个或更多特征的操作假定特征在同一个直角平面。
空间关系与操作计算
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中的所有点的集合
另外还支持多边形化,连接有向线段,压出节点等等操作。
from osgeo import ogr
import shapely
print(shapely.__version__)
import shapely.geos
print(shapely.geos.geos_version)
print(shapely.geos.geos_version_string)
2.0.7 (3, 13, 0) 3.13.0-CAPI-1.19.0
缓冲一个点
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('/data/gdata/GSHHS_c.shp')
layer = datasource.GetLayer(0)
feature = layer.GetFeature(0)
polygon = feature.GetGeometryRef()
buf = polygon.Buffer(2)
/opt/conda/lib/python3.12/site-packages/osgeo/ogr.py:601: FutureWarning: Neither ogr.UseExceptions() nor ogr.DontUseExceptions() has been explicitly called. In GDAL 4.0, exceptions will be enabled by default. warnings.warn(
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'
from numpy import asarray
a = asarray(point)
a.size
a.shape
()
Numpy数组也可以被调整为Shapely的点和线串(linestrings)。
from shapely.geometry import LineString
# from shapely.geometry import asLineString
a = asarray([[1.0, 2.0], [3.0, 4.0]])
line = LineString(a)
print(line.wkt)
LINESTRING (1 2, 3 4)
from shapely import speedups
speedups.available
True
speedups.enable()
/tmp/ipykernel_2530/2525139277.py:1: DeprecationWarning: This function has no longer any effect, and will be removed in a future release. Starting with Shapely 2.0, equivalent speedups are always available speedups.enable()