python-shapely
shapely 是一個專門進行二維平面圖像計算包
shapely是一個BSD授權的Python包。是專門做圖形計算,用於操作和分析笛卡爾坐標系中的幾何對象 ,基本上圖形線段,點的判斷包里都有,shapely里主要由Point,LineString,Polygon這三類組成。
主要對象
常用對象 | 說明 | |
---|---|---|
Point |
點 | |
LineString |
線段 | |
Polygon |
多邊形 |
通用對象方法
共有屬性
共有屬性 | 描述 | |
---|---|---|
object.area |
獲得面積 | |
object.bounds |
獲得邊界 (minx,miny,maxx,maxy) | |
object.length |
長度 | |
object.geom_type |
獲得類型 Point | |
object.distance(other) |
獲取和其他對象距離,不限於本類型 | |
object.is_empty |
是否為空 | |
object.is_valid |
是否有效 |
from shapely.geometry import Point
from shapely.geometry import LineString
print (Point(0,0).distance(Point(0,1)))
line = LineString([(0,0), (1,1), (1,2)])
print(line.area)
print(bine.bounds)
print(line.length)
print(line.geom_type)
# ----------------------------------------------------------
1.0
0.0
(0.0, 0.0, 1.0, 2.0)
2.414213562373095
'LineString'
Point
點對象
點對象具有零面積和非零長度
from shapely.geometry import Point
# 三種創建方式
point = Point(1,1)
point_2 = Point((1,1))
point_3 = Point(point) # 復制已有的點對象
print(point.area) # 點的 area==0.0
print(ponit.length) # 點的 length==0.0
# 得到X,y
# Point.x,Point.y,Point.z : 獲取對應x,y,z坐標值
print(point.x) # 1.0
print(point.y) # 1.0
# (minx, miny, maxx, maxy) 元組
print(point.bounds) #(1)
# Point.coords: 返回坐標值
# 通過 coords得到 x,y
print(list(p.coords)) # [(1.0,1.0)]
# coords可以被切片
print(p.coords[:]) # [(1.0,1.0)]
LineStrings
LineStrings
構造函數傳入參數是2個或多個點序列
線段對象
線段對象具有零面積和非零長度
from shapely.geometry import LineString
line = LinearRing([(0, 0), (1, 1), (1, 0)]) # 創建線段對象
print(line.area)
#0
print(line.length)
#3.4142135623730949
print(line.bounds) #邊界
#(0.0, 0.0, 1.0, 1.0)
Polygon
多邊形對象----為了結果的正確性,建議強制指定為凸多邊形
Polygon
構造函數采用兩個位置參數。 第一個是(x,y [,z])
點元組的有序序列,其處理方式與LinearRing
情況完全相同。 第二個是可選的無序環狀序列,用於指定特征的內部邊界或“孔”。
from shapely.geometry import Polygon
polygon = Polygon([(0, 0), (1, 1), (1, 0)])
# 三角形
print(polygon.area)
print(polygon.length)
print(polygon.bounds)
print(polygon.boundary)
#0.5
#3.414213562373095
#(0.0, 0.0, 1.0, 1.0)
#LINESTRING (0 0, 1 1, 1 0, 0 0)
多邊形關系
object.bound
- 返回最小的外接正矩形
polygon = Polygon([(0, 0),(1, 1), (1, 0)])
print(polygon.bounds)
#(0.0, 0.0, 1.0, 1.0) # xmin,ymin,xmax,ymax
object.boundary
- 返回表示對象的集合論邊界的低維對象
polygon = Polygon([(0, 0), (2, 2), (2, 0)])
print(polygon.boundary)
# 降一維度,由多邊形變成線段
# 最小對象集合
#LINESTRING (0 0, 2 2, 2 0, 0 0)
line = LinearRing([(0, 0), (1, 1), (1, 0)]) # 創建線段對象
print(line.boundary)
#MULTIPOINT EMPTY
object.centroid
- 返回對象的幾何質心
line = LinearRing([(0, 0), (1, 1), (1, 0)]) # 創建線段對象
polygon = Polygon([(0, 0), (0,1),(1, 1), (1, 0)])
print(polygon.centroid)
print(line.centroid)
#POINT (0.5 0.5)
#POINT (0.6464466094067263 0.3535533905932737)
進階屬性
進階屬性 | 描述 | |
---|---|---|
object.contains(other) |
是否包含 | |
object.difference(other) |
差集 | |
object.intersection(other) |
交集 | |
object.symmetric_difference(other) |
對稱差集 | |
object.union(other) |
並集 |
object.intersection(other)
-
交集
-
返回此對象與另一個幾何對象的交集的表示形式
-
a,b相交的部分 即 a∩b
polygon1 = Polygon([(0, 0), (0, 1), (1, 1), (1, 0)])
polygon2 = Polygon([(0, 0), (0.5, 1), (-0.5, 1), (-1, 0)])
box=polygon1.intersection(polygon2)
print(box)
print(box.area)
#POLYGON ((0 0, 0 1, 0.5 1, 0 0))
#0.25
# 如果兩個圖形沒有交集
polygon1 = Polygon([(0, 0), (0, 1), (1, 1), (1, 0)])
polygon2 = Polygon([(0, 0), (-0.5, 1), (-1, 0)])
box=polygon2.intersection(polygon1)
print(box)
print(box.area)
#POINT (0 0)
#0.0
object.difference(other)
- 返回組成該幾何對象的點的表示,這些點不組成另一個對象
- a - (a,b相交的部分) 即 a - (a∩b)
polygon1 = Polygon([(0, 0), (0, 1), (1, 1), (1, 0)])
polygon2 = Polygon([(0, 0), (0.5, 1), (-0.5, 1), (-1, 0)])
polygon1 = Polygon([(0, 0), (0, 1), (1, 1), (1, 0)])
polygon2 = Polygon([(0, 0), (0.5, 1), (-0.5, 1), (-1, 0)])
box=polygon2.difference(polygon1)
print(box)
print(box.area)
#POLYGON ((0 0, -1 0, -0.5 1, 0 1, 0 0))
#0.75
object.symmetric_difference(other)
- 返回此對象中不在另一個幾何對象中的點以及另一個不在此幾何對象中的點的表示
- a,b的並集-a,b的交集 即 (a∪b) - (a∩b)
object.union(other)
-
並集
-
返回此對象和另一個幾何對象的點並集的表示形式
-
a,b的並集 即 a∪b
-
更高效的方法:
shapely.ops.unary_union()
polygon1 = Polygon([(0, 0), (0, 1), (1, 1), (1, 0)])
polygon2 = Polygon([(0, 0), (0.5, 1), (-0.5, 1), (-1, 0)])
box = polygon2.union(polygon1)
print(box)
print(box.area)
#POLYGON ((0 1, 0.5 1, 1 1, 1 0, 0 0, -1 0, -0.5 1, 0 1))
#1.75
還有很多有意思的用法:
參考: