เข้าถึงการประมวลผลด้วย Python หรือไม่


16

ฉันต้องการเข้าถึงฟังก์ชั่นบรรทัดระเบิดใน Pythonนอก QGIS จากสคริปต์แบบสแตนด์อโลน

ฉันต้องโหลดโมดูลใดเพื่อใช้งาน

ฉันจะเข้าถึงได้processingอย่างไร

from qgis.core import *

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

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

2
import processingฉันคิดว่าคุณต้องใช้
โจเซฟ

@Joseph ขออภัยที่ไม่เจาะจง: แต่ฉันต้องการเข้าถึงจากสคริปต์แบบสแตนด์อโลน
ustroetz

ไม่ต้องกังวลหรอก :) ในกรณีนั้นขอโทษ แต่ฉันไม่รู้เหมือนที่ฉันรันใน QGIS เสมอ หวังว่าคนอื่นจะให้คำแนะนำ
โจเซฟ

สวัสดี @ustroetz คุณจัดการให้รันสคริปต์แบบสแตนด์อโลนของคุณหรือไม่ ฉันถามเพราะฉันกำลังพยายามเรียกใช้สคริปต์ภายนอก
Joseph

@Joseph ไม่ฉันไม่ได้
ustroetz

คำตอบ:


25

UPDATE 2018/04/24: ดูวิธีการทำเช่นนี้ใน QGIS v3.x ที่นี่


สำหรับ QGIS v2.x

ในที่สุดก็พบวิธีที่เหมาะสมในการรันอัลกอริทึมการประมวลผลผ่านสคริปต์ PyQGIS แบบสแตนด์อโลน

ใช้ปลั๊กอินการประมวลผลเวอร์ชั่น 2.2.0-2 คุณสามารถลองใช้สคริปต์ต่อไปนี้:

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

เวอร์ชันการประมวลผลที่ใหม่กว่าอาจอยู่ที่/usr/share/qgis/python/pluginsดังนั้นคุณอาจต้องใช้งานให้sys.path.append('/usr/share/qgis/python/plugins')เหมาะสม

ผมพบว่าตัวอย่างการทำงานในข้อผิดพลาด: อัลกอริทึมไม่พบซึ่งเป็นในทางกลับกันบนพื้นฐานQGIS-dev อภิปรายทางรายการ


1
ปลั๊กอินการประมวลผลอาจไม่'/home/user/.qgis2/python/plugins'ทำงาน คุณสามารถค้นหาตำแหน่งโดยเปิด QGIS และคลิกplugins/Manage and install pluginsเลื่อนลงเพื่อประมวลผลและคุณจะเห็นตำแหน่งการติดตั้งในคำอธิบาย
Mr Purple ตั้งแต่

2
ฉันได้รับคำเตือนมากมายเกี่ยวcannot-create-a-qpixmapกับฟังก์ชั่นสแตนด์อะโลนนี้ แต่ฉันเห็นว่าคุณแก้ไขได้เช่นกันในคำถามนี้ gis.stackexchange.com/questions/188074//
Mr Purple

1
คุณสามารถทำให้สคริปต์แบบสแตนด์อโลนเป็นแบบทั่วไปโดยวางlayerInputและเปลี่ยนบรรทัด runalg เป็น: general.runalg(*sys.argv[1:])ไม่ต้องพูดถึงว่าสคริปต์นี้สามารถใช้เป็นพื้นฐานสำหรับการประมวลผล GIS แบบขนานตามคำถามนี้: gis.stackexchange.com/questions/119961/ …
Mr สีม่วง

เป็นไปได้หรือไม่ที่จะทำเฟรมเวิร์กเดียวกัน แต่รัน PLUGINS จาก Python แบบสแตนด์อโลน (ไม่ใช่ภายใน QGIS) ฉันใช้งาน alglist () ฟังก์ชั่นและฉันไม่เห็นปลั๊กอินของฉันติดตั้งใน QGIS ของฉันที่นั่น ...
Irene

3

จนกว่าฉันจะได้รับวิธีการทั่วไปในการทำมันฉันจะบอกวิธีแก้ปัญหาให้คุณ

ฉันใช้ปลั๊กอินการประมวลผลเวอร์ชั่น 2.2.0-2 (ฉันแนะนำให้คุณใช้เวอร์ชั่นนี้) ซึ่งติดตั้งใน/home/germap/.qgis2/python/plugins/คอมพิวเตอร์ของฉัน คุณต้องทราบตำแหน่งโฟลเดอร์นี้เนื่องจากคุณนำเข้าโมดูลการประมวลผลจากที่นั่น

เนื่องจากคุณรู้จักผู้ให้บริการ ( qgis) และอัลกอริทึม ( explodelines) คุณสามารถดูที่/home/germap/.qgis2/python/plugins/processing/algs/qgis/จะใช้ชื่อสคริปต์บรรทัดระเบิด: Explode.pyข้อมูลนี้ช่วยให้คุณสามารถนำเข้าอัลกอริทึมไปยังสคริปต์ Python แบบสแตนด์อโลนได้โดยตรง

ดังนั้นเปิดคอนโซล Python และคัดลอกสคริปต์ต่อไปนี้ (ฉันใช้ GNU / Linux ดังนั้นตัวแปรสภาพแวดล้อมจะถูกตั้งค่าตามค่าเริ่มต้นทำให้ฉันสามารถนำเข้า qgis และ PyQt4 ไลบรารี่ได้อย่างรวดเร็ว):

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

หากคุณไม่ได้รับข้อความแสดงข้อผิดพลาด เลเยอร์เอาต์พุตถูกบันทึกในพา ธ เอาต์พุตที่คุณระบุ ( /home/user/data/out.shp)

หมายเหตุ: เกี่ยวกับวิธีทั่วไป (เช่นการเรียกอัลกอริทึมตามชื่อ) ฉันพบปัญหาบางอย่างที่ฉันต้องแก้ไขก่อนโพสต์ ทันทีที่ฉันไปทำงานฉันจะโพสต์

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.