QGIS Python konsolundan çağrı enterpolasyon eklentisi


13

Python konsolundan QGIS enterpolasyon eklentisi fonksiyonunu (TIN yöntemi) (Raster-> Interpolate) çağırmak istiyorum.

İlgili işlevi QGIS API'sinde veya işleme algoritması listesinde bulamıyorum. İyi çalışan ancak 5-10 x daha yavaş olan SAGA Nirengi algoritmasını buldum ve benim durumumda hız önemli.

Nasıl çalıştırılacağına dair bir fikrin var mı?


2
Buna ihtiyacım olmasa da, bilmek faydalı bir şey olurdu. Bu bağlantıyı takip ettim: ( gis.stackexchange.com/questions/11216/… ). Bildiğim kadarıyla from rasterinterpolation import rasterinterpolationhangi modülü çağıracağımı (ya da nasıl arayacağınızı) emin değilim.
— Joseph

Gereksinimlerinizi biraz daha açıklayabilir misiniz? Bir giriş raster katmanından yeni enterpolasyonlu raster katmanını hesaplamanın bir yolunu mu arıyorsunuz?
— underdark

Benzer bir sorun var: Raster \ enterpolasyon ve ardından Saga \ konturları ızgara ile başlayan bir countour modeli oluşturmak istiyorum. Soru - "işleme modelleyici" penceresinde rasterinrepolator nasıl eklenir?
— H.Wiener

Yanıtlar:


5

Aşağıdaki soruda tam bir çözüm sunabildim:

QGIS'deki python konsolundan bir enterpolasyon raster nasıl hesaplanır?

Buradaki yanıtı da tekrarlayacağım, çünkü büyük ilgi çektiği görülüyor:

Cevap:

Pyqgis üzerinde dokümantasyon çok kendini açıklayıcı değil, ama ben (düzgün ilişkili enterpolasyon sınıfları çağırmak için nasıl düşündüm QgsInterpolator, QgsTINInterpolator, QgsIDWInterpolator, QgsGridFileWriterpiton itibaren). Senaryo her adımını ayrıntılı olarak açıklayacağım:

Aşama 1:

Çekirdek ve analiz modülünü içe aktarın ve katman sekmesinde bir fare tıklaması ile seçerek enterpolasyon için istenen vektör katmanını alın.

import qgis.core
import qgis.analysis

layer = qgis.utils.iface.activeLayer()

Adım 2:

İnterpolasyon sınıflarını gerekli Parametrelerle hazırlayın. LayerData yapısının başlatılması için kesin parametreler QGIS API belgelerinde (searchterm: QgsInterpolator) bulunabilir.

layer_data = QgsInterpolator.LayerData()
layer_data.vectorLayer = layer
layer_data.zCoordInterpolation=False
layer_data.InterpolationAttribute =0
layer_data.mInputType = 1

Z Koordinatını kullanmadığımı, enterpolasyon özniteliği olarak ilk kullanılabilir alanı (index = 0) aldığımı ve girdi türü olarak POINTS kullandığımı lütfen unutmayın.

Aşama 3:

İnterpolasyon motorunuzu seçin. Burada TIN-İnterpolasyon yöntemi ( QgsTINInterpolator) ve IDW-İnterpolasyon ( QgsIDWInterpolator) arasında seçim yapabilirsiniz . Çektiğim QgsTINInterpolatorbenim kodunda.

tin_interpolator = QgsTINInterpolator([layer_data])

layer_dataİnterpolasyon motoruna bir python listesi iletmeniz gerektiğini unutmayın ! Bu aynı zamanda birden fazla layer_data senaryosu eklemenize izin verir.

4. Adım:

Enterpolasyon-çıktısının dışa aktarımı için gerekli parametreleri ayarlayın (belgelerine bakın QgsGridFileWriter). Bunlar, enterpolasyon gui (dosyayolu, kapsam, çözünürlük, sütun ve satır sayısı) ile benzer bilgileri içerir.

export_path ="C:/SomeFolder/output.asc"
rect = layer.extent()
res = 10
ncol = int( ( rect.xMaximum() - rect.xMinimum() ) / res )
nrows = int( (rect.yMaximum() - rect.yMinimum() ) / res)

output = QgsGridFileWriter(tin_interpolator,export_path,rect,ncol, nrows,res,res)
output.writeFile(True)  

iface.addRasterLayer(export_path, "interpolation_output") 

QgsGridFileWriterYalnızca ASCII ızgaraları ( .asc) yazarken , çıkış rasterinizin dosya uzantısının farkında olun . Veriler writeFile()yöntemi çağırarak diske yazılır . Dışa aktardıktan sonra ızgara dosyasını tuvale raster olarak ekleyebilirsiniz.

Referans için tam komut dosyası:

import qgis.analysis
import qgis.core

layer = qgis.utils.iface.activeLayer() 
layer_data = QgsInterpolator.LayerData()
layer_data.vectorLayer = layer
layer_data.zCoordInterpolation=False
layer_data.InterpolationAttribute =0
layer_data.mInputType = 1


tin_interpolator = QgsTINInterpolator([layer_data])

export_path = "E:/GIS_Workbench/script_output/test.asc"

rect = layer.extent()
res = 10
ncol = int( ( rect.xMaximum() - rect.xMinimum() ) / res )
nrows = int( (rect.yMaximum() - rect.yMinimum() ) / res)
output = QgsGridFileWriter(tin_interpolator,export_path,rect,ncol,nrows,res,res)
output.writeFile(True)

QGIS-API sürüm 3.0 yeniden yazılarak ve kullanılan enterpolasyon-sınıfları taşınır unutmayın qgis.analysisiçin qgis.core! Bunun, 3.0 sürümü için yeniden yazılması için bu komut dosyasının işlevselliği üzerinde büyük bir etkisi olacaktır!


1
Örnek kodunuzu deneyin, ancak sadece layer_data.InterpolationAttribute = 0 ile çalışıyorum, başka bir alan diziniyle deniyorum, ancak sadece 0 alıyorum.
— Leonard

Bu doğru - ben de bu sorunla karşılaştım, ama nedenini araştırmak için yeterli zamanım yoktu. Benim çözümüm senaryoya sadece istenen alanı içeren bir katman beslemekti. Geliştirilmiş bir çözüm için QGIS API belgelerini deneyebilirsiniz.
— root676

3

Eklenti Yöneticisi'ni kullanarak Raster Enterpolasyon eklentisi yüklüyse bunu yapabilirsiniz.

from rasterinterpolation.core.rasterinterpolator import RasterInterpolator
rastLayer = iface.activeLayer()
interpolator = RasterInterpolator(rastLayer,0,1)
a= interpolator.linear(QgsPoint(10.662629, 76.225421))
print a

Not: Yukarıdaki kodun bir değer yazdırmasından başka ne yaptığını gerçekten bilmiyorum. Ama muhtemelen kullanımı anlamanıza yardımcı olacaktır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.