QGIS işlemeden bellek çıkışı nasıl yüklenir?


11

Birçok işleme algoritmasının çıktıyı bellek olarak kaydetme seçeneği vardır. Araç kutusundan çalıştırıldıysa, bu iyi çalışır, çünkü "Algoritmayı çalıştırdıktan sonra çıktı dosyasını aç" kutusunu işaretleyebilirsiniz.

QGIS için kaynak koduna bakıldığında, bellek katmanını yükleme kodu işlevde tanımlanmış gibi görünüyor Postprocessing.handleAlgorithmResults. İşlev bir alg.outputslisteye erişimi kullanır ve aşağıdakileri yapar:

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:
                # ... 

İşlem algoritmalarını konsoldan çalıştırdığınızda, katmanı bu nesneye erişmeden yüklemenin bir yolu var mı? koşabilirim

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

ya da

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

Ancak elde edilen çıktıyı yakalamanın bir yolunu bulamıyorum.

Yanıtlar:


15

Aaave buldum. processing.runandloadAlgoritmayı çalıştırdıktan sonra çıktı katmanını içindekiler tablosuna yükleyen kullanın .

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
Bulduğun cevap beni çok şaşırttı. Bir bellek katmanı oluşturmanın ve buna runandload uygulamadan erişebilmenin benzer bir yolu olup olmadığını biliyor musunuz?
Tuvaline

1
O zaman bir tane bulamadım, bunun imkansız olduğunu söylemiyorum ... Sanırım bunu yükleyebilir ve saklayabilirsiniz, eğer yardımcı olursa.
Oystein

Katman adını kullanarak bulamazsanız şunu QgsMapLayerRegistry.instance().mapLayersByName("memory:myLayerName")[0]deneyin:QgsMapLayerRegistry.instance().mapLayers()
Comrade Che

@Katalpa deneyebilirsiniz, processing.runalg ("qgis: kavşak", katman1, katman2, 'out.shp')
drama

4

doğru yol, http://docs.qgis.org/2.14/es/docs/user_manual/processing/console.html belgelerinde açıklanmıştır.

sonraki kod, sonuncusu yüklendiğinde bellekte çalışır

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.runalgBu durumda bir sözlük döndürür bu['OUTPUT']. OUTPUTANAHTARDIR ve değer geçici bir yoldur. Processeing.alghelp ("ad işleme") ile anahtarı işleme, alghelp ("grass: r.drain") olarak görebilirsiniz.

dönüş

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>

bu durumda anahtar çıktıdır , büyük harfle veya büyük harfle yazmanız gereken büyük harflere dikkat edin, bu durumda sermaye değil.


Lütfen Stack Exchange politikasını izleyerek yinelenen cevaplardan ( gis.stackexchange.com/a/211730/8104 ) kaçının . Daha fazla detay: meta.stackexchange.com/q/104227
Aaron

Nihayetinde benim için çalışan buydu. Başka yerde eksikti anahtar bilgileri geçilmesinin mümkün olmasıydı output['OUTPUT']yolunu QgsVectorLayerbir ile provider_nameait "ogr". Bu, .shp yolunda okunur ve bir bellek içi katman oluşturur. Bu yaklaşım, katmanı kayıt defterine eklemez, bu nedenle Katmanlar Panelinde yanıp sönmez.
Nick K9

Referans verdiğiniz manuel sayfaya göre, "runalg yöntemi, çıktı adlarını (algoritma açıklamasında gösterilenler) anahtar olarak ve bu çıktıların dosya yollarını değer olarak içeren bir sözlük döndürür." Bu nedenle bu yaklaşım bellek katmanlarını kullanmıyor gibi görünüyor - tüm ara sonuçlar dosya sisteminde saklanacak.
Håvard Tveite

0

Bunun bağlamınızda size yardımcı olup olmayacağından emin değilim (kodunuzu bir işleme algoritması bittikten sonra bağımsız olarak veya QGIS içinde çalıştırmak istiyor musunuz?). Eğer ikincisi ise QGIS MapLayer kayıt defterine bakarak yüklenen QGsVector-ve QGsRasterlayernesneleri kolayca sorgulayabilirsiniz .

# 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

Genel olarak, bir işleme-alg hesaplamaları bittikten sonra sonuç eklenmiş olsa bile, tüm katmanların sabit sürücüde bir yerde bir kaynağı olmalıdır. Katmanlar meta verilerine bakarsanız, bir katmanın gerçek kaynağını bulabilirsiniz (normalde geçici bir klasörde bir yerde işlenmesi kaynaklanıyorsa)


Cevabınız için teşekkür ederim. Zaten getLayersByNameharita kayıt için bir işlev olduğunu düşünüyorum , ama algoritma konsoldan kendim çalıştırmak istiyorum, bu yüzden bu gerçekten yardımcı olmaz (bellek katmanı kayıt defterine asla yüklenmez, yapmaya çalıştığım şey bu) . Fakat Nonegeçici bir dosyayı geçirip geçici dosya oluşturmaya kıyasla bellek çıktısı kullanmanın bir avantajı olmadığını mı söylüyorsunuz ? Bundan emin misin?
Oystein

Nonekatman kayıt defterinde bulunamazsa geçirilir. Bir geçici dosya oluşturmaz ve yine de manuel olarak kontrol etmeniz gerekir. QGIS içindeki yüklü katmanları sorgulamak için bu işlevi kullanın. Konsolda dışarıda size yardım edemem.
Curlew

Sana geçen bahsediyordu, yanlış anladın Noneiçin processing.runalgbir geçici çıktı dosyası oluşturur inanıyoruz çıkış parametresi olarak.
Oystein

Bilginize: QgsMapLayerRegistry işleviyle tekrar karşılaştık, buna denirmapLayersByName
Oystein
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.