使用QGIS和环境变量的独立应用程序


12

我已经尝试过通过IRC来查看人们是否可以帮助我解决这个问题,但是该媒介似乎对于弄清任何答案都有些笨拙,因此我将尝试使用它。

我想使用已经可以使用ArcPy对独立应用程序进行编程的方式,使用PyQGIS对独立应用程序进行编程。

PyQGIS本身很简单。我在使用QGIS控制台编辑器中运行Python脚本时没有遇到困难。但是,为了在独立脚本中使用Python绑定,建议我必须使用批处理脚本更改环境设置(我在家中使用Windows Vista,因此我们正在讨论Windows的批处理脚本)。这最终导致一团糟,因为我不太了解批处理脚本,而且我不喜欢这样的想法,即我正在重置一种环境,该环境必须以某种方式运行我的其他应用程序。

我很难理解为什么创建这些设置的指令如此不必要地复杂,以及为什么它们不等于一行代码说“转到绑定位置,使我想要的库可供该程序使用” )。当然,ArcPy不需要人们去弄乱计算机的环境设置,所以我很难理解PyQGIS的原因,在我看来,人们只会放弃而不是自学Windows批处理脚本语言。

现在,我注意到当我在QGIS的控制台编辑器中运行脚本时,它可以工作。当然,在脚本运行后,它也会使其余QGIS无法使用,因此我必须在此后再次重新启动QGIS,但是该脚本的工作方式与我编程的完全相同。但是,当我在QGIS应用程序之外执行此操作时,事实并非如此。问题似乎不是我未能导入由QGIS应用程序自动导入的某些Python软件包(qgis.core和qgis.utils)-我的独立脚本中包含了这些import语句,以及所有其他软件包都导入了脚本要求。这使我相信,不同之处在于QGIS应用程序正确设置了外部环境变量,但是当我将其作为独立脚本运行时,这些变量没有正确设置。

另外,当我将脚本作为独立脚本运行时,它可以遍历所有代码而不会引发错误。它根本不执行代码命令。当我在控制台编辑器中运行脚本时,它可以正确完成所有操作。当我独立运行它时,它将创建一个窗口,然后立即销毁它,而不会引发任何错误。因此,解释员理解我要脚本执行的所有操作-它只是不会执行。

这是脚本:

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

请...有什么方法可以在QGIS外部运行此脚本,并使它像在QGIS中一样正常运行(理想情况下无需关闭所有内容)?

QGIS是一个很棒的程序,PyQGIS看起来和ArcPy一样直观,并且对于拥有开源软件来说将是一个真正的优势-但是如果人们不得不经历我已经经历的所有麻烦,并且仍然没有独立的应用程序访问PyQGIS库的方式就像访问ArcPy一样,在我看来PyQGIS对人们来说并没有太大用处。我希望我错了,这比迄今为止要容易。有没有人有办法解决吗?

Answers:


6

您必须使用以下命令启动Qt事件循环:

app.exec_()

我将删除QgsApplication.exitQgis()。理想情况下,应在连接到应用程序的lastWindowClosed()信号的插槽中进行处理。


很高兴知道。我将全力以赴阅读PyQt4,以便我进一步了解在以后的工作中制作任何GUI所需要做的事情。如果Script Runner插件的G.Sherman一举成名...当我尝试运行此代码时没有注意到QgsApplication的任何引用,并且注意到def run_script标头Script Runner需要时,我注意到了,我的脚本确实在执行此操作我尝试将上面显示的脚本作为独立脚本...创建一个窗口,然后立即将其关闭。这就是为什么我认为我遇到持续的环境变量问题的原因之一。
Zak Klaas

7

查阅PyQGis文档,您会发现有四种主要的方法来利用PyQGis API:

  1. 通过Python控制台中的命令
  2. 通过Processing中的Python脚本或Gary Sherman 的ScritRunner插件
  3. 通过开发QGis应用程序的自定义插件
  4. 在QGIS外部(在Python Shell中或使用PyQt4而不是Tkinter创建应用程序(为什么要两次导入Tkinter?)

您对最后一点感兴趣:

当然,ArcPy不需要人们去弄乱计算机的环境设置,因此我很难理解PyQGIS为何这么做

因为在其他情况下,因为您使用的是Python版本的ArcGIS,所以也是如此,例如,在Windows上使用arcpy在arcmap之外或将PyScripter配置为与QGIS一起使用(并仍然使用arcpy)

您在这里不需要PyQt4,Tkinter或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()))
  • 您可以创建一个应用程序。您在这里需要PyQt4(而不是Tkinter)和qgis.gui。

我想使用已经可以使用ArcPy对独立应用程序进行编程的方式,使用PyQGIS对独立应用程序进行编程。

因此,为此,您必须学习PyQt4,例如,必须学习Tkinter(或wxPython)。这是另一个问题:gsherman提供的解决方案是PyQt4的问题,而不是PyQGIS的问题(例如,请参阅PyQt4教程)。


谢谢。我还没有听说有人将PyQt4描述为Tkinter的一种独家替代品,现在我已经知道了(不确定为什么我在上面的代码中两次声明了它……这只是一个错误)。您到PyQt4教程的链接似乎将非常有帮助。经过今天的试验,我选择通过控制台编辑器解决问题,并让脚本最小化QGIS GUI的窗口,因此我的脚本窗口似乎是独立的,并且QGIS在后台运行-所以我猜这是数字1在您列出的4种可能性中。
Zak Klaas
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.