目錄
6 幾何處理
6.1 幾何構造
6.2 訪問幾何
6.3 幾何謂詞與操作
此頁面上的**片段需要匯入以下模組:
from qgis.core import (
qgsgeometry,
qgspoint,
qgspointxy,
qgswkbtypes,
qgsproject,
qgsfeaturerequest,
qgsdistancearea
)
表示空間特徵的點、線和多邊形通常稱為幾何。在qgis中,它們用qgsgeometry
類來表示 。
有時,一種幾何實際上是簡單(single-part)幾何的集合。另一種幾何形狀稱為multi-part幾何。如果它只包含一種型別的簡單幾何,我們稱之為多點、多線或多多邊形。例如,由多個島組成的國家可以表示為多多邊形。
幾何的座標可以在任何座標參考系統(crs)中。從圖層中提取要素時,關聯的幾何圖形將在圖層的crs中具有座標。
有關所有可訪問的幾何結構和關係的說明,請參閱ogc簡單特徵訪問標準,以獲取更詳細的資訊。
pyqgis提供了幾種建立幾何的選項:
首先,您應該找出幾何型別。wkbtype()
方法是其中一種方法。它從qgswkbtypes.type
列舉中返回乙個值。
gpnt.wkbtype() == qgswkbtypes.point
# output: true
gline.wkbtype() == qgswkbtypes.linestring
# output: true
gpolygon.wkbtype() == qgswkbtypes.polygon
# output: true
gpolygon.wkbtype() == qgswkbtypes.multipolygon
# output: false
作為替代方案,可以使用type()
,從qgswkbtypes.geometrytype
列舉中返回值。
您可以使用displaystring()
函式來獲取人類可讀的幾何型別。
gpnt.wkbtype()
# output: 1
qgswkbtypes.displaystring(gpnt.wkbtype())
# output: 'point'
還有乙個輔助函式ismultipart()
可以確定幾何是否是multipart 。
從幾何中提取資訊,每種向量型別都有訪問器函式。以下是如何使用這些訪問器的示例:
gpnt.aspoint()
# output: gline.aspolyline()
# output: [, ]
gpolygon.aspolygon()
# output: [[, , , ]]
小貼士:元組(x,y)不是真正的元組,它們是qgspoint
物件,可以使用x()
和y()
方法訪問這些值。
對於多幾何形狀也有類似的訪問函式:asmultipoint()
,asmultipolyline()
和asmultipolygon()
。
qgis使用geos庫進行高階幾何操作,如幾何術語(contains()
,intersects()
,...),操作(combine()
,difference()
,...)。它還可以計算幾何的幾何屬性,例如面積(多邊形)或長度(多邊形和線)。
讓我們看乙個結合遍歷指定圖層要素,並基於它們的幾何執行一些幾何計算的示例。下面的**計算並列印countries
圖層中每個國家的面積和周長。
以下**假定layer
是qgsvectorlayer
具有多邊形要素型別的物件。
layer = qgsproject.instance().maplayersbyname('countries')[0]
# 過濾以z開頭的國家,然後獲取其要素
query = '"name" like \'z%\''
features = layer.getfeatures(qgsfeaturerequest().setfilterexpression(query))
# 現在遍歷要素,執行幾何計算並列印結果
for f in features:
geom = f.geometry()
name = f.attribute('name')
print(name)
print('area: ', geom.area())
print('perimeter: ', geom.length())
現在,您已經計算並列印了幾何圖形的面積和周長。但是,您可能會很快注意到這些值很奇怪。這是因為當使用qgsgeometry
類中的area()
和length()
方法計算時,面積和周長不會考慮crs。可以使用更強大的qgsdistancearea
類計算面積和周長,它可以執行基於橢球的計算:
以下**假定layer
是qgsvectorlayer
具有多邊形要素型別的物件。
d = qgsdistancearea()
d.setellipsoid('wgs84')
layer = qgsproject.instance().maplayersbyname('countries')[0]
# 過濾以z開頭的國家,然後獲取其要素
query = '"name" like \'z%\''
features = layer.getfeatures(qgsfeaturerequest().setfilterexpression(query))
for f in features:
geom = f.geometry()
name = f.attribute('name')
print(name)
print("perimeter (m):", d.measureperimeter(geom))
print("area (m2):", d.measurearea(geom)) ))
# 列印(「面積(m2):」 , d 。measurearea (geom ))
# 計算並重新列印面積,單位為平方公里
print("area (km2):", d.convertareameasurement(d.measurearea(geom),qgsunittypes.areasquarekilometers))
或者,您可能想知道兩點之間的距離和方位。
d = qgsdistancearea()
d.setellipsoid('wgs84')
# 讓我們創造兩點。
# 聖誕老人是乙個工作狂,需要乙個暑假,
# 讓我們看看tenerife離他家有多遠
santa = qgspointxy(25.847899, 66.543456)
tenerife = qgspointxy(-16.5735, 28.0443)
print("distance in meters: ", d.measureline(santa, tenerife))
您可以在qgis中找到許多演算法示例,並使用這些方法來分析和轉換向量資料。以下是一些**的鏈結。
寫在最後:文中難免有翻譯錯誤,歡迎您的指正。完整版翻譯請移步pyqgis開發者手冊-完整版
MeterSphere開發者手冊
什麼是 metersphere metersphere 是一站式的開源企業級持續測試平台,涵蓋測試跟蹤 介面測試 效能測試 團隊協作等功能,相容 jmeter 等開源標準,有效助力開發和測試團隊充分利用雲彈性進行高度可擴充套件的自動化測試,加速高質量的軟體交付,推動中國測試行業整體效率的提公升。第一...
Flutter開發者必備手冊 Flutter Go
幫助開發者快速上手 flutter內部測試中,1.0 正式版將於 2月 20日 發布。flutter 是什麼?2018年6月21日google發布flutter首個release預覽版,作為google 大力推出的一種全新的響應式,跨平台,高效能的移動開發框架。flutter是乙個跨平台的移動ui框...
6個好習慣讓你做個優秀的開發者
1.交談 盡可能多地跟其他軟體開發者交談 培養個人關係 跟意見與你相左的人交流 跟經驗更豐富的人交流 跟閱歷豐富的人交流。多到groups 中去,尤其是交談自由隨意的groups 不約束主題,不約束交談內容。2.選擇更好的環境 我遇到好多開發者,在我看來他們有成為優秀開發者的所有優點,只是他們沒有機...