PyQGisCookbook 幾何體處理 八

2021-10-04 22:03:33 字數 4593 閱讀 7414

如果您在pyqgis控制台之外,則此以下**段需要以下匯入:

from qgis.core import (

qgsgeometry,

qgspoint,

qgspointxy,

qgswkbtypes,

qgsproject,

qgsfeaturerequest,

qgsdistancearea

)

表示空間要素的點,線和多邊形通常稱為幾何體。在qgis中,它們以qgsgeometry類表示 。

有時,乙個幾何體實際上是一組簡單(單個部分)幾何體的集合。這種幾何形狀稱為多部分幾何體。如果僅包含一種型別的簡單幾何體,則將其稱為多點,多線或多多邊形。例如,由多個島嶼組成的國家可以表示為多面。

幾何的座標可以在任何座標參考系統(crs)中。從圖層獲取feature時,關聯的幾何體的座標在圖層的crs中。

ogc簡單要素訪問標準的高階描述資訊中提供了所有可能的幾何體構造和關係的描述和規範。

pyqgis提供了幾種建立幾何體的選項:

首先,您應該找出幾何體型別。wkbtype()方法是一種可使用的方法。它返回乙個qgswkbtypes.type列舉的值。

if gpnt.wkbtype() == qgswkbtypes.point:

print(gpnt.wkbtype())

# output: 1 for point

if gline.wkbtype() == qgswkbtypes.linestring:

print(gline.wkbtype())

if gpolygon.wkbtype() == qgswkbtypes.polygon:

print(gpolygon.wkbtype())

# output: 3 for polygon

作為一種替代方法,可以使用type()方法獲得qgswkbtypes.geometrytype列舉型別的返回值。

您可以使用該displaystring()函式來獲取人類可讀的幾何型別。

print(qgswkbtypes.displaystring(gpnt.wkbtype()))

# output: 'point'

print(qgswkbtypes.displaystring(gline.wkbtype()))

# output: 'linestring'

print(qgswkbtypes.displaystring(gpolygon.wkbtype()))

# output: 'polygon'

point

linestring

polygon

還有乙個有用的函式ismultipart(),可確定幾何體圖形是否為多部分幾何體。

要從幾何體圖形中提取資訊,每種向量型別都有訪問器函式。這是有關如何使用這些訪問器的示例:

print(gpnt.aspoint())

# output: print(gline.aspolyline())

# output: [, ]

print(gpolygon.aspolygon())

# output: [[, , , ]]

注意

元組(x,y)不是真正的元組,它們是qgspoint物件,可以使用x()y()方法訪問值。

對於多幾何體形狀也有類似的訪問函式:asmultipoint()asmultipolyline()asmultipolygon()

qgis使用geos庫先進的幾何操作,如幾何處理(contains()intersects(),...)和設定操作(combine()difference(),...)。它還可以計算幾何體形狀的幾何屬性,例如面積(對於多邊形)或長度(對於多邊形和直線)。

讓我們看乙個示例,該示例將遍歷給定圖層中的feature並根據其幾何形狀執行合併在一起且執行一些幾何計算。以下**將計算和列印在countries層每個國家的面積和周長。

以下**假定layerqgsvectorlayer具有polygon要素型別的物件。

# let's access the 'countries' layer

layer = qgsproject.instance().maplayersbyname('countries')[0]

# let's filter for countries that begin with z, then get their features

query = '"name" like \'z%\''

features = layer.getfeatures(qgsfeaturerequest().setfilterexpression(query))

# now loop through the features, perform geometry computation and print the results

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類,該類可以執行基於橢球的計算:

以下**假定layerqgsvectorlayer型別的物件,具有polygon feature。

d = qgsdistancearea()

d.setellipsoid('wgs84')

layer = qgsproject.instance().maplayersbyname('countries')[0]

# let's filter for countries that begin with z, then get their features

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))

# let's calculate and print the area again, but this time in square kilometers

print("area (km2):", d.convertareameasurement(d.measurearea(geom), qgsunittypes.areasquarekilometers))

或者,您可能想知道兩點之間的距離和方位。

d = qgsdistancearea()

d.setellipsoid('wgs84')

# let's create two points.

# santa claus is a workaholic and needs a summer break,

# lets see how far is tenerife from his home

santa = qgspointxy(25.847899, 66.543456)

tenerife = qgspointxy(-16.5735, 28.0443)

print("distance in meters: ", d.measureline(santa, tenerife))

您可以找到qgis中包含的許多演算法示例,並使用這些方法來分析和轉換向量資料。這裡是其中一些**的一些鏈結。

下乙個 

前乙個

使用sphinx使用read the docs提供的主題構建。

PyQGisCookbook 支援投影 九

如果您在pyqgis控制台之外,則此需要匯入以下 段 from qgis.core import qgscoordinatereferencesystem,qgscoordinatetransform,qgsproject,qgspointxy,qgscoordinatereferencesyste...

CRM專案的幾言幾語

一直想參與管理類專案的開發,這次剛換了工作,就非常幸運地有機會參與乙個crm系統。剛來的時候還是在搞需求調研 頁面設計。這個團隊是公司臨時組建起來的,只有乙個外聘的架構師和我們三個小夥子,沒美工,沒測試的,也沒其他人員了。大家都比較有激情,都很投入地工作。看客戶給的文件,不懂的就問客戶,然後就接著把...

sql server 獲取上週幾和本週幾

sql server 獲取上週幾和本週幾 datefirst 每週以周幾開始,周一是 1 週日是 7 有些機器預設是7,有些機器預設是1 select datefirst 修改 datefirst 的值 set datefirst 7 查詢當前每週是以周幾開始,今天是一周的第幾天 select da...