Các ứng dụng độc lập sử dụng QGIS và các biến môi trường


12

Tôi đã thử đi qua IRC để xem mọi người có thể giúp tôi giải quyết vấn đề này không, nhưng phương tiện có vẻ hơi vụng về để làm cho bất kỳ câu trả lời rõ ràng, vì vậy tôi sẽ thử thay thế.

Tôi muốn lập trình một ứng dụng độc lập bằng PyQGIS theo cách tôi có thể lập trình các ứng dụng độc lập bằng ArcPy.

PyQGIS là đơn giản. Tôi không gặp khó khăn gì khi chạy các tập lệnh Python trong trình soạn thảo bảng điều khiển QGIS. Tuy nhiên, để sử dụng các ràng buộc Python trong một tập lệnh độc lập, tôi khuyên tôi phải thay đổi cài đặt môi trường bằng tập lệnh bó (Tôi đang sử dụng Windows Vista tại nhà, vì vậy chúng tôi đang nói về kịch bản hàng loạt cho Windows). Điều này đã dẫn đến một mớ hỗn độn về phía tôi, vì tôi không thực sự hiểu được kịch bản hàng loạt và tôi không thích ý tưởng rằng tôi đang đặt lại một môi trường cần phải là một cách nhất định cho các ứng dụng khác mà tôi chạy.

Tôi đang gặp khó khăn để hiểu tại sao các hướng dẫn tạo các cài đặt này lại phức tạp đến mức không cần thiết và tại sao chúng không có một dòng mã nói "hãy đến nơi liên kết, làm cho các thư viện tôi muốn có sẵn cho chương trình này để sử dụng ) Chắc chắn ArcPy không yêu cầu mọi người phải loay hoay với các cài đặt môi trường của máy tính, vì vậy tôi gặp khó khăn trong việc hiểu tại sao PyQGIS lại làm như vậy. Có vẻ như mọi người sẽ bỏ cuộc thay vì tự học Ngôn ngữ lập trình Windows Batch.

Bây giờ, tôi nhận thấy rằng khi tôi chạy một tập lệnh trong trình soạn thảo bảng điều khiển của QGIS, nó sẽ hoạt động. Cấp, nó cũng làm cho phần còn lại của QGIS không thể sử dụng được sau khi tập lệnh chạy, do đó tôi phải khởi động lại QGIS sau đó, nhưng tập lệnh hoạt động chính xác như tôi đã lập trình để nó hoạt động. Nhưng khi tôi làm như vậy bên ngoài ứng dụng QGIS thì không. Vấn đề không xuất hiện là tôi đã không nhập được một số gói Python được ứng dụng QGIS nhập tự động (qgis.core và qgis.utils) - Tôi có các báo cáo nhập đó trong tập lệnh độc lập của mình, cùng với tất cả các gói khác nhập kịch bản yêu cầu. Điều này khiến tôi tin rằng sự khác biệt là ứng dụng QGIS đặt chính xác các biến môi trường bên ngoài, nhưng các biến đó không được đặt đúng khi tôi chạy nó dưới dạng một tập lệnh độc lập.

Ngoài ra, khi tôi chạy tập lệnh dưới dạng tập lệnh độc lập, nó sẽ thông qua tất cả các mã mà không gây ra lỗi; nó chỉ đơn giản là không làm những gì các lệnh mã. Khi tôi chạy tập lệnh trong trình soạn thảo giao diện điều khiển, nó thực hiện tất cả chính xác. Khi tôi chạy nó dưới dạng độc lập, nó sẽ tạo ra một cửa sổ, sau đó ngay lập tức phá hủy nó, trong khi ném không có lỗi. Vì vậy, intepreter hiểu tất cả mọi thứ tôi yêu cầu kịch bản thực hiện - nó sẽ không làm điều đó.

Đây là kịch bản:

from PyQt4 import *
from PyQt4 import *
from PyQt4.QtCore import *
from PyQt4.QtGui import *
from qgis.core import *
from qgis.gui import *
from qgis.utils import *
import Tkinter
from Tkinter import *
import sys
import os

qgishome = "c:/OSGeo4W/apps/qgis/"
app = QgsApplication([], True)
QgsApplication.setPrefixPath(qgishome, True)
QgsApplication.initQgis()

canvas = QgsMapCanvas()
canvas.setCanvasColor(Qt.yellow)
canvas.enableAntiAliasing(True)
canvas.show()

layer = QgsVectorLayer(r"c:/GIS Data/fed308/cpc.shp", "Ridings", "ogr")
reg = QgsMapLayerRegistry.instance()
reg.addMapLayer(layer)
canvas.setExtent(layer.extent())
canvas.setLayerSet([QgsMapCanvasLayer(layer)])
QgsApplication.exitQgis()

Xin vui lòng ... có một số cách tôi có thể chạy tập lệnh này bên ngoài QGIS và để nó hoạt động như trong QGIS (lý tưởng nhất là không tắt mọi thứ ở cuối)?

QGIS là một chương trình tuyệt vời và PyQGIS có vẻ trực quan như ArcPy và sẽ là một lợi thế thực sự cho một phần mềm nguồn mở - nhưng nếu mọi người phải trải qua tất cả các vòng tôi đã trải qua, và vẫn chưa có ứng dụng độc lập truy cập vào thư viện PyQGIS theo cách họ có quyền truy cập vào ArcPy, đối với tôi, PyQGIS sẽ không được sử dụng nhiều cho mọi người. Tôi hy vọng tôi đã sai và điều này dễ dàng hơn cho đến nay. Có ai có giải pháp không?

Câu trả lời:


6

Bạn phải bắt đầu vòng lặp sự kiện Qt bằng cách sử dụng:

app.exec_()

Tôi sẽ xóa QssApplication.exitQgis (). Nó nên được xử lý một cách lý tưởng trong một khe được kết nối với tín hiệu lastWindowCloses () của ứng dụng.


Tốt để biết. Tôi sẽ hướng năng lượng của mình vào việc đọc lên PyQt4 để tôi biết thêm những gì tôi cần làm để thực hiện bất kỳ GUI nào tôi cố gắng trong công việc sau này. Nếu G. Sherman của plugin Script Runner nổi tiếng ... Tôi nhận thấy khi tôi đang cố chạy mã này mà không có bất kỳ tham chiếu nào đến QssApplication và với tiêu đề Def run_script Script Runner cần, kịch bản của tôi đã làm chính xác những gì nó đang làm khi Tôi đã thử tập lệnh như được hiển thị ở trên dưới dạng tập lệnh độc lập ... tạo một cửa sổ và sau đó đóng ngay lập tức. Đây là một phần lý do tại sao tôi cho rằng tôi đang tiếp tục gặp vấn đề về biến môi trường.
Zak Klaas

7

Tư vấn tài liệu PyQGis, bạn sẽ thấy rằng có bốn cách chính để sử dụng API PyQGis:

  1. thông qua các lệnh trong bảng điều khiển Python
  2. thông qua các tập lệnh Python trong Đang xử lý hoặc với plugin ScritRunner của Gary Sherman
  3. thông qua việc phát triển các plugin tùy chỉnh cho ứng dụng QGis
  4. bên ngoài QGIS (trong trình bao Python hoặc tạo ứng dụng với PyQt4 chứ không phải Tkinter (tại sao nhập Tkinter hai lần?)

và bạn quan tâm đến điểm cuối cùng này:

  • bạn có thể sử dụng PyQGIS như bất kỳ mô-đun Python nào khác. Nhưng Python không biết tìm PyQGIS ở đâu. Để làm được điều đó, bạn cần thêm thư mục PyQGIS vào PYTHONPATH (đối với Windows, hãy xem Cách thêm vào pythonpath trong windows 7? ).

Chắc chắn ArcPy không yêu cầu mọi người phải loay hoay với các cài đặt môi trường của máy tính, vì vậy tôi gặp khó khăn để hiểu tại sao PyQGIS lại

Vì bạn sử dụng phiên bản Python của ArcGIS, trong các trường hợp khác, điều tương tự cũng đúng, ví dụ, hãy sử dụng arcpy bên ngoài arcmap hoặc Configure PyScripter để sử dụng với QGIS (và vẫn sử dụng arcpy) trên Windows .

Bạn không cần ở đây PyQt4, Tkinter hoặc qgis.gui:

from qgis.core import *
QgsApplication.setPrefixPath("yourpath", True)
QgsApplication.initQgis()
# or your solution
# read a shapefile 
layer = QgsVectorLayer('your.shp', 'your', 'ogr')
layer.isValid()
True
# loop through layer 
for elem in layer.getFeatures():
    geom= elem.geometry()
    attr =elem.attributes()
    (processing)

 # interaction with other Python module: Shapely, for example
 from shapely.geometry import shape
 from json import loads
 for elem in layer.getFeatures():
       shapely_geometry = shape(loads(elem.geometry().exportToGeoJSON()))
  • bạn có thể tạo một ứng dụng. Bạn cần ở đây PyQt4 (và không phải Tkinter) và qgis.gui.

Tôi muốn lập trình một ứng dụng độc lập bằng PyQGIS theo cách tôi có thể lập trình các ứng dụng độc lập bằng ArcPy.

Vì vậy, để làm được điều đó, bạn phải học PyQt4, vì bạn phải học Tkinter (hoặc wxPython) chẳng hạn. Đây là một vấn đề khác: giải pháp được đưa ra bởi gsherman là vấn đề của PyQt4, không phải của PyQGIS ( ví dụ, xem hướng dẫn của PyQt4 )


Cảm ơn. Tôi chưa từng nghe ai mô tả PyQt4 như một thứ thay thế độc quyền cho Tkinter, mà bây giờ tôi biết khá rõ (không biết tại sao tôi lại tuyên bố hai lần trong đoạn mã trên ... đó chỉ là một lỗi). Liên kết của bạn đến hướng dẫn PyQt4 có vẻ như nó sẽ rất hữu ích. Sau khi thử nghiệm ngày hôm nay, tôi đã chọn giải quyết vấn đề của mình bằng trình chỉnh sửa bảng điều khiển và có tập lệnh thu nhỏ cửa sổ GUI GUIIS để cửa sổ của tập lệnh của tôi có vẻ độc lập, với QGIS chạy trong nền - vì vậy tôi đoán đó là số 1 trong danh sách của bạn về 4 khả năng.
Zak Klaas
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.