Python?shapely庫(kù)的具體使用
基本類(lèi)型
基本幾何類(lèi)型包括: 點(diǎn)(Point), 線(LineString), 線環(huán)(LinearRing), 多邊形(Polygon)
所有的基本幾何對(duì)象均存在以下屬性:
- 長(zhǎng)度 x.length
- 面積 x.area
- 邊界框 x.bounds 返回 (x_min, y_min, x_max, y_max)
- 坐標(biāo)值 x.coords 返回可迭代對(duì)象(支持索引與切片), 元素為坐標(biāo)元組 (x, y)
Point
Point 代表幾何上的一個(gè)點(diǎn)
from shapely.geometry import Point point_1 = Point(1, 1) # 傳遞的參數(shù)為坐標(biāo)元組 point_2 = Point((2, 2)) print(point_1, point_2) # 具體坐標(biāo) print('x =', point_1.x, 'y =', point_1.y) # 長(zhǎng)度面積 print('length =', point_1.length, 'area =', point_1.area) # 邊界框 print('bounds of point:', point_1.bounds) # 坐標(biāo)值 print('coords of point:', list(point_1.coords))
在幾何對(duì)象的創(chuàng)建中, 一個(gè)坐標(biāo)元組 (x, y[, z]) 代表一個(gè)點(diǎn), 多個(gè)點(diǎn)的組合嵌套可以創(chuàng)建更復(fù)雜的幾何對(duì)象
打印結(jié)果如下:
POINT (1 1) POINT (2 2)
x = 1.0 y = 1.0
length = 0.0 area = 0.0
bounds of point: (1.0, 1.0, 1.0, 1.0)
coords of point: [(1.0, 1.0)]
計(jì)算兩個(gè)點(diǎn)的歐式距離:
# 1.4142135623730951 point_1.distance(point_2)
可以擴(kuò)展為計(jì)算任意兩個(gè)幾何對(duì)象的最短距離
LineString
LineString 由多個(gè)點(diǎn)依次連接而成
from shapely.geometry import LineString, Point line_1 = LineString([(0, 0), (0, 1), (1, 1)]) line_2 = LineString([Point(0, 0), Point(0, 1), Point(1, 1)]) print(line_1) print(line_2) # 長(zhǎng)度面積 print('length =', line_1.length, 'area =', line_1.area) # 邊界框 print('bounds:', line_1.bounds) # 坐標(biāo)值-切片 print('coords:', line_1.coords[:])
打印結(jié)果如下:
LINESTRING (0 0, 0 1, 1 1)
LINESTRING (0 0, 0 1, 1 1)
length = 2.0 area = 0.0
bounds: (0.0, 0.0, 1.0, 1.0)
coords: [(0.0, 0.0), (0.0, 1.0), (1.0, 1.0)]
LinearRing
LinearRing 是一個(gè)封閉的 LineString, 起始點(diǎn)與終止點(diǎn)的坐標(biāo)相同, 創(chuàng)建方法與 LineString 一致
from shapely.geometry import LinearRing, Point ring_1 = LinearRing([(0, 0), (0, 1), (1, 1), (1, 0), (0, 0)]) # 起始點(diǎn)與終止點(diǎn)沒(méi)有顯式封閉 ring_2 = LinearRing([Point(0, 0), Point(0, 1), Point(1, 1), Point(1, 0)]) print(ring_1) print(ring_2) # 長(zhǎng)度面積 print('length =', ring_2.length, 'area =', ring_2.area) # 邊界框 print('bounds:', ring_2.bounds) # 坐標(biāo)值 print('coords:', ring_2.coords[:])
在創(chuàng)建 LinearRing 時(shí), 如果坐標(biāo)點(diǎn)沒(méi)有封閉, shapely 自動(dòng)連接第一個(gè)點(diǎn)和最后一個(gè)點(diǎn)
打印結(jié)果如下:
LINEARRING (0 0, 0 1, 1 1, 1 0, 0 0)
LINEARRING (0 0, 0 1, 1 1, 1 0, 0 0)
length = 4.0 area = 0.0
bounds: (0.0, 0.0, 1.0, 1.0)
coords: [(0.0, 0.0), (0.0, 1.0), (1.0, 1.0), (1.0, 0.0), (0.0, 0.0)]
Polygon
Polygon 相當(dāng)于 LinearRing 所圍的內(nèi)容, Polygon 的邊界(外環(huán)和內(nèi)環(huán))均為 LinearRing 類(lèi)型不帶"洞"的多邊形
from shapely.geometry import LinearRing, Point, Polygon # 1. 坐標(biāo)元組 polygon_1 = Polygon([(0, 0), (0, 1), (1, 1), (1, 0), (0, 0)]) # 2. Point # 起始點(diǎn)與終止點(diǎn)沒(méi)有顯式封閉 polygon_2 = Polygon([Point(0, 0), Point(0, 1), Point(1, 1), Point(1, 0)]) # 3. LinearRing polygon_3 = Polygon(LinearRing([(0, 0), (0, 1), (1, 1), (1, 0)])) print("1.", polygon_1) print("2.", polygon_2) print("3.", polygon_3) # 長(zhǎng)度面積 print('length =', polygon_1.length, 'area =', polygon_1.area) # 邊界框 print('bounds:', polygon_1.bounds) # 外環(huán) print('exterior:', polygon_1.exterior) # 外環(huán)的坐標(biāo)值 print('coords of exterior:', polygon_1.exterior.coords[:]) # 所有內(nèi)環(huán) # 多邊形沒(méi)有"洞"時(shí), 沒(méi)有內(nèi)環(huán) print('interiors:', polygon_1.interiors[:])
打印結(jié)果如下:
1. POLYGON ((0 0, 0 1, 1 1, 1 0, 0 0))
2. POLYGON ((0 0, 0 1, 1 1, 1 0, 0 0))
3. POLYGON ((0 0, 0 1, 1 1, 1 0, 0 0))
length = 4.0 area = 1.0
bounds: (0.0, 0.0, 1.0, 1.0)
exterior: LINEARRING (0 0, 0 1, 1 1, 1 0, 0 0)
coords of exterior: [(0.0, 0.0), (0.0, 1.0), (1.0, 1.0), (1.0, 0.0), (0.0, 0.0)]
interiors: []
帶"洞"的多邊形
- 長(zhǎng)度: 外環(huán)和所有內(nèi)環(huán)長(zhǎng)度之和
- 面積: 外環(huán)面積減去所有內(nèi)環(huán)的面積
- 內(nèi)環(huán): x.interiors 是一個(gè)迭代器(支持索引與切片), 其元素為內(nèi)環(huán)
from shapely.geometry import Polygon ex = [(0, 0), (0, 3), (3, 3), (3, 0), (0, 0)] hole = [(1, 1), (1, 2), (2, 2), (2, 1)] polygon = Polygon(ex, holes=[hole]) # 長(zhǎng)度面積 print('length =', polygon.length, 'area =', polygon.area) # 邊界框 print('bounds:', polygon.bounds) # 外環(huán) print('exterior:', polygon.exterior) # 外環(huán)的坐標(biāo)值 print('coords of exterior:', polygon.exterior.coords[:]) # 所有內(nèi)環(huán) print('interiors:', list(polygon.interiors)) # 第一個(gè)內(nèi)環(huán) print('first interior:', polygon.interiors[0]) # 第一個(gè)內(nèi)環(huán)的坐標(biāo) print('coords of first interior:', polygon.interiors[0].coords[:])
打印結(jié)果如下:
length = 16.0 area = 8.0
bounds: (0.0, 0.0, 3.0, 3.0)
exterior: LINEARRING (0 0, 0 3, 3 3, 3 0, 0 0)
coords of exterior: [(0.0, 0.0), (0.0, 3.0), (3.0, 3.0), (3.0, 0.0), (0.0, 0.0)]
interiors: [<shapely.geometry.polygon.LinearRing object at 0x7fdf46c4d7c0>]
first interior: LINEARRING (1 1, 1 2, 2 2, 2 1, 1 1)
coords of first interior: [(1.0, 1.0), (1.0, 2.0), (2.0, 2.0), (2.0, 1.0), (1.0, 1.0)]
集合類(lèi)型
Point, LineString, Polygon 對(duì)應(yīng)的集合類(lèi)型分別為 MultiPoint, MultiLineString, MultiPolygon
在創(chuàng)建時(shí), 既可以使用坐標(biāo)元組作為參數(shù), 也可以使用對(duì)應(yīng)的基本幾何對(duì)象作為參數(shù)
from shapely.geometry import ( ? ? LineString, ? ? MultiLineString, ? ? MultiPoint, ? ? MultiPolygon, ? ? Point, ? ? Polygon ) # 坐標(biāo)元組參數(shù) mul_point_1 = MultiPoint([(1, 1), (2, 2)]) # 幾何對(duì)象參數(shù) mul_point_2 = MultiPoint([Point(1, 1), Point(2, 2)]) # 混合參數(shù) mul_point_3 = MultiPoint([(1, 1), Point(2, 2)]) line_1 = LineString([(0, 0), (0, 1)]) line_2 = LineString([Point(1, 0), Point(1, 1)]) multi_line_1 = MultiLineString([[(0, 0), (0, 1)], [(1, 0), (1, 1)]]) multi_line_2 = MultiLineString([line_1, line_2]) polygon_1 = Polygon([(0, 0), (0, 1), (1, 1), (1, 0), (0, 0)]) polygon_2 = Polygon([Point(1, 1), Point(1, 2), Point(2, 2), Point(2, 1)]) # None 表示 holes=None multi_polygon_1 = MultiPolygon([ ? ? ([(0, 0), (0, 1), (1, 1), (1, 0), (0, 0)], None), ? ? ([(1, 1), (1, 2), (2, 2), (2, 1), (1, 1)], None) ]) multi_polygon_2 = MultiPolygon([polygon_1, polygon_2])
不同類(lèi)型的基本幾何對(duì)象也可以組成一個(gè)集合對(duì)象
from shapely.geometry import GeometryCollection, LineString, Point, Polygon line = LineString([Point(0, 1), Point(0, 2)]) polygon = Polygon([Point(1, 1), Point(1, 2), Point(2, 2), Point(2, 1)]) c = GeometryCollection([Point(0, 0), line, polygon]) print(c) # 長(zhǎng)度面積 print('length =', c.length, 'area =', c.area) # 邊界框 print('bounds:', c.bounds)
集合對(duì)象也具有長(zhǎng)度, 面積, 邊界框等屬性
打印結(jié)果:
GEOMETRYCOLLECTION (POINT (0 0), LINESTRING (0 1, 0 2), POLYGON ((1 1, 1 2, 2 2, 2 1, 1 1)))
length = 5.0 area = 1.0
bounds: (0.0, 0.0, 2.0, 2.0)
導(dǎo)出
常用的數(shù)據(jù)格式包括 wkt(well-know text) 和 wkb(well-know binary)
import shapely from shapely import Point, wkb, wkt p = Point(1, 1) print("initial wkb:", wkb.dumps(p)) print("initial wkt:", wkt.dumps(p))
打印結(jié)果:
initial wkb: b'\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?'
initial wkt: POINT (1.0000000000000000 1.0000000000000000)
可以稍微優(yōu)化一下輸出格式:
# 十六進(jìn)制表示 print("wkb with hex:", wkb.dumps(p, hex=True)) # 移除多余的零 print("wkt trim zero:", wkt.dumps(p, trim=True))
wkb with hex: 0101000000000000000000F03F000000000000F03F
wkt trim zero: POINT (1 1)
與此類(lèi)似的 wkb.dump() 和 wkt.dump() 方法將數(shù)據(jù)導(dǎo)出到文件中
其他導(dǎo)出方法:
print("to_wkb:", shapely.to_wkb(p)) # 等價(jià)于 p.wkb print("to_wkt:", shapely.to_wkt(p)) # 等價(jià)于 p.wkt
還可以輸出 svg 字符串:
print(p._repr_svg_())
在 jupyter notebook 環(huán)境下輸出幾何對(duì)象時(shí)自動(dòng)調(diào)用 x._repr_svg_() 方法, 輸出 svg 圖形
導(dǎo)入
import shapely from shapely import wkb, wkt wkb_i = '0101000000000000000000F03F000000000000F03F' wkt_i = 'POINT (1 1)' print(shapely.from_wkb(wkb_i)) print(shapely.from_wkt(wkt_i)) print(wkb.loads(wkb_i)) print(wkt.loads(wkt_i))
打印結(jié)果:
POINT (1 1)
POINT (1 1)
POINT (1 1)
POINT (1 1)
到此這篇關(guān)于Python shapely庫(kù)的具體使用的文章就介紹到這了,更多相關(guān)Python shapely內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python如何在循環(huán)內(nèi)使用list.remove()
這篇文章主要介紹了Python如何在循環(huán)內(nèi)使用list.remove(),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-06-06Python列表數(shù)據(jù)如何按區(qū)間分組統(tǒng)計(jì)各組個(gè)數(shù)
這篇文章主要介紹了Python列表數(shù)據(jù)如何按區(qū)間分組統(tǒng)計(jì)各組個(gè)數(shù),具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-07-07Python實(shí)現(xiàn)對(duì)桌面進(jìn)行實(shí)時(shí)捕捉畫(huà)面的方法詳解
最近在研究目標(biāo)檢測(cè)方面的小東西,需要到對(duì)桌面進(jìn)行實(shí)時(shí)捕捉畫(huà)面。所以本文來(lái)用Python實(shí)現(xiàn)簡(jiǎn)單的對(duì)桌面進(jìn)行實(shí)時(shí)捕捉畫(huà)面,感興趣的可以了解一下2023-01-01python防止程序超時(shí)的實(shí)現(xiàn)示例
因?yàn)槟硞€(gè)需求,需要在程序運(yùn)行的時(shí)候防止超時(shí),本文主要介紹了python防止程序超時(shí)的實(shí)現(xiàn)示例,具有一定的參考價(jià)值,感興趣的可以了解一下2023-08-08Python使用Selenium實(shí)現(xiàn)按文本查找元素
本文我們將通過(guò)示例為大家詳細(xì)介紹如何在Python中使用selenium通過(guò)文本查找元素的方法,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以參考一下2023-11-11Django集成Celery之狀態(tài)監(jiān)控與任務(wù)管理詳解
這篇文章主要介紹了Django集成Celery之狀態(tài)監(jiān)控與任務(wù)管理詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2025-03-03python?turtle庫(kù)畫(huà)圣誕樹(shù)詳細(xì)代碼教程
這篇文章主要介紹了python?turtle庫(kù)畫(huà)圣誕樹(shù)詳細(xì)代碼教程,圣誕節(jié)快到了,下面小編就來(lái)利用python?turtle庫(kù)畫(huà)一顆圣誕樹(shù),?主要成分有圣誕樹(shù)的本體、大小蝴蝶結(jié)、星星、圣誕帽和襪子,需要的朋友可以參考一下2021-12-12Python 讀取某個(gè)目錄下所有的文件實(shí)例
今天小編就為大家分享一篇Python 讀取某個(gè)目錄下所有的文件實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-06-06