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

あああ、見つけた。を使用し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
一度に見つけられなかった、それが不可能だと言っているわけではありません...もしそれが役に立てば、あなたはそれをロードしてそれを隠すことができると思います。
オイスタイン2015

あなたはレイヤ名を見つけることができない場合使用してQgsMapLayerRegistry.instance().mapLayersByName("memory:myLayerName")[0]この試すQgsMapLayerRegistry.instance().mapLayers()
ミスターチェ

@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>

この場合、キーはoutputです。大文字で書くか、大文字で書く必要があります。この場合は大文字ではありません。


Stack Exchangeポリシーに従って、回答の重複(gis.stackexchange.com/a/211730/8104)を避けてください。詳細:meta.stackexchange.com/q/104227
アーロン

これは最終的に私のために働いたものでした。他の場所で行方不明になったキー情報は、あなたが渡すことができるということでしたoutput['OUTPUT']へのパスをQgsVectorLayerしてprovider_name"ogr"。これにより、.shpパスが読み込まれ、メモリ内レイヤーが作成されます。この方法では、レイヤーがレジストリに追加されないため、レイヤーパネルで点滅しません。
Nick K9 2017年

参照しているマニュアルページによると、「runalgメソッドは、出力名(アルゴリズムの説明に示されているもの)をキーとして辞書を返し、それらの出力のファイルパスを値として返します。」したがって、このアプローチはメモリレイヤーを使用していないようです。すべての中間結果はファイルシステムに保存されます。
ハーバード・トバイト

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、一時ファイルを渡して生成することと比較して、メモリ出力を使用する利点はないと言っていますか?よろしいですか?
オイスタイン2013年

Noneレイヤがレジストリで見つからない場合、単に渡されます。一時ファイルは作成されないので、手動でチェックする必要があります。この関数を使用して、QGIS内の読み込まれたレイヤーをクエリします。コンソールであなたを助けることはできません。
Curlew 2013年

誤解されていると思いますが、一時出力ファイルを作成する出力パラメーターとして渡すことについて話Noneprocessing.runalgていました。
オイスタイン2013年

参考:QgsMapLayerRegistry関数に再び遭遇したばかりです。それは呼び出されましたmapLayersByName
Oystein 2013年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.