Truy cập `process` với Python?


15

Tôi muốn truy cập chức năng dòng explode trong Python bên ngoài QGIS từ một tập lệnh độc lập.

Tôi phải tải mô-đun nào để sử dụng nó?

Làm thế nào tôi có thể truy cập processing?

from qgis.core import *

layerInput = QgsVectorLayer('test.shp', 'test', 'ogr')

processing.runalg('qgis:explodelines', layerInput, 'temp.shp')

2
Tôi nghĩ bạn phải sử dụng import processing.
Joseph

@Joseph Xin lỗi vì không cụ thể: Nhưng tôi muốn truy cập nó từ một tập lệnh độc lập.
ustroetz

Ahh không phải lo lắng :). Trong trường hợp đó, xin lỗi nhưng tôi không biết vì tôi luôn chạy nó trong QGIS. Hy vọng người khác sẽ khuyên.
Joseph

Xin chào @ustroetz, bạn đã quản lý để chạy này từ tập lệnh độc lập của mình chưa? Tôi hỏi bởi vì tôi cũng đang cố gắng chạy các kịch bản bên ngoài.
Giuse

@Joseph Không, tôi chưa
ustroetz

Câu trả lời:


25

CẬP NHẬT 24.04.2018: Xem cách thực hiện điều này trong QGIS v3.x tại đây .


Dành cho QGIS v2.x

Cuối cùng cũng tìm thấy cách chạy thuật toán xử lý thích hợp thông qua các tập lệnh PyQGIS độc lập.

Sử dụng Xử lý plugin phiên bản 2.2.0-2, bạn có thể thử đoạn mã sau:

# Prepare the environment
import sys
from qgis.core import *
from PyQt4.QtGui import *
app = QApplication([])
QgsApplication.setPrefixPath("/usr", True)
QgsApplication.initQgis()

# Prepare processing framework 
sys.path.append('/home/user/.qgis2/python/plugins') # Folder where Processing is located
from processing.core.Processing import Processing
Processing.initialize()
from processing.tools import *

# Run the algorithm
layerInput = QgsVectorLayer('test.shp', 'test', 'ogr')
general.runalg('qgis:explodelines', layerInput, 'temp.shp')

# Exit applications
QgsApplication.exitQgis()
QApplication.exit()

Các phiên bản Xử lý mới hơn có thể được đặt tại /usr/share/qgis/python/plugins, vì vậy bạn có thể cần phải sử dụng sys.path.append('/usr/share/qgis/python/plugins')tương ứng.

Tôi đã tìm thấy ví dụ hoạt động trong Lỗi: Không tìm thấy thuật toán , lần lượt dựa trên cuộc thảo luận về danh sách gửi thư của Qgis-dev .


1
Các plugin xử lý có thể không có tại '/home/user/.qgis2/python/plugins'. Bạn có thể tìm vị trí bằng cách mở QGIS và nhấp vào plugins/Manage and install pluginscuộn xuống để xử lý và bạn sẽ thấy vị trí cài đặt trong mô tả.
Ông Tím

2
Tôi đã nhận được rất nhiều cảnh báo về cannot-create-a-qpixmapchức năng độc lập này nhưng tôi thấy bạn cũng đã giải quyết điều đó trong câu hỏi này gis.stackexchange.com/questions/188074/ Lỗi
Mr Purple

1
Bạn có thể làm cho kịch bản độc lập thậm chí chung chung hơn bằng cách thả layerInputvà thay đổi dòng runalg để: general.runalg(*sys.argv[1:])không đề cập đến rằng kịch bản này có thể là cơ sở để xử lý GIS song song theo câu hỏi này: gis.stackexchange.com/questions/119961/...
Ông Màu tím

Có thể thực hiện cùng một khung nhưng để chạy PLUGIN từ một Python độc lập (không phải trong QGIS) không? Tôi đã thực thi hàm alglist () và tôi không thể thấy các plugin của mình được cài đặt trong QGIS của tôi ở đó ...
Irene

3

Cho đến khi tôi bắt đầu làm việc theo cách chung, tôi sẽ nói với bạn một cách giải quyết.

Tôi sử dụng plugin Xử lý phiên bản 2.2.0-2 (Tôi khuyên bạn nên sử dụng phiên bản này), được cài đặt /home/germap/.qgis2/python/plugins/trên máy tính của tôi. Bạn cần biết vị trí thư mục này, bởi vì bạn nhập mô-đun xử lý từ đó.

Vì bạn biết nhà cung cấp ( qgis) và thuật toán ( explodelines), bạn có thể nhìn vào /home/germap/.qgis2/python/plugins/processing/algs/qgis/để lấy tên tập lệnh phát nổ: Explode.pyThông tin này cho phép bạn nhập thuật toán trực tiếp vào tập lệnh độc lập Python của bạn.

Vì vậy, hãy mở bảng điều khiển Python và sao chép tập lệnh sau (Tôi sử dụng GNU / Linux, để các biến môi trường được đặt theo mặc định, cho phép tôi nhập các thư viện qgis và PyQt4 một cách dễ dàng):

# Prepare the environment
import sys
from PyQt4.QtGui import *
from qgis.core import *
app = QApplication([])
QgsApplication.setPrefixPath("/usr", True)
QgsApplication.initQgis()

# Tell Python where you will get processing from
sys.path.append('/home/germap/.qgis2/python/plugins')

# Reference the algorithm you want to run
from processing.algs.qgis.Explode import *
alg = Explode() 

# Set input and output
inLayer = QgsVectorLayer('/home/user/data/in.shp', 'input', 'ogr')
outLayer = '/home/user/data/out.shp'
alg.setParameterValue('INPUT', inLayer)
alg.setOutputValue('OUTPUT', outLayer)

# Run the algorithm
from processing.core.SilentProgress import SilentProgress
progress = SilentProgress()
alg.processAlgorithm(progress)

Nếu bạn không nhận được thông báo lỗi, đó là nó. Lớp đầu ra đã được lưu trong đường dẫn đầu ra mà bạn đã chỉ định ( /home/user/data/out.shp)

Lưu ý: Liên quan đến một cách chung (nghĩa là gọi các thuật toán theo tên), tôi đã tìm thấy một số rắc rối mà tôi cần giải quyết trước khi đăng nó. Ngay sau khi tôi làm cho nó hoạt động, tôi sẽ đăng nó.

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.