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.