QGIS 처리 알고리즘에서 메모리 계층을 사용할 수 있습니까?


12

로컬 네트워크의 MySQL 데이터베이스에 연결 한 다음 테이블 중 하나의 서브 세트를 메모리 내 계층에 추가하는 QGIS 플러그인을 구축 중입니다. 하위 집합은 데이터 통화를 기반으로합니다 (측정이 수행되는 각 위치에 대한 최신 관찰 만 수행). 이 메모리 계층이 작성되었습니다.

그러나 일부 지오 프로세싱 알고리즘을 실행하고 싶습니다. 인 메모리 계층을 사용하는 데 문제가 있습니다.

    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

예외는 발생하지 않지만 TOC에 출력이 생성되거나 추가되지 않지만 다음 로그가 작성됩니다 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|

중요한 부분은 FAILURE: Source datasource is not specified.그러나 것 같습니다 self.vlayer.isValid() == True. 그래서 입력 내용에 어떤 문제가 있는지 알 수 없습니다. 에 대한 호출에서 대체 self.vlayer를 시도했지만 콘솔에 다음과 같은 오류가 인쇄됩니다 (그러나 발생하지는 않음) .'memory:scratch'processing.runandloadError: Wrong parameter value: memory:scratch

QGIS GUI를 통해 이것을 실행하고 드롭 다운 메뉴를 사용 scratch하여 TOC에있는 레이어 를 선택할 때도 같은 문제가 발생합니다 . 출력 래스터를 인 메모리로 지정하거나 디스크의 위치를 ​​지정하는지 여부에 관계없이 발생합니다.

이 질문 은 비슷해 보이지만 사용하기 전에 메모리 계층을 TOC에 추가하는 것이 해결책이었습니다. 이미하고 있지만 오류가 계속 발생합니다.

이것이 메모리 계층 및 QGIS 지오 프로세싱 알고리즘에서 일반적인 문제라고 생각했지만 문제없이 다음과 같이 작동합니다.

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

내가 뭘 잘못하고 있죠? 일부 처리 알고리즘에서 메모리 소스 데이터 세트를 "지정"할 수없는 이유는 무엇입니까?

편집 : 유용한 경우 의 소스 코드 는 다음과 같습니다 gdalogr:gridinvdist.

답변:


4

처리가 ogr2ogr에 사용할 데이터를 올바르게 준비하지 못하므로 메모리 계층을 GDAL / OGR 처리 스크립트의 입력으로 사용할 수없는 것 같습니다. 예를 들어 QGIS 버퍼 도구는 작동하지만 GDAL / OGR 버퍼 도구는 실패하는 이유입니다.

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

프로세싱은 어떻게 든 데이터를 준비하고 (파일에 저장 한 후) GDAL / OGR 툴에 공급해야합니다.

티켓을 열었습니다 : OGR 도구로 메모리 레이어를 사용할 수 없습니다


2

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 is the key이며, 값은 processeing.alghelp ( "name processing")을 처리로 사용하여 키를 볼 수있는 임시 경로이며, alghelp ( "grass : r. 드레인 ")

반환

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>

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


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.