from shapely.geometry import Point
Point(0,0).geom_type
'Point'
输出点(0,0)
的几何类型。
object.distance(other)
返回到其他类型几何对象之间的浮点型最短距离。
Point(0,0).distance(Point(1,1))
1.4142135623730951
object.representative_point()
返回一个在几何对象内的易得到的计算点。
注意:质点的不同, 这个点得到的是依照所需计算量最小而定的,只要在几何对象内部即可。
donut = Point(0, 0).buffer(2.0).difference(Point(0, 0).buffer(1.0))
donut.centroid.wkt
'POINT (1.2782007713636419e-17 -2.550256346711113e-17)'
donut.representative_point().wkt
'POINT (-1.4975923633360986 0.0490085701647802)'
from shapely.geometry import Point
point = Point(0.0, 0.0)
point.area
0.0
point.length
0.0
point.bounds
(0.0, 0.0, 0.0, 0.0)
一个点的面积为0,长度为0。 它的边界是一个元组(minx,miny,maxx,maxy)
。
坐标值通过x
,y
,z
属性获得。
list(point.coords)
[(0.0, 0.0)]
point.x
0.0
point.y
0.0
点的构造同样接受另一个点的实例,从而得到一个副本。
Point(point)
from shapely.geometry import LineString
line = LineString([(0, 0), (1, 1)])
print(line.area)
0.0
print(line.length)
1.4142135623730951
print(line.bounds)
(0.0, 0.0, 1.0, 1.0)
len(line.coords)
2
list(line.coords)
[(0.0, 0.0), (1.0, 1.0)]
LineString(line)
它的边界是一个(minx, miny, maxx, maxy)元组。
定义的坐标属性值通过坐标的属性来获得。也可是坐标的切片。
线的构造同样接受另一个线的实例,从而使用另一个副本。
Point
的实例序列不是一个有效的构造函数的参数。线由点来描述,
但不是由点的实例组成。
面
class Polygon(exterior[,interiors=None])
多边形构造需要2个位置参数。 第一个位置参数是(x,y[,z])
点元组的有序序列,
并且在LinearRing
中被认为是准确的。
第二个位置参数是一个可选的、像ring的,无序序列,且位于要素内部,
指定边界或洞的环状序列。
一个有效的多边形的环不能相互交叉, 但可以在一个单点接触。
同样,Shapely不会阻止无效要素的创建, 但是当他们运行时,可能会有异常。
from shapely.geometry import Polygon
ext = [(0, 0), (0, 2), (2, 2), (2, 0), (0, 0)]
int = [(1, 0), (0.5, 0.5), (1, 1), (1.5, 0.5), (1, 0)][::-1]
polygon = Polygon(ext, [int])
polygon
polygon.is_valid
True
ext = [(0, 0), (0, 2), (2, 2), (2, 0), (0, 0)]
int = [(1, 0), (0, 1), (0.5, 1.5), (1.5, 0.5), (1, 0)][::-1]
from shapely.geometry import Polygon
polygon = Polygon(ext, [int])
polygon
polygon.is_valid
False
ext = [(0, 0), (0, 2), (2, 2), (2, 0), (0, 0)]
int = [(0.5, 0), (1.5, 0), (1.5, 1), (0.5, 1), (0.5, 0)]
polygon = Polygon(ext, [int])
polygon
polygon.is_valid
False
图片[fig:valinvalpoly]:左边, 是一个有效的内部环和一个外部环接触于一点;右边, 是无效的多边形,因为它的内部环与外部环在多于一个点接触,描述环的点表现为灰色。
图片[fig:twoinval]:左边,多边形是无效的, 因为它的外部环和内部环相触于一条线;右边,是无效的多边形,因为 它的内部环相触于一条线。
多边形的面积不为0,长度不为0。
from shapely.geometry import Polygon
from shapely.geometry import LinearRing
polygon = Polygon([(0, 0), (1, 1), (1, 0)])
polygon
polygon.area
polygon.length
polygon.bounds
list(polygon.exterior.coords)
list(polygon.interiors)
coords = [(0, 0), (1, 1), (1, 0)]
r = LinearRing(coords)
r
s = Polygon(r)
s.area
0.5
s
t = Polygon(s.buffer(1.0).exterior, [r])
t.area
6.5507620529190325
t
它的x-y边界是一个(minx, miny, maxx, maxy)元组。
组成的环通过内部环和外部环的属性获得。多边形的构件同样接受线和环的实例。
矩形多边形出现,可以方便地使用shapely.geometry.box()
函数构建。
shapely.geometry.box(minx,miny,maxx,maxy,ccw=True)
通过提供的边界值来构造矩形多边形, 默认使用逆时针顺序。
例如:
from shapely.geometry import Polygon, box
b = box(0.0, 0.0, 1.0, 1.0)
list(b.exterior.coords)
[(1.0, 0.0), (1.0, 1.0), (0.0, 1.0), (0.0, 0.0), (1.0, 0.0)]
这是在Shapely多边形中惯用的,且第一次出现。
为获得一个已知方向的多边形,用shapely.geometry.polygon.orient()
函数:
shapely.geometry.polygon.orient(polygon,sign=1.0)
返回一个给定多边形正式方向的副本。
有符面积(使用正负号的面积)将会有给定的符号。符号1.0
表示
产品外部环的坐标将被逆时针导出。
对线状shapefile进行缓冲操作
对线状shapefile进行缓冲操作与上一节的对点状shapefile进行缓冲类似,本节我们来看一下如何对线进行缓冲操作。
注意看上面的结果。原始的线状shapefile是复杂线的类型。它由三段构成,但却是一个实体。 而结果却是分段生成的。 这样的结果对某些情况是有用的,比如说制图(不能显示边界), 是常用的情况,我们希望生成的结果也是一个多边形, 譬如说面积统计(总面积可不是分段面积的和)。 这个部分当然可以对上面的代码进行修改,但是在后面,我们会介绍shapely的另一个功能。
它的 x-y
边界框是一个 (minx, miny, maxx, maxy)
元组。
定义坐标系值通过坐标属性来获得。
线环的构建同样接受另一条线或线环为实例,因而可以得到另一个副本。
在线环中,点的实例序列不是一个有效的构建参数。
from shapely.geometry import LineString
a = LineString([(0, 0), (1,1), (1,2), (2,2)])
b = LineString([(0, 0), (1,1), (2,1), (2,2)])
x = a.intersection(b)
from pprint import pprint
# len(x)
type(x)
shapely.geometry.collection.GeometryCollection
x
a)是指一条绿色和黄色的线沿着一条线和一个点相交;
b)是指交点(蓝色)是一个包含一条线和一个点的集合。
几何集合的成员通过访问 (geoms
)属性, 或通过枚举接口,用in
或 list()
来获得。
from pprint import pprint
print(x)
from shapely.geometry import MultiPoint
m = MultiPoint([(0, 0), (1, 1), (1,2), (2,2)])
GEOMETRYCOLLECTION (LINESTRING (0 0, 1 1), POINT (2 2))
m.length
0.0
m.wkt
'MULTIPOINT ((0 0), (1 1), (1 2), (2 2))'
# m[:1].wkt
# m[3:].wkt
# m[4:].wkt
from shapely.geometry import MultiPoint
points = MultiPoint([(0.0, 0.0), (1.0, 1.0)])
points.area
points.length
points.bounds
(0.0, 0.0, 1.0, 1.0)
它的x-y边界框是一个(minx, miny, maxx, maxy)
元组。
一个多元点集合的成员通过geoms
获得或者通过用in或者list()来枚举接口。
print(list(points.geoms))
[<POINT (0 0)>, <POINT (1 1)>]
# pprint(list(points))
from shapely.geometry import MultiLineString
coords = [((0, 0), (1, 1)), ((-1, 0), (1, 0))]
lines = MultiLineString(coords)
lines.area
lines.length
lines.bounds
len(lines.geoms)
2
它的x-y边界框是一个(minx, miny, maxx, maxy)
元组。
它的成员是线的实例,可以通过geoms
得到,
也可以用in或list()命令来迭代协议获得。
print(list(lines.geoms))
# print(list(lines))
[<LINESTRING (0 0, 1 1)>, <LINESTRING (-1 0, 1 0)>]
构造函数可以接受另一个多元线(MultiLineString)的实例, 也可以接受线(LineString)实例的无序序列, 从而得到一个副本。
MultiLineString(lines)
MultiLineString(lines.geoms)
polygon = [(0, 0), (1,1), (1,2), (2,2),(0,0)]
s = [(10, 0), (21,1), (31,2), (24,2),(10,0)]
t = [(0, 50), (1,21), (1,22), (32,2),(0,50)]
from shapely.geometry import Polygon
p_a, s_a, t_a = [Polygon(x) for x in [polygon, s, t]]
from shapely.geometry import MultiPolygon
polygons = MultiPolygon([p_a, s_a, t_a])
len(polygons.geoms)
# len(polygons)
polygons.bounds
(0.0, 0.0, 32.0, 50.0)
p_a
s_a
t_a
polygons
uu = polygons.geoms
uu[0]
它的x-y边界框是一个(minx, miny, maxx, maxy)元组。
from shapely.geometry import LineString
line = LineString()
line.is_empty
line.length
line.bounds
line.coords
<shapely.coords.CoordinateSequence at 0x7f0ff8d55640>
可以设置一个空值要素的坐标,在这之后几何坐标不再是空的。
在旧版本中可以对坐标进行赋值,但在新版本中会出现错误:
property 'coords' of 'LineString' object has no setter
# line.coords = [(0, 0), (1, 1)]