python Shapely 使用指南
翻译:http://toblerity.org/shapely/manual.html
引入包
from shapely.geometry import Point from shapely.geometry import LineString
共有的变量和方法
object.area
Returns the area (float) of the object.
object.bounds
返回对象的(minx,miny,maxx,maxy)元组(float类型)
object.length
返回对象的长度
object.geom_type
返回对象类型
object.distance(other)
返回本对象和另一个对象的距离
object.representative_point()
Returns a cheaply computed point that is guaranteed to be within the geometric object.
>>> from shapely.geometry import Point >>> print Point(0,0).distance(Point(0,1)) 1.0 >>> from shapely.geometry import LineString >>> line = LineString([(0,0), (1,1), (1,2)]) >>> line.area 0.0 >>> line.bounds (0.0, 0.0, 1.0, 2.0) >>> line.length 2.414213562373095 >>> line.geom_type 'LineString'
Point
class Point(coordinates)
三种赋值方式
>>> point = Point(0,0) >>> point_2 = Point((0,0))
>>> point_3 = Point(point)
一个点对象有area和长度都为0
>>> point.area 0.0 >>> point.length 0.0
坐标可以通过coords或x、y、z得到
>>> p = Point(2,3) >>> p.coords <shapely.coords.CoordinateSequence object at 0x7ffbc3d60dd0> >>> list(p.coords) [(2.0, 3.0)] >>> p.x 2.0 >>> p.y 3.0
coords可以被切片
>>> p.coords[:]
[(2.0, 3.0)]
LineStrings
LineStrings构造函数传入参数是2个或多个点序列
一个LineStrings对象area为0,长度非0
>>> line = LineString([(0,0), (0,1), (1,2)]) >>> line.area 0.0 >>> line.length 2.414213562373095
获得坐标
>>> line.coords[:]
[(0.0, 0.0), (0.0, 1.0), (1.0, 2.0)]
>>> list(line.coords)
[(0.0, 0.0), (0.0, 1.0), (1.0, 2.0)]
LineString依然可以接受一个同类型对象
>>> line2 = LineString(line) >>> line2.coords[:] [(0.0, 0.0), (0.0, 1.0), (1.0, 2.0)]
LineString 构建
lst = [ 121.4489353386771, 31.253452739006963, -1000000.0, 121.44851583474517, 31.253614732449538, -1000000.0, 121.44760618272493, 31.253973404541036, -1000000.0 ] coordss = [] for x in range(0, (int)(len(lst)/3)): coordss.append([lst[x*3 + 0], lst[x*3 + 1], lst[x*3 + 2]]) line = LineString(coordss) print(line.wkt)
计算长度
def line_length(pnts): lens = 0 prvx = pnts[0][0] prvy = pnts[0][1] coef = math.cos(prvy * math.pi / 180.0) coef = coef * coef for curs in range(1, len(pnts)): nxtx = pnts[curs][0] nxty = pnts[curs][1] ptdx = nxtx - prvx ptdy = nxty - prvy lens = lens + math.sqrt(ptdx * ptdx * coef + ptdy * ptdy) prvx = nxtx prvy = nxty return lens * M print(line_length(line.coords))
Polygon
from shapely.ops import unary_union
tile_poly_dic = { '557040779': Polygon([(121.66259766, 31.17919922), (121.68457031, 31.17919922), (121.68457031, 31.20117188), (121.66259766, 31.20117188), (121.66259766, 31.17919922)]), '557040782': Polygon([(121.68457031, 31.17919922), (121.70654297, 31.17919922), (121.70654297, 31.20117188), (121.68457031, 31.20117188), (121.68457031, 31.17919922)]) } new_poly = unary_union([tile_poly_dic[key] for key in tile_poly_dic])
包含
new_poly.contains(one_poly)
常见格式转换
wkt: Well Know Text
wkb: Well Kown Binary
>>> Point(1,1).wkt 'POINT (1 1)' >>> Point(1,1).wkb '\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?' >>> Point(1,1).wkb.encode('hex') '0101000000000000000000f03f000000000000f03f' >>> >>> Point(1,1).wkb.encode('hex') '0101000000000000000000f03f000000000000f03f'
两者都有loads和dumps方法
对于wkt
>>> from shapely.wkt import dumps, loads >>> s = dumps(Point(1,2)) >>> s 'POINT (1.0000000000000000 2.0000000000000000)' >>> ss = loads(s) >>> ss <shapely.geometry.point.Point object at 0x7ffbc3d783d0> >>> ss.coords[:] [(1.0, 2.0)]
对于wkb
>>> from shapely.wkb import dumps, loads >>> s = dumps(Point(1,2), hex=True) >>> s '0101000000000000000000F03F0000000000000040' >>> ss = loads(s, hex=True) >>> ss <shapely.geometry.point.Point object at 0x7ffbc3d78790> >>> ss.coords <shapely.coords.CoordinateSequence object at 0x7ffbc3d783d0> >>> ss.coords[:] [(1.0, 2.0)]
合并线性要素
>>> from shapely.ops import polygonize >>> lines = [ >>> ((0, 0), (1, 1)), >>> ((0, 0), (0, 1)), >>> ((0, 1), (1, 1)), >>> ((1, 1), (1, 0)), >>> ((1, 0), (0, 0)) >>> ]
>>> from shapely.ops import linemerge >>> linemerge(lines)
合并
from shapely.geometry import Polygon from shapely.ops import unary_union poly_1 = Polygon([(20, 20), (60, 20), (60, 40), (20, 40)]) poly_2 = Polygon([(60, 50), (60, 70), (80, 70), (80, 50)]) new_poly = unary_union([poly_1, poly_2]) print("Type: ", new_poly.type) for poly in new_poly.geoms: print(poly)