เป็นไปได้หรือไม่ที่จะใช้เลเยอร์หน่วยความจำในอัลกอริทึมการประมวลผล QGIS?


12

ฉันกำลังสร้างปลั๊กอิน QGIS ที่เชื่อมต่อกับฐานข้อมูล MySQL ในเครือข่ายท้องถิ่นแล้วเพิ่มส่วนย่อยของหนึ่งในตารางไปยังเลเยอร์ในหน่วยความจำ เซตย่อยจะขึ้นอยู่กับสกุลเงินของข้อมูล (ทำการสังเกตล่าสุดสำหรับแต่ละตำแหน่งที่ทำการวัดเท่านั้น) สร้างเลเยอร์หน่วยความจำนี้สำเร็จ

อย่างไรก็ตามฉันต้องการเรียกใช้อัลกอริทึมการประมวลผลทางภูมิศาสตร์บางอย่างและฉันมีปัญหาในการใช้เลเยอร์ในหน่วยความจำในส่วนใด ๆ ของพวกเขา

    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.runandloadแต่แล้วผมได้รับข้อผิดพลาดต่อไปนี้พิมพ์ไปยังคอนโซล ( Error: 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

ดูเหมือนว่าเลเยอร์หน่วยความจำไม่สามารถใช้เป็นอินพุตสำหรับสคริปต์การประมวลผล GDAL / OGR ได้เนื่องจากการประมวลผลล้มเหลวในการเตรียมข้อมูลสำหรับใช้กับ ogr2ogr อย่างถูกต้อง นั่นเป็นเหตุผลที่ตัวอย่างเช่นเครื่องมือบัฟเฟอร์ 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])

การประมวลผลรันไทม์ส่งคืนพจนานุกรมในกรณีนี้ bu ['เอาท์พุท'] เอาท์พุทเป็นกุญแจสำคัญและค่าเป็นพา ธ ชั่วคราวที่คุณสามารถดูคีย์ด้วย processeing.alghelp ("การประมวลผลชื่อ") เป็นการประมวลผล, 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>

ในกรณีนี้ที่สำคัญคือการส่งออกดูแลด้วยตัวอักษรตัวใหญ่คุณจะต้องเขียนในเมืองหลวงหรือโดยไม่ต้องทุนในกรณีนี้ไม่ได้ทุน


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.