QGIS 및 환경 변수를 사용하는 독립형 애플리케이션


12

나는 사람들이 이것으로 나를 도울 수 있는지 알아보기 위해 IRC를 통과하려고 시도했지만 매체는 대답을 명확하게하기에는 약간 어색한 것처럼 보이므로 대신 시도해 보겠습니다.

ArcPy를 사용하여 이미 독립 실행 형 응용 프로그램을 프로그래밍 할 수있는 방식으로 PyQGIS를 사용하여 독립 실행 형 응용 프로그램을 프로그래밍하고 싶습니다.

PyQGIS 자체는 간단합니다. QGIS 콘솔 편집기에서 Python 스크립트를 실행하는 데 어려움이 없었습니다. 그러나 독립 실행 형 스크립트에서 Python 바인딩을 사용하려면 배치 스크립트를 사용하여 환경 설정을 변경해야합니다 (집에서 Windows Vista를 사용하고 있으므로 Windows 용 배치 스크립트를 사용하고 있습니다). 배치 스크립팅을 실제로 이해하지 못하기 때문에 결과적으로 혼란스러워졌으며 실행중인 다른 응용 프로그램에 특정 방법이 필요한 환경을 재설정한다는 생각이 마음에 들지 않습니다.

이러한 설정을 만드는 지침이 불필요하게 복잡한 이유와 "바인딩 위치로 이동하여이 프로그램에서 사용할 라이브러리를 사용하도록 설정하는 한 줄의 코드에 해당하지 않는 이유를 이해하는 데 어려움이 있습니다. 물론 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를 만들기 위해해야 ​​할 일을 더 많이 알 것이다. Script Runner 플러그인 명성의 G. 셔먼이 ... QgsApplication에 대한 참조 없이이 코드를 실행하려고 할 때 def run_script 헤더 Script Runner가 필요했을 때 스크립트가 정확히 수행 한 작업을 수행했습니다. 위의 스크립트를 독립 실행 형 스크립트로 보았습니다 ... 창을 만든 다음 즉시 닫습니다. 이것이 내가 계속 환경 변수 문제가 있다고 가정 한 이유 중 일부였습니다.
Zak Klaas

7

PyQGis 문서를 참조하면 PyQGis API를 활용하는 4 가지 주요 방법이 있습니다.

  1. 파이썬 콘솔에서 명령을 통해
  2. 처리 중 Python 스크립트 또는 Gary Sherman 의 ScritRunner 플러그인 사용
  3. QGis 애플리케이션에 대한 사용자 정의 플러그인 개발
  4. QGIS 외부 (파이썬 쉘에서 또는 Tkinter가 아닌 PyQt4로 응용 프로그램 만들기 (Tkinter를 두 번 가져 오는 이유는 무엇입니까?)

그리고 당신은이 마지막 시점에 관심이 있습니다 :

  • PyQGIS를 다른 파이썬 모듈로 사용할 수 있습니다. 그러나 파이썬은 PyQGIS를 어디에서 찾을 수 있는지 모릅니다. 이를 위해서는 PyQGIS 폴더를 PYTHONPATH에 추가해야합니다 (Windows의 경우 Windows 7의 pythonpath에 추가하는 방법? 참조 ).

확실히 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에 대한 독점적 대안으로 묘사하는 것을 아직 들어 보지 못했습니다. 이제는 꽤 잘 알고 있습니다 (위 코드에서 두 번 선언 한 이유는 확실하지 않습니다. 그냥 실수였습니다). PyQt4 튜토리얼에 대한 링크가 도움이 될 것 같습니다. 오늘 실험 한 후 콘솔 편집기를 사용하여 문제를 해결하고 스크립트에서 QGIS GUI의 창을 최소화하도록 선택하여 QGIS 가 백그라운드에서 실행되는 스크립트 창의 창이 독립형으로 표시 됩니다. 4 가지 가능성 목록에서
Zak Klaas
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.