Làm cách nào để tải đầu ra bộ nhớ từ quá trình xử lý QGIS?


11

Nhiều thuật toán xử lý có một tùy chọn để lưu đầu ra dưới dạng bộ nhớ. Nếu được chạy từ hộp công cụ, điều này hoạt động tốt, bởi vì bạn có thể đánh dấu vào ô "Mở tệp đầu ra sau khi chạy thuật toán".

Nhìn vào mã nguồn cho QGIS, mã để tải lớp bộ nhớ dường như được xác định trong hàm Postprocessing.handleAlgorithmResults. Hàm sử dụng quyền truy cập vào alg.outputsdanh sách và thực hiện như sau:

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

Khi bạn chạy các thuật toán xử lý từ bàn điều khiển, có cách nào để tải lớp mà không truy cập vào đối tượng này không? tôi có thể chạy

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

hoặc thậm chí

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

Tuy nhiên tôi không thể tìm ra cách lấy kết quả đầu ra.

Câu trả lời:


15

Tôi đã tìm thấy nó. Sử dụng processing.runandload, tải lớp đầu ra vào mục lục sau khi chạy thuật toá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
Tôi bị thu hút bởi câu trả lời bạn tìm thấy. Bạn có biết nếu có một phương tiện tương tự để tạo một lớp bộ nhớ - và có thể truy cập nó mà không cần thực hiện runandload không? Tôi hy vọng sẽ thực hiện một số xử lý bài đăng trên đầu ra xử lý trước khi thêm nó vào khung vẽ - và tự hỏi liệu điều đó có khả thi không ...
Katalpa

1
Tôi không thể tìm thấy một lúc, không thể nói rằng điều đó là không thể ... Tôi đoán bạn có thể tải nó và ẩn nó đi, nếu điều đó có ích.
Oystein

Nếu bạn không thể tìm thấy tên lớp bằng cách QgsMapLayerRegistry.instance().mapLayersByName("memory:myLayerName")[0]thử này:QgsMapLayerRegistry.instance().mapLayers()
Ông Che

@Kirthpa bạn có thể thử, xử lý.runache ("qgis: ngã tư", layer1, layer2, 'out.shp')
drama

4

đó là cách chính xác, nó được giải thích trong tài liệu http://docs.qgis.org/2.14/es/docs/user_manual/ Processing / console.html

mã tiếp theo hoạt động với tất cả trong bộ nhớ ngoại trừ mã cuối cùng được tải

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

các processing.runalgtrả về một cuốn từ điển trong trường hợp này bu['OUTPUT']. OUTPUTLÀ chìa khóa, và giá trị là một đường dẫn tạm thời. Bạn có thể xem khóa với processeing.alghelp ("xử lý tên") khi xử lý, alghelp ("grass: r.drain")

trở về

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>

trong trường hợp này, chìa khóa là đầu ra , hãy cẩn thận với chữ in hoa bạn phải viết bằng vốn hoặc không có vốn, trong trường hợp này không phải là vốn.


Vui lòng tránh các câu trả lời trùng lặp ( gis.stackexchange.com/a/211730/8104 ), theo chính sách Stack Exchange. Thêm chi tiết: meta.stackexchange.com/q/104227
Aaron

Đây là một trong những cuối cùng làm việc cho tôi. Thông báo thông tin quan trọng mà đã mất tích ở những nơi khác là bạn có thể vượt qua các output['OUTPUT']đường dẫn đến QgsVectorLayervới một provider_namesố "ogr". Điều này sẽ đọc trong đường dẫn .shp và tạo một lớp trong bộ nhớ. Cách tiếp cận này không thêm lớp vào sổ đăng ký, vì vậy nó không flash trong Bảng điều khiển Lớp.
Nick K9

Theo trang hướng dẫn mà bạn tham khảo, "Phương thức runache trả về một từ điển với tên đầu ra (tên được hiển thị trong mô tả thuật toán) làm khóa và đường dẫn tệp của các đầu ra đó dưới dạng giá trị." Vì vậy, phương pháp này dường như không sử dụng các lớp bộ nhớ - tất cả các kết quả trung gian sẽ được lưu trữ trong hệ thống tệp.
Håvard Tveite

0

Tôi không chắc chắn nếu điều này sẽ giúp bạn trong ngữ cảnh của bạn (bạn có muốn chạy mã của mình dưới dạng độc lập hoặc trong QGIS sau khi quá trình xử lý algoritm kết thúc không?). Nếu sau này bạn có thể dễ dàng truy vấn được tải QGsVector-QGsRasterlayercác đối tượng bằng cách xem xét sổ đăng ký QGIS MapLayer.

# 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

Nói chung, tất cả các lớp phải có nguồn ở đâu đó trên ổ cứng ngay cả khi kết quả chỉ được thêm sau khi quá trình xử lý hoàn thành các tính toán của nó. Nếu bạn nhìn vào siêu dữ liệu của lớp, bạn có thể tìm thấy nguồn thực sự của một lớp (nếu nó bắt nguồn từ việc xử lý bình thường ở đâu đó trong một thư mục tạm thời)


Cảm ơn bạn vì câu trả lời. Tôi nghĩ rằng đã có một getLayersByNamechức năng cho sổ đăng ký bản đồ, nhưng tôi muốn tự mình chạy thuật toán từ bảng điều khiển, vì vậy điều này sẽ không thực sự hữu ích (lớp bộ nhớ không bao giờ được tải vào sổ đăng ký, đó là điều tôi đang cố gắng làm) . Nhưng bạn có nói rằng không có lợi thế nào khi sử dụng đầu ra bộ nhớ so với việc truyền Nonevà tạo tệp tạm thời? Bạn có chắc chắn về điều đó không?
Oystein

Nonechỉ được thông qua nếu lớp không thể được tìm thấy trong sổ đăng ký. Nó không tạo ra một tempfile và dù sao bạn cũng cần kiểm tra nó bằng tay. Tôi sử dụng chức năng này để truy vấn các lớp được tải trong QGIS. Không thể giúp bạn bên ngoài trong bảng điều khiển.
Curlew

Tôi nghĩ rằng bạn đã hiểu nhầm, tôi đã nói về việc chuyển Noneđến processing.runalgnhư là tham số đầu ra, mà tôi tin rằng tạo ra một tệp đầu ra tạm thời.
Oystein

FYI: Một lần nữa lại bắt gặp chức năng QssMapLayerRegistry, nó được gọi làmapLayersByName
Oystein
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.