1 线性方法
1.1 object.interpolate(distance[, normalized=False])
print(LineString([(0, 0), (0, 1), (1, 1)]).interpolate(1.5))
#POINT (0.5 1)
print(LineString([(0, 0), (0, 1), (1, 1)]).interpolate(0.75, normalized=True))
#POINT (0.5 1)
-
LineString([(0, 0), (0, 1), (1, 1)]).interpolate(1.5)
-
1)创建了一个由三个点组成的
LineString
对象:(0, 0)
,(0, 1)
和(1, 1)
。这个LineString
代表一个"L"形的路径。 -
2)使用
interpolate(1.5)
方法在这个路径上查找一个距离起点(0, 0)
有1.5单位长度的点。因为LineString
的第一段是从(0, 0)
到(0, 1)
,长度为1单位,所以剩下的0.5单位将会在从(0, 1)
到(1, 1)
的线段上测量。 -
因此,这个方法将返回位于
(0.5, 1)
的点,即从(0, 1)
出发,在X轴方向移动0.5单位长度的位置。
-
-
LineString([(0, 0), (0, 1), (1, 1)]).interpolate(0.75, normalized=True)
-
这次使用的是
interpolate(0.75, normalized=True)
方法。 -
当
normalized=True
时,给定的距离值被解释为整个LineString
长度的比例而非实际的距离。LineString
的长度是2(从(0, 0)
到(0, 1)
加上从(0, 1)
到(1, 1)
)。因此,0.75代表整个路径长度的75%。 -
在这个例子中,75%的长度位于从
(0, 1)
到(1, 1)
的线段上,准确地说,它位于这条线段的中点,因为从(0, 0)
到(0, 1)
是前25%,从(0, 1)
到(1, 1)
的中点则是接下来的50%至75%。所以这个方法将返回(0.5, 1)
的点,与上一个例子结果相同,但是原因不同:这里是因为它代表整个路径长度的75%的位置。
-
2 一元谓词
2.1 has_z 是否有z坐标
如果特征不仅有x和y坐标,而且还有z坐标用于3D几何,则返回True。
from shapely import Point
Point(0, 0).has_z
#False
Point(0,0,0).has_z
#True
2.2 is_ccw 是否是逆时针排序
counter close wise
如果坐标是逆时针顺序,则返回True。此方法仅适用于LinearRing对象
from shapely import LinearRing
LinearRing([(1,0), (1,1), (0,0)]).is_ccw
#True
LinearRing([(0,0), (1,1), (1,0)]).is_ccw
#False
2.3 is_ring 是否成环
如果特征是一个封闭且简单的LineString,则返回True。一个封闭特征的边界与空集重合。
此属性适用于LineString和LinearRing实例,但对其他类型无意义
from shapely import LinearRing,LineString
LineString([(0, 0), (1, 1), (1, -1)]).is_ring
#False
LinearRing([(0, 0), (1, 1), (1, -1)]).is_ring
#True
2.4 is_simple
如果特征不与自身交叉,则返回True
简单性测试仅对LineStrings和LinearRings有意义
LineString([(0, 0), (1, 1), (1, -1), (0, 1)]).is_simple
#False
3 二元谓词
3.1 __eq__ &equals
- __eq__:如果两个对象是相同的几何类型,并且两个对象的坐标完全匹配,则返回True。
- equals:如果对象的集合论边界、内部和外部与另一个对象的相应部分重合,则返回True
a = LineString([(0, 0), (1, 1)])
b = LineString([(0, 0), (0.5, 0.5), (1, 1)])
a.__eq__(b)
#False
a.equals(b)
#True
a==b
#False
3.2 equals_exact(other, tolerance)
如果对象在指定的容差范围内,则返回True
3.3 contains 包含 <-->within
- 如果other的所有点都不在对象的外部,并且other的至少一个内部点在对象的内部,则返回True。
- within()的逆,a.contains(b) == b.within(a)总是为True。
coords = [(0, 0), (1, 1)]
LineString(coords).contains(Point(0.5, 0.5))
#True
Point(0.5, 0.5).within(LineString(coords))
#True
线的端点是其边界的一部分,因此不被包含
LineString(coords).contains(Point(1.0, 1.0))
#False
3.4 covers,covered_by 覆盖
- covers——如果other的每个点都是对象的内部或边界上的点,则返回True。这类似于object.contains(other) , 但不要求other的任何内部点位于对象的内部。
-
coords = [(0, 0), (1, 1)] LineString(coords).covers(Point(0.5, 0.5)) #True LineString(coords).covers(Point(1.0, 1.0)) #True
-
- covered_by——如果对象的每个点都是other的内部或边界上的点,则返回True。这等同于other.covers(object)
3.5 crosses 相交
如果对象的内部与另一个对象的内部相交但不包含它,并且交集的维度小于一个或另一个的维度,则返回True。
LineString([(0, 0), (1, 1)]).crosses(LineString([(0, 1), (1, 0)]))
#True
3.6 disjoint 不相交 <--->intersects
- 如果对象的边界和内部与另一个对象的边界和内部完全不相交,则返回True。
- intersects的逆
Point(0, 0).disjoint(Point(1, 1))
#True
4 集合论方法
4.1 object.boundary
- 返回一个表示对象集合论边界的低维对象
- 多边形的边界是线,线的边界是点的集合。点的边界是一个空集合
coords = [((0, 0), (1, 1)), ((-1, 0), (1, 0))]
lines = MultiLineString(coords)
lines
lines.boundary
list(lines.boundary.geoms)
#[<POINT (-1 0)>, <POINT (0 0)>, <POINT (1 0)>, <POINT (1 1)>]
4.2 centroid
返回对象几何质心(点)的表示
4.3 difference
返回组成这个几何对象但不组成另一个对象的点的表示(也可以使用minus/-访问)
a = Point(1, 1).buffer(1.5)
b = Point(2, 1).buffer(1.5)
a.difference(b)
4.4 intersection
返回这个对象与另一个几何对象交集的表示(也可以使用and/&访问)
a = Point(1, 1).buffer(1.5)
b = Point(2, 1).buffer(1.5)
a.intersection(b)
4.5 symmetric_difference
返回在这个对象中但不在另一个几何对象中的点,以及在另一个中但不在这个几何对象中的点的表示(可以用xor或者^访问)
a = Point(1, 1).buffer(1.5)
b = Point(2, 1).buffer(1.5)
a.symmetric_difference(b)
4.6 union
返回这个对象和另一个几何对象的点的并集的表示
a = Point(1, 1).buffer(1.5)
b = Point(2, 1).buffer(1.5)
a.union(b)
4.6.1 累积并集的快速方式 unary_union()
使用union()
方法查找许多对象的累积并集是一种昂贵的方式,可以使用unary_union()
from shapely.ops import unary_union
polygons = [Point(i, 0).buffer(0.7) for i in range(5)]
polygons
'''
[<POLYGON ((0.7 0, 0.697 -0.0686, 0.687 -0.137, 0.67 -0.203, 0.647 -0.268, 0....>,
<POLYGON ((1.7 0, 1.7 -0.0686, 1.69 -0.137, 1.67 -0.203, 1.65 -0.268, 1.62 -...>,
<POLYGON ((2.7 0, 2.7 -0.0686, 2.69 -0.137, 2.67 -0.203, 2.65 -0.268, 2.62 -...>,
<POLYGON ((3.7 0, 3.7 -0.0686, 3.69 -0.137, 3.67 -0.203, 3.65 -0.268, 3.62 -...>,
<POLYGON ((4.7 0, 4.7 -0.0686, 4.69 -0.137, 4.67 -0.203, 4.65 -0.268, 4.62 -...>]
'''
unary_union(polygons)
5 构造方法
5.1 buffer
object.buffer(
distance,
quad_segs=16,
cap_style=1,
join_style=1,
mitre_limit=5.0,
single_sided=False)
5.1.1 主要参数
distance: | 缓冲区的距离。正数表示向外扩展(膨胀),负数表示向内收缩(侵蚀) |
quad_segs (默认为16): | 用于近似四分之一圆弧的线段数量。增加这个数值可以得到更平滑的圆角边界,但会增加计算复杂度和结果的多边形顶点数 |
cap_style (默认为1) | 定义线的端点(或线性几何对象的两端)的形状。可选值有:
|
join_style (默认为1) | 定义当两个线段连接时,拐角处的形状。可选值有:
|
mitre_limit (默认为5.0) | 当join_style 为mitre 时,这个参数定义了斜接尖角的最大长度 |
single_sided (默认为False) | 当设置为True时,缓冲区将只在原始几何对象的一侧生成。正 |
5.2 convex_hull 凸包
- 返回包含对象中所有点的最小凸多边形的表示。
- 对于单点
Point(0, 0)
,其凸包就是它自己<POINT (0 0)>
。 - 对于两点
MultiPoint([(0, 0), (1, 1)])
,凸包是连接这两点的线<LINESTRING (0 0, 1 1)>
。 - 对于三点
MultiPoint([(0, 0), (1, 1), (1, -1)])
,凸包是包含这些点的最小凸多边形<POLYGON ((1 -1, 0 0, 1 1, 1 -1))>
。
- 对于单点
5.3 envelope
object.envelope
返回包含对象的点或最小矩形多边形(其边与坐标轴平行)的表示。
from shapely import MultiPoint
MultiPoint([(0,0),(1,2),(4,3)]).envelope
MultiPoint([(0,0),(1,2),(4,3)])
5.4 minimum_rotated_rectangle
- 返回包含对象的一般最小边界矩形。
- 与
envelope
不同,这个矩形不限制与坐标轴平行。如果对象的凸包是退化的(线或点),则返回这种退化形式。
5.5 offset_curve
object.offset_curve(
distance,
quad_segs=16,
join_style=1,
mitre_limit=5.0)
此方法仅适用于 LinearRing
和 LineString
对象
返回一个从对象右侧或左侧一定距离的 LineString
或 MultiLineString
几何形状
5.5.1 主要参数
distance | 右侧偏移(负值)还是左侧偏移(正值) 左右是根据 |
quad_segs (默认为16): | 用于近似四分之一圆弧的线段数量。增加这个数值可以得到更平滑的圆角边界,但会增加计算复杂度和结果的多边形顶点数 |
join_style (默认为1) | 定义当两个线段连接时,拐角处的形状。可选值有:
|
5.5.2 举例
5.6 simplify 简化图形
object.simplify(tolerance,
preserve_topology=True)
返回几何对象的简化表示
5.6.1 参数说明
tolerance | 容忍度,即允许简化后的几何形状与原始形状之间的最大偏差距离 较小的 |
preserve_topology |
|
5.6.2 举例
from shapely import *
p = Point(0.0, 0.0)
x = p.buffer(1.0)
x
x.simplify(tolerance=1)
x.simplify(tolerance=0.1)
6 其他方法
6.1 nearest_points 两个几何体上距离最近的两个点
shapely.ops.nearest_points(geom1, geom2)
- 计算一对几何体中的最近点
- 返回一个包含输入几何体中最近点的元组。这些点按照输入几何体的顺序返回
- 最近点可能不是几何体中现有的顶点
from shapely import *
from shapely.ops import nearest_points
triangle = Polygon([(0, 0), (1, 0), (0.5, 1), (0, 0)])
square = Polygon([(0, 2), (1, 2), (1, 3), (0, 3), (0, 2)])
nearest_points(triangle, square)
#[<POINT (0.5 1)>, <POINT (0.5 2)>]
6.2 shared_paths——两个 LineString
几何体(geom1
和 geom2
)之间的共享路径
shapely.ops.shared_paths(geom1, geom2)
- 查找两个
LineString
几何体(geom1
和geom2
)之间的共享路径 - 该函数返回一个
GeometryCollection
,包含两个元素。- 第一个元素是一个
MultiLineString
,包含对于两个输入都以相同方向共享的路径。 - 第二个元素也是一个
MultiLineString
,但包含对于两个输入方向相反的共享路径。
- 第一个元素是一个
from shapely import *
from shapely.ops import shared_paths
g1 = LineString([(0, 0), (10, 0), (10, 5), (20, 5)])
g2 = LineString([(5, 0), (30, 0), (30, 5), (0, 5)])
forward, backward = shared_paths(g1, g2).geoms
forward, backward
#(<MULTILINESTRING ((5 0, 10 0))>, <MULTILINESTRING ((10 5, 20 5))>)
6.3 split——分割几何体
shapely.ops.split(geom, splitter)
- 通过另一个几何体来分割一个几何体,并返回一个包含多个几何体的集合
- 用 (Multi)Point、(Multi)LineString 或 (Multi)Polygon 的边界分割 (Multi)LineString
- 用 LineString 分割 (Multi)Polygon
from shapely import *
from shapely.ops import split
pt = Point((1, 1))
line = LineString([(0,0), (2,2)])
result = split(line, pt)
print(result)
#GEOMETRYCOLLECTION (LINESTRING (0 0, 1 1), LINESTRING (1 1, 2 2))
6.4 substring——返回在 LineString 上指定距离之间的线段
shapely.ops.substring(geom,
start_dist,
end_dist[, normalized=False])
- 如果
start_dist
和end_dist
相等,则返回一个点 - 如果
start_dist
实际上在end_dist
之后,则返回一个逆序的子字符串,以便start_dist
位于第一个坐标 - 如果
normalized
参数为 True,则距离将被解释为几何体长度的比例
- start_dist & end_dist
- 正数距离:表示从几何体起点(头部)开始沿着几何体方向测量的距离。
- 负数距离:表示从几何体终点(尾部)开始逆向沿几何体方向测量的距离。
from shapely import *
from shapely.ops import substring
ls = LineString([[0,0],[5,0]])
print(ls)
#LINESTRING (0 0, 5 0)
print(substring(ls, start_dist=1, end_dist=3))
#LINESTRING (1 0, 3 0)
#返回 <LINESTRING (1 0, 2 0, 3 0)>,展示了从距离 1 到距离 3 的线段。