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.