QGISと環境変数を使用したスタンドアロンアプリケーション


12

IRCを介して人々がこれを手伝ってくれるかどうかを確認しようとしましたが、メディアは答えを明確にするために少し不器用に思えますので、代わりにこれを試します。

すでにArcPyを使用してスタンドアロンアプリケーションをプログラミングできる方法で、PyQGISを使用してスタンドアロンアプリケーションをプログラミングしたいと思います。

PyQGIS自体は簡単です。QGISコンソールエディター内でPythonスクリプトを実行するのに問題はありませんでした。ただし、スタンドアロンスクリプトでPythonバインディングを使用するには、バッチスクリプトを使用して環境設定を変更する必要があることをお勧めします(私は自宅でWindows Vistaを使用しているため、Windowsのバッチスクリプトについて話します)。バッチスクリプトを実際に理解していないため、これは混乱の原因になりました。また、実行している他のアプリケーションに特定の方法を必要とする環境をリセットしているという考えが嫌いです。

これらの設定を作成するための指示が不必要に複雑である理由と、「バインディングのある場所に移動し、このプログラムで使用できるライブラリを作成する」という1行のコードにならない理由を理解するのが困難です)。確かに、ArcPyはコンピューターの環境設定をいじり回す必要がないので、PyQGISがなぜそうするのかを理解するのが困難です。

今、QGISのコンソールエディターでスクリプトを実行すると、それが機能することに気付きました。確かに、スクリプトの実行後にQGISの残りの部分が使用できなくなるため、後でQGISを再起動する必要がありますが、スクリプトは動作するようにプログラムしたとおりに動作します。しかし、私がQGISアプリケーションの外でそうするとき、それはしません。問題は、QGISアプリケーション(qgis.coreおよびqgis.utils)によって自動的にインポートされたPythonパッケージのインポートに失敗したことではないようです。スクリプトが必要です。これにより、違いは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は人々にはあまり役に立たないようです。私が間違っていることを望み、これはこれまでよりも簡単です。誰にも解決策がありますか?

回答:


6

以下を使用してQtイベントループを開始する必要があります。

app.exec_()

QgsApplication.exitQgis()を削除します。理想的には、アプリケーションのlastWindowClosed()シグナルに接続されているスロットで処理する必要があります。


知っておくといい。PyQt4を読み上げることに力を注ぐので、今後の作業でGUIを作成するために何をする必要があるかをもっと理解できます。スクリプトランナープラグインのG.上記のスタンドアロンスクリプトとしてのスクリプトを試していました...ウィンドウを作成し、すぐに閉じました。これは、環境変数の問題が続いていると思った理由の一部でした。
ザッククラース

7

PyQGisのドキュメントを参照すると、PyQGis APIを利用する主な方法が4つあることがわかります。

  1. Pythonコンソールのコマンド経由
  2. ProcessingのPythonスクリプト経由、またはGary ShermanのScritRunnerプラグイン経由
  3. QGisアプリケーションへのカスタムプラグインの開発を介して
  4. QGISの外部(Pythonシェルで、またはTkinterではなくPyQt4でアプリケーションを作成します(なぜTkinterを2回インポートするのですか?)

そして、あなたはこの最後の点に興味があります:

確かに、ArcPyはコンピューターの環境設定をいじる必要がないため、PyQGISがなぜそうするのかを理解するのが難しい

PythonバージョンのArcGISを使用しているため、他の場合でも同じことが言えます。たとえばarcmapの外部でarcpyを使用する、WindowsでQGISで使用する(およびarcpyを使用する)PyScripterを構成します

ここでは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を使用してスタンドアロンアプリケーションをプログラミングしたいと思います。

ですから、そのためには、例えばTkinter(またはwxPython)を学ばなければならないので、PyQt4を学ばなければなりません。これは別の問題です:gshermanによって与えられる解決策は、PyQGISの問題ではなく、PyQt4の問題です(たとえば、PyQt4チュートリアルをご覧ください


ありがとう。PyQt4をTkinterの一種の排他的な代替物として説明する人はまだいませんでしたが、今ではよく知っています(上記のコードで2回宣言した理由はわかりません...それは単なる間違いでした)。PyQt4チュートリアルへのリンクは非常に役立つようです。今日の実験の後、コンソールエディターを使用して問題を解決し、スクリプトでQGIS GUIのウィンドウを最小化して、スクリプトのウィンドウバックグラウンドで実行されているスタンドアロンのように見えるようにしました。 4つの可能性のリスト。
ザッククラース
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.