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)

 

posted @ 2016-09-28 11:00  jihite  阅读(27135)  评论(0编辑  收藏  举报