QGIS 처리에서 메모리 출력을로드하는 방법은 무엇입니까?


11

많은 처리 알고리즘에는 출력을 메모리로 저장하는 옵션이 있습니다. 도구 상자에서 실행 한 경우 "알고리즘 실행 후 출력 파일 열기"상자를 선택하면 제대로 작동합니다.

QGIS의 소스 코드를 보면 메모리 계층을로드하기위한 코드가 함수에 정의 된 것 같습니다 Postprocessing.handleAlgorithmResults. 이 함수는 alg.outputs목록에 대한 액세스를 사용 하며 다음을 수행합니다.

for out in alg.outputs:
    progress.setPercentage(100 * i / float(len(alg.outputs)))
    if out.hidden or not out.open:
        continue
    if isinstance(out, (OutputRaster, OutputVector, OutputTable)):
        try:
            if out.value.startswith('memory:'):
                layer = out.memoryLayer                                # NOTE!!
                QgsMapLayerRegistry.instance().addMapLayers([layer])   # NOTE!!
            else:
                # ... 

콘솔에서 처리 알고리즘을 실행할 때이 객체에 액세스하지 않고 레이어를로드하는 방법이 있습니까? 나는 뛸 수 있습니다

processing.runalg("qgis:intersection", layer1, layer2, "memory:")

또는

processing.runalg("qgis:intersection", layer1, layer2, "memory:myLayerName")

그러나 결과 출력을 얻는 방법을 찾을 수 없습니다.

답변:


15

Aaaand 나는 그것을 발견했다. processing.runandload알고리즘을 실행 한 후 출력 계층을 목차에로드하는을 사용하십시오 .

processing.runandload("qgis:intersection", layer1, layer2, "memory:myLayerName")
layer = QgsMapLayerRegistry.instance().mapLayersByName("memory:myLayerName")[0]
# Should do error checking as well, but this works!!

1
당신이 찾은 대답에 흥미가 있습니다. 메모리 계층을 작성하고 runandload를 구현하지 않고 액세스 할 수있는 유사한 방법이 있는지 알고 있습니까? 캔버스에 추가하기 전에 프로세싱 출력에 포스트 프로세싱을하기를 희망하며, 가능한지 궁금합니다 ...
Katalpa

1
한 번에 하나도 찾을 수 없었지만 불가능하다는 말은 할 수 없었습니다. 도움이된다면로드하고 숨길 수 있다고 생각합니다.
Oystein

다음을 사용하여 레이어 이름을 찾을 수 없으면 다음을 QgsMapLayerRegistry.instance().mapLayersByName("memory:myLayerName")[0]시도하십시오.QgsMapLayerRegistry.instance().mapLayers()
Cherade Che

@Katalpa, processing.runalg ( "qgis : intersection", layer1, layer2, 'out.shp')
드라마

4

올바른 방법이므로 설명서 http://docs.qgis.org/2.14/es/docs/user_manual/processing/console.html에 설명되어 있습니다.

다음 코드는로드 된 마지막 코드를 제외한 모든 메모리에서 작동합니다.

MDT=path/mdt.tif
drain=processing.runalg("grass:r.drain",MDT,"",(pun),False,False,False,"%f,%f,%f,%f"% (xmin, xmax, ymin, ymax),0,-1,0.00100,None)
vect=processing.runalg("grass:r.to.vect",drain['output'],0,False,"%f,%f,%f,%f"% (xmin, xmax, ymin, ymax),0,None)
bu=processing.runalg("qgis:fixeddistancebuffer",vect['output'],Metros_afecta,1,False,None)
buf=bu['OUTPUT']
bufe= QgsVectorLayer(buf,"area", "ogr")
#the last load the layer 
QgsMapLayerRegistry.instance().addMapLayers([bufe])

processing.runalg이 경우에 사전을 반환합니다 bu['OUTPUT']. OUTPUT키이며 값은 임시 경로입니다. processeing.alghelp ( "name processing")이있는 키를 processing, alghelp ( "grass : r.drain")로 볼 수 있습니다.

반환

processing.alghelp("grass:r.drain")
ALGORITHM: r.drain - Traces a flow through an elevation model on a raster map.
input <ParameterRaster>
coordinate <ParameterString>
vector_points <ParameterMultipleInput>
-c <ParameterBoolean>
-a <ParameterBoolean>
-n <ParameterBoolean>
GRASS_REGION_PARAMETER <ParameterExtent>
GRASS_REGION_CELLSIZE_PARAMETER <ParameterNumber>
GRASS_SNAP_TOLERANCE_PARAMETER <ParameterNumber>
GRASS_MIN_AREA_PARAMETER <ParameterNumber>
output <OutputRaster>

이 경우 키가 출력 됩니다.이 경우 대문자가 아닌 대문자로 쓰거나 대문자를 써야합니다.


스택 교환 정책에 따라 중복 답변 ( gis.stackexchange.com/a/211730/8104 )을 피하십시오 . 자세한 내용 : meta.stackexchange.com/q/104227
Aaron

이것은 궁극적으로 나를 위해 일한 것입니다. 다른 곳에서 실종 된 키 정보는 당신이 통과 할 수 있었다 output['OUTPUT']의 경로를 QgsVectorLayer로모그래퍼 provider_name"ogr". .shp 경로를 읽고 메모리 내 계층을 만듭니다. 이 방법은 레이어를 레지스트리에 추가하지 않으므로 레이어 패널에서 깜박이지 않습니다.
Nick K9

참조하는 매뉴얼 페이지에 따르면, "runalg 메소드는 출력 이름 (알고리즘 설명에 표시된 이름)을 키로 사용하고 해당 출력 파일 경로를 값으로 사용하는 사전을 리턴합니다." 따라서이 방법은 메모리 계층을 사용하지 않는 것 같습니다. 모든 중간 결과는 파일 시스템에 저장됩니다.
Håvard Tveite

0

이것이 컨텍스트에서 도움이 될지 확실하지 않습니다 (처리 알고리즘이 완료된 후 코드를 독립형 또는 QGIS 내에서 실행 하시겠습니까?). 후자의 경우 QGIS MapLayer 레지스트리를 살펴보면 로드 된 객체 QGsVector-QGsRasterlayer객체를 쉽게 쿼리 할 수 ​​있습니다 .

# General function to retrieve a layer with a given name
def getLayerByName( layerName ):
  layerMap = QgsMapLayerRegistry.instance().mapLayers()
  for name, layer in layerMap.iteritems():
    if layer.name() == layerName:
        if layer.isValid():
          return layer
        else:
          return None

일반적으로 프로세싱-알 그가 계산을 마친 후에 결과가 추가 되더라도 모든 계층에는 하드 드라이브 어딘가에 소스가 있어야합니다. 레이어 메타 데이터를 살펴보면 레이어의 실제 소스를 찾을 수 있습니다 (일반적으로 임시 폴더의 어딘가에서 처리 한 경우)


답변 주셔서 감사합니다. 이미 getLayersByName맵 레지스트리에 대한 기능 이 있다고 생각 하지만 콘솔에서 직접 알고리즘을 실행하고 싶습니다. 그래서 실제로 도움이되지는 않습니다 (메모리 계층은 레지스트리에로드되지 않습니다. 그러려고합니다) . 그러나 None임시 파일 을 전달 하고 생성하는 것과 비교하여 메모리 출력을 사용하는 것이 이점이 없다고 말하는가 ? 확실합니까?
Oystein

None레지스트리에서 레이어를 찾을 수없는 경우 전달됩니다. 임시 파일을 만들지 않으므로 어쨌든 수동으로 확인해야합니다. 이 함수를 사용하여 QGIS 내에서로드 된 레이어를 쿼리합니다. 콘솔 밖에서 당신을 도울 수 없습니다.
Curlew

나는 당신이 오해했다고 생각합니다. 나는 출력 매개 변수로 전달 None하는 processing.runalg것에 대해 이야기하고 있었고, 나는 임시 출력 파일을 생성한다고 생각합니다.
Oystein

참고 : 그냥 다시,이 호출 년대 QgsMapLayerRegistry 기능을 통해 온mapLayersByName
Oystein
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.