Czy można używać warstw pamięci w algorytmach przetwarzania QGIS?

12

Buduję wtyczkę QGIS, która łączy się z bazą danych MySQL w sieci lokalnej, a następnie dodaje podzbiór jednej z tabel do warstwy w pamięci; podzbiór oparty jest na walucie danych (biorąc najnowszą obserwację dla każdej lokalizacji, w której dokonywane są pomiary). Ta warstwa pamięci została pomyślnie utworzona.

Jednak potem chcę uruchomić algorytmy geoprzetwarzania i mam problem z użyciem warstwy w pamięci w którymkolwiek z nich.

    self.stationuri = "point?crs=epsg:4326&field=id:integer&field={}:double&index=yes".format(self.cb_field.currentText())
    self.vlayer = QgsVectorLayer(self.stationuri,"scratch","memory")
    if not self.vlayer.isValid():
        raise Exception("Failed to create in-memory layer")
    self.vlayer.startEditing()
    for i,r in enumerate(result): # Result is row-by-row result of SQL query
        # Add features
        ...
    self.vlayer.commitChanges()
    self.vlayer.updateExtents()
    # Add layer to map
    QgsMapLayerRegistry.instance().addMapLayer(self.vlayer)
    # Layer is successfully added to map with all features and geometry
    # BELOW IS WHERE IT FALLS APART
    try:
        processing.runandload("gdalogr:gridinvdist",self.vlayer,self.cb_field.currentText(),2,0,0,0,0,0,0,0,'Float32',None) # None = in-memory output; I get the same error if I specify a string path and filename.
    except Exception, e:
        raise e

Nie jest zgłaszany żaden wyjątek, ale do spisu treści nie jest generowane ani dodawane żadne wyjście, ale zapisywany jest następujący dziennik processing.log:

INFO|Mon May 04 2015 11:28:23|GDAL execution console output|/bin/sh: 1: /tmp/processing/bbebe7599c83446d9c2b03a251879657/OUTPUT.tif: not found|/bin/sh: 1: -zfield: not found||FAILURE: Source datasource is not specified.|Usage: gdal_grid [--help-general] [--formats]|    [-ot {Byte/Int16/UInt16/UInt32/Int32/Float32/Float64/|          CInt16/CInt32/CFloat32/CFloat64}]|    [-of format] [-co "NAME=VALUE"]|    [-zfield field_name] [-z_increase increase_value] [-z_multiply multiply_value]|    [-a_srs srs_def] [-spat xmin ymin xmax ymax]|    [-clipsrc <xmin ymin xmax ymax>|WKT|datasource|spat_extent]|    [-clipsrcsql sql_statement] [-clipsrclayer layer]|    [-clipsrcwhere expression]|    [-l layername]* [-where expression] [-sql select_statement]|    [-txe xmin xmax] [-tye ymin ymax] [-outsize xsize ysize]|    [-a algorithm[:parameter1=value1]*]    [-q]|    <src_datasource> <dst_filename>||Available algorithms and parameters with their's defaults:|    Inverse distance to a power (default)|        invdist:power=2.0:smoothing=0.0:radius1=0.0:radius2=0.0:angle=0.0:max_points=0:min_points=0:nodata=0.0|    Moving average|        average:radius1=0.0:radius2=0.0:angle=0.0:min_points=0:nodata=0.0|    Nearest neighbor|        nearest:radius1=0.0:radius2=0.0:angle=0.0:nodata=0.0|    Various data metrics|        <metric name>:radius1=0.0:radius2=0.0:angle=0.0:min_points=0:nodata=0.0|        possible metrics are:|            minimum|            maximum|            range|            count|            average_distance|            average_distance_pts|

Ważną częścią wydaje się być FAILURE: Source datasource is not specified.jednak self.vlayer.isValid() == True, więc nie widzę, co jest nie tak z moimi danymi wejściowymi. Próbowałem zastępując self.vlayerze 'memory:scratch'w wywołaniu processing.runandload, ale potem pojawia się następujący błąd wydrukowany do konsoli (ale nie podniesiony) Error: Wrong parameter value: memory:scratch.

Ten sam problem pojawia się podczas uruchamiania przez QGIS GUI i przy użyciu menu rozwijanego, aby wybrać moją scratchwarstwę, która jest w spisie treści. Dzieje się tak niezależnie od tego, czy określę wyjściowy raster jako w pamięci, czy też określam lokalizację na dysku.

To pytanie wydaje się podobne, ale ich rozwiązaniem było dodanie warstwy pamięci do spisu treści przed jej użyciem. Już to robię, ale błąd nadal występuje.

Myślałem, że to ogólny problem z warstwami pamięci i algorytmami geoprzetwarzania QGIS, ale następujące działania działają bez problemu:

processing.runandload("qgis:fixeddistancebuffer",self.vlayer, 500, 5, True, "output_buffer.shp")

Co ja robię źle? Dlaczego nie można określić mojego źródła danych pamięci w niektórych algorytmach przetwarzania?

EDIT: oto kod źródłowy z gdalogr:gridinvdist, czy to pożyteczne.

zupa alfabetyczna
źródło

Odpowiedzi:

4

Wygląda na to, że warstw pamięci nie można użyć jako danych wejściowych dla skryptów przetwarzających GDAL / OGR, ponieważ przetwarzanie nie przygotowuje poprawnie danych do użycia z ogr2ogr. Dlatego na przykład narzędzie buforujące QGIS działa, ale narzędzie buforujące GDAL / OGR nie działa:

Algorithm Buffer vectors starting...
GDAL command:
cmd.exe /C ogr2ogr.exe "C:\Users\anita\AppData\Local\Temp\processing70e5e0852cb9456ba2e3780f8386122e\86d237c8f41443f58a230a8133172047\OUTPUTLAYER.shp" point?crs=EPSG:4326&memoryid={6772bccd-f55d-461d-aff6-6271ded02eea} point?crs=EPSG:4326&memoryid={6772bccd-f55d-461d-aff6-6271ded02eea} -dialect sqlite -sql "SELECT ST_Buffer( geometry , 1000 ),* FROM 'point?crs=EPSG:4326&memoryid={6772bccd-f55d-461d-aff6-6271ded02eea}' " 
GDAL command output:
FAILURE: 
Unable to open datasource `point?crs=EPSG:4326' with the following drivers. 
-> JP2ECW 
-> OCI 
-> SOSI 
...

Przetwarzanie musiałoby w jakiś sposób przygotować dane (zapisać je w pliku), a następnie podać do narzędzia GDAL / OGR.

Otworzyłem bilet: Nie można używać warstw pamięci za pomocą narzędzi OGR

podmrok
źródło
2

To jest właściwy sposób, jak wyjaśniono w dokumentacji http://docs.qgis.org/2.14/es/docs/user_manual/processing/console.html

następny kod działa w pamięci wszystkie oprócz ostatniego, który jest ładowany

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

przetwarzanie.runalg zwraca słownik w tym przypadku bu ['WYJŚCIE'] WYJŚCIE TO KLUCZ, a wartością jest ścieżka tymczasowa, którą możesz zobaczyć za pomocą processeing.alghelp („przetwarzanie nazw”) jako przetwarzanie, alghelp („trawa : r.drain ")

powrót

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>

w tym przypadku klucz jest generowany , uważaj na wielką literę, którą musisz zapisywać kapitałem lub bez kapitału, w tym przypadku nie jest to kapitał

kortowanie
źródło