QGIS의 Python 콘솔에서 보간 플러그인 호출


13

파이썬 콘솔에서 QGIS 보간 플러그인 기능 (TIN 방법) (래스터-> 보간)을 호출하고 싶습니다.

QGIS API 또는 처리 알고리즘 목록에서 해당 기능을 찾을 수 없습니다. SAGA Triangulation 알고리즘이 잘 작동하지만 5-10 x 느리고 속도가 중요하다는 것을 알았습니다.

그것을 실행하는 방법에 대한 아이디어가 있습니까?


2
비록 이것을 요구하지는 않지만, 알아두면 도움이 될 것입니다. 나는이 링크를 따랐다 : ( gis.stackexchange.com/questions/11216/… ). 나는 from rasterinterpolation import rasterinterpolation어느 모듈을 호출 해야하는지 (또는 호출하는 방법) 확실하지 않습니다.
Joseph

요구 사항을 좀 더 명확하게 설명해 주시겠습니까? 입력 래스터 레이어에서 새로운 보간 래스터 레이어를 계산하는 방법을 찾고 있습니까?
underdark

비슷한 문제가 있습니다. Raster \ interpolation으로 시작하고 그리드에서 Saga \ contours로 시작하는 countour 모델을 만들고 싶습니다. 질문은 "프로세싱 모델러"창에서 래스터 인 레폴 레이터를 추가하는 방법입니다.
H.Wiener

답변:


5

다음 질문에서 전체 솔루션을 제공 할 수있었습니다.

QGIS의 Python 콘솔에서 보간 래스터를 계산하는 방법은 무엇입니까?

큰 관심을 끌기 때문에 여기에 답을 다시 게시 할 것입니다.

대답:

pyqgis의 문서는 매우 단정하지 않습니다,하지만 난 (제대로 관련 보간 클래스를 호출하는 방법을 알아 냈어 QgsInterpolator, QgsTINInterpolator, QgsIDWInterpolator, QgsGridFileWriter파이썬에서). 스크립트의 모든 단계를 자세하게 설명하겠습니다.

1 단계:

코어 및 분석 모듈을 가져 와서 레이어 탭에서 마우스 클릭으로 보간을 위해 원하는 벡터 레이어를 가져옵니다.

import qgis.core
import qgis.analysis

layer = qgis.utils.iface.activeLayer()

2 단계:

필요한 매개 변수로 보간 클래스를 준비하십시오. LayerData 구조체의 초기화를위한 정확한 매개 변수는 QGIS API 문서 (검색어 : QgsInterpolator) 에서 찾을 수 있습니다 .

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

z 좌표를 사용하지 않고 첫 번째로 사용 가능한 필드 (인덱스 = 0)를 보간 속성으로 사용하고 POINTS를 입력 유형으로 사용합니다.

3 단계 :

보간 엔진을 선택하십시오. 여기서 TIN-Interpolation 방법 ( QgsTINInterpolator)과 IDW-Interpolation ( QgsIDWInterpolator) 중에서 선택할 수 있습니다 . 내가했다 QgsTINInterpolator내 코드에서.

tin_interpolator = QgsTINInterpolator([layer_data])

파이썬 목록을 layer_data보간 엔진 에 전달해야합니다 ! 또한 여러 layer_data 시나리오를 추가 할 수 있습니다.

4 단계 :

보간 출력 내보내기에 필요한 매개 변수를 설정하십시오 (설명서 참조 QgsGridFileWriter). 여기에는 보간 GUI (파일 경로, 범위, 해상도, 열 및 행 수)와 유사한 정보가 포함됩니다.

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

QgsGridFileWriterASCII- 그리드 ( .asc) 만 쓰므로 출력 래스터의 파일 확장자를 알고 있어야합니다 . writeFile()메소드 를 호출하여 데이터를 디스크에 씁니다 . 내 보낸 후 그리드 파일을 캔버스에 래스터로 추가 할 수 있습니다.

참조를위한 전체 스크립트 :

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는 현재 버전 3.0으로 다시 작성되고 사용되는 보간 클래스에서 이동 있음을 알아 두셔야 qgis.analysisqgis.core! 이것은이 스크립트의 기능에 큰 영향을 미치므로 버전 3.0에서 다시 작성해야합니다!


1
예제 코드를 시도하지만 layer_data.InterpolationAttribute = 0으로 만 작업하고 다른 필드 인덱스로 시도하지만 0 만 가져옵니다.
Leonard

맞습니다.이 문제도 겪었지만 원인을 조사 할 시간이 충분하지 않았습니다. 내 해결책은 원하는 단일 필드가있는 레이어에 스크립트를 공급하는 것이 었습니다. 개선 된 솔루션을 위해 QGIS API 문서를 사용해 볼 수 있습니다.
root676

3

플러그인 관리자를 사용하여 Raster Interpolation 플러그인을 설치 한 경우이 작업을 수행 할 수 있습니다.

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

참고 : 위의 코드가 값을 인쇄한다는 사실 외에는 실제로 위의 코드가 무엇을하는지 알 수 없습니다. 그러나 사용법을 이해하는 데 도움이 될 것입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.