from shapely.geometry import Point
point = Point(0.0, 0.0)
point.area
point.length
point.bounds
一个点的面积为0,长度为0。 它的边界是一个元组(minx,miny,maxx,maxy)
。
坐标值通过x
,y
,z
属性获得。
list(point.coords)
point.x
point.y
点的构造同样接受另一个点的实例,从而得到一个副本。
Point(point)
from shapely.geometry import LineString
line = LineString([(0, 0), (1, 1)])
print(line.area)
print(line.length)
print(line.bounds)
len(line.coords)
list(line.coords)
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
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
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
图片[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
s
t = Polygon(s.buffer(1.0).exterior, [r])
t.area
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)
这是在Shapely多边形中惯用的,且第一次出现。
为获得一个已知方向的多边形,用shapely.geometry.polygon.orient()
函数:
shapely.geometry.polygon.orient(polygon,sign=1.0)
返回一个给定多边形正式方向的副本。
有符面积(使用正负号的面积)将会有给定的符号。符号1.0
表示
产品外部环的坐标将被逆时针导出。
对线状shapefile进行缓冲操作
对线状shapefile进行缓冲操作与上一节的对点状shapefile进行缓冲类似,本节我们来看一下如何对线进行缓冲操作。
注意看上面的结果。原始的线状shapefile是复杂线的类型。它由三段构成,但却是一个实体。 而结果却是分段生成的。 这样的结果对某些情况是有用的,比如说制图(不能显示边界), 是常用的情况,我们希望生成的结果也是一个多边形, 譬如说面积统计(总面积可不是分段面积的和)。 这个部分当然可以对上面的代码进行修改,但是在后面,我们会介绍shapely的另一个功能。
from shapely.geometry import Polygon, LinearRing
# import LinearRing
ring = LinearRing([(0, 0), (1, 1), (1, 0)])
ring.area
ring.length
ring.bounds
len(ring.coords)
list(ring.coords)
LinearRing(ring)
它的 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)
a)是指一条绿色和黄色的线沿着一条线和一个点相交;
b)是指交点(蓝色)是一个包含一条线和一个点的集合。
几何集合的成员通过访问 (geoms
)属性, 或通过枚举接口,用in
或
list()
来获得。
# from pprint import pprint
# pprint(list(x))
from shapely.geometry import MultiPoint
m = 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
它的x-y边界框是一个(minx, miny, maxx, maxy)
元组。
一个多元点集合的成员通过geoms
获得或者通过用in或者list()来枚举接口。
import pprint
pprint.pprint(list(points.geoms))
pprint.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)
它的x-y边界框是一个(minx, miny, maxx, maxy)
元组。
它的成员是线的实例,可以通过geoms
得到,
也可以用in或list()命令来迭代协议获得。
pprint.pprint(list(lines.geoms))
pprint.pprint(list(lines))
构造函数可以接受另一个多元线(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
p_a
s_a
t_a
polygons
uu = polygons.geoms
uu[0]
它的x-y边界框是一个(minx, miny, maxx, maxy)元组。
图[fig:valinvalmulpolyvk]:右边, 是一个有效的有2个成员的多元多边形;右边,是一个无效的多元多边形,因为它的成员沿着一条线在无数多个点接触。
它的成员是Polygon
的实例,可以通过geoms
或通过用in
或 list()
迭代协议获得。
from shapely.geometry import LineString
line = LineString()
line.is_empty
line.length
line.bounds
line.coords
# The coordinates of a empty feature can be set, 可以设置一个空值要素的坐标,
# after which the geometry is no longer empty.在这之后几何坐标不再是空的。
line.coords = [(0, 0), (1, 1)]
line.is_empty
line.length
line.bounds
from shapely.geometry import Point
Point(0,0).geom_type
输出点(0,0)
的几何类型。
object.distance(other)
返回到其他类型几何对象之间的浮点型最短距离。
Point(0,0).distance(Point(1,1))
object.representative_point()
返回一个在几何对象内的易得到的计算点。
注意:质点的不同, 这个点得到的是依照所需计算量最小而定的,只要在几何对象内部即可。
donut = Point(0, 0).buffer(2.0).difference(Point(0, 0).buffer(1.0))
donut.centroid.wkt
donut.representative_point().wkt
import helper; helper.info()