Menjalankan dan Menjadwalkan Pekerjaan Pemrosesan QGIS¶
Anda dapat mengotomatisai banyak tugas di QGIS menggunakan skript Python (PyQGIS) dan kerangka pemrosessan. Seringkali, anda akan menjalankan skrip ini secara manual saat QGIS terbuka. Karena itu cukup menolong, sering kali anda membutuhkan sebuah cara untuk menjalankan p-ekerjaan ini melalui command-line dan tidak perlu membuka QGIS. Beruntung, anda dapat menulis skript python tunggal yang menggunakan libraries QGIS dan dapat dijalankan melalui command-line. Pada tutorial ini, kita akan belajar bagaimana menulis dan menjadwalkan sebuah pekerjaan yang menggunakan kerangka pemrosessan QGIS.
Tinjauan Tugas¶
Mari katakan kita bekerja pada sejumlah analisis menggunakan shapefiles dari sebuah wilayah.
Skill lain yang akan anda pelajari¶
Mengunduh dan meng-unzip file menggunjakan Python.
Menjalankan algoritma processing mana saja lewat PyQGIS.
Memperbaiki error topologis pada sebuah layer vektor
Mendapatkan data¶
Geofabrik menyediakan shapefile aktual harian dari dataset OpenStreetMap
Kita akan menggunakan shapefiles for Fiji untuk latihan ini. Unduh fiji-latest.shp.zip dan unzip ke sebuah folder dan disk anda.
Sumber Data [GEOFABRIK]
Prosedur¶
Pertama kita akan melewati proses pembersihan shapfelie secara manual untuk melihat command yang akan kita gunakan pada skript phyton. Luncurkan QGIS dan akses
.
Jelajah folder yang berisi shapefile yang belum di unzip dan pilih file
roads.shp
dan klik Open.
Pertama kita harus mere-proyeksi layer jalan ke sebuah CRS terproyeksi. Ini akan membuat kita menggunakan meters sebagai unit saat melakukan analisis bukan derajat. Buka
.
Caru tool Reproject layer . Dobel-klik untuk meluncurkan dialog.
Pada dialog Reproject layer , pilih layer
roads
sebagai Input layer .Kita akan menggunakan CRSEPSG:3460 Fiji 1986 / Fiji Map Grid
untuk Target CRS . Klik Run.
Ketika proses selesai, anda akan melihat layer yang terproyeksi terbuka di QGIS. Akses
.
Pada dialog History and Log , telusuri folder Algorithm dan pilih entry terakhir. Anda akan melihat command pemrosessan penuh pada panel bawah. Perhatikan bahwa command ini untuk digunakan pada skript kita.
Kembali ke jendela utama QGIS, klik tombol CRS di sudut bawah kanan.
Pada dialog Project Properties | CRS , beri tanda cek pada Enable on-the-fly CRS transformation dan pilih
EPSG:3460 Fiji 1986 / Fiji Map Grid
sebagai CRS. Ini akan memastikan bahwa layer original dan layar terproyeksi akan terbaris secara benar.
Sekarang kita akan menjalankan operasi pembersihan. GRASS memiliki sebuah set ampuh alat pembersihan topologi . Ini tersedia di QGIS lewat algoritma
v.clean
. Cari algoritma ini di Processing Toolbox dan dobel-klik untuk meluncurkan dialog.
Anda dapat membaca lebih dalam tentang berbagai tool dan opsi pada tab Help . Untuk tutorial kali ini, kita akan menggunakan tool
snap
to menghapus vertices duplikat yang berada pada rentang 1 meter satu sama lain. PilihReprojected layer
sebagai Layer to clean . Pilihsnap
sebagai Cleaning tool . Masukkan1.00
sebagai Threshold . Biarkan field yang lain kosong dan klik Run.
Ketika proses selesai, anda akan melihat 2 layer baru ditambahkan ke QGIS.
Cleaned vector layer
adalah layer dengan error topologi yang sudah dikoreski. Anda juga akan memiliki sebuahErrors layer
yang akan menandai fitur yang digantikan. Anda dapat menggunakan layer error sebagai panduan dan zoom ini untuk melihat vertices yang terhapus-
Akses dialog
dan perhatikan command pemrosessan penuh untuk penggunaan dimasa yang akan datang.
Sekarang kita siap untuk melakukan coding Lihat bagian xxx pada tutorial xxx untuk instruksi untuk mensetting teks editor anda atau IDE. Untuk menjalankan skrip python tunggal menggunakan QGIS, kita harus menset beragam opsi konfigurasi. Cara yang baik untuk menjalankan skrip tunggal adalah dengan meluncurkan mereke lewat sebuah file xxx . File ini pertama akan mengatur opsi konfigurasi dengan benar dan kemudian memanggil skript python. Buat sebuah file baru bernama xxx dan masukkan teks berikut. Ubah nilai berdasarkan konfigurasi QGIS anda. Jangan lupa untuk mengganti username dengan username anda pada path yang ada di skript python. Path dalam file ini akan sama dengan sistem anda jika anda menginstall QGIS lewat xx .Simpan file pada desktop anda
Catatan
Pengguna Linux dan Mac perlu itnuk membuat sebuah skrip shell untu mengatur path dan variabel lingkungan.
REM Change OSGEO4W_ROOT to point to the base install folder
SET OSGEO4W_ROOT=C:\OSGeo4W64
SET QGISNAME=qgis
SET QGIS=%OSGEO4W_ROOT%\apps\%QGISNAME%
set QGIS_PREFIX_PATH=%QGIS%
REM Gdal Setup
set GDAL_DATA=%OSGEO4W_ROOT%\share\gdal\
REM Python Setup
set PATH=%OSGEO4W_ROOT%\bin;%QGIS%\bin;%PATH%
SET PYTHONHOME=%OSGEO4W_ROOT%\apps\Python27
set PYTHONPATH=%QGIS%\python;%PYTHONPATH%
REM Launch python job
python c:\Users\Ujaval\Desktop\download_and_clean.py
pause
Membuat sebuah file python yang baru dan masukkan kode berikut. Beri nama
download_and_clean.py
dan simpan pada desktop anda
from qgis.core import *
print 'Hello QGIS!'
Pindah ke Desktop anda dan cari lokasi ikon
launch.bat
. Dobel-klik untuk meluncurkan jendela window yang baru dan jalankan skrip. Jika anda melihatHello QGIS!
tercetak di jendela command, konfigurasi dan pengaturan bekerja dengan baik. Jika anda melihat error atau tidak melihat teks, periksa filelaunch.bat
anda dan pastikan semua path cocok dengan lokasi file pada sistem anda.
Kembali pada editor teks anda , modifikasi skrip
download_and_clean.py
untuk menambah kode berikut. Ini adalah kode bootstrap untuk meluncurkan QGIS. Ini tidak diperlukan jika anda menjalankan skrip di QGIS. Tapi karena kita menjalankannya di luar QGIS, kita perlu menmbah ini di awal. Pastikan anda mengganti username dengan username anda. Setelah melakukan perubahan, simpan file dan jalankanlaunch.bat
kembali. Jika anda melihatHello QGIS!
tercetak, anda sudah siap untuk menambah logika pemrossean pada skrip.
import sys
from qgis.core import *
# Initialize QGIS Application
QgsApplication.setPrefixPath("C:\\OSGeo4W64\\apps\\qgis", True)
app = QgsApplication([], True)
QgsApplication.initQgis()
# Add the path to Processing framework
sys.path.append('c:\\Users\\Ujaval\\.qgis2\\python\\plugins')
# Import and initialize Processing framework
from processing.core.Processing import Processing
Processing.initialize()
import processing
print 'Hello QGIS!'
Panggil kembali command processing yang pertama yang tadi kita simpan dari log. Ini adalah command untuk mereproyeksi sebuah layer. Salin command ke skrip anda dan tambahkan kode tambahan sebagai berikut. Perhatikan bahwa command pemrossesan memberikan path dari layer output sebagai dictionary. Ke akan menyimpan ini sebagai nilai
ret
dan mencetak path le layer yang terproyeksi.
roads_shp_path = "C:\\Users\\Ujaval\\Downloads\\fiji-latest.shp\\roads.shp"
ret = processing.runalg('qgis:reprojectlayer', roads_shp_path, 'EPSG:3460',
None)
output = ret['OUTPUT']
print output
Jalankan skrip lewat
launch.bat
dan anda akan melihat path ke layer terproyeksi yang baru.
Sekarang tamahkan kode untuk membersihkan topologi. Sejak ini adalah output akhir kita, kita akan menambahkan path file output kita pada 2 argument terakhir untuk algoritma
grass.v.clean
. Jika anda membiarkan ini kosong, output akan tercipta di sebuah direktori sementara atau temporer.
processing.runalg("grass:v.clean",
output,
1,
1,
None,
-1,
0.0001,
'C:\\Users\\Ujaval\\Desktop\\clean.shp',
'C:\Users\\Ujaval\\Desktop\\errors.shp')
Jalankan skrip dan akan melihat 2 shapefile naru yang tercipta pada Desktop anda. Selesaikan bagian pemrosesan pada skrip. Mari tambahkan kode untuk mengunduh data dari website asli dan mengunzip file secara otomatis. Kita juga akan menyimpan path untuk mengunzip file dengan sebuah variabel yang dapat kita kirim ke algoritma pemrosesan nantinya. Kita akan perlu mengimpor sejumlah modul tambahan untuk melakukan ini, (Lihat bagian akhir tutorial ini untuk melihat skrip utuh dengan semua perubahan)
import os
import urllib
import zipfile
import tempfile
temp_dir = tempfile.mkdtemp()
download_url = 'http://download.geofabrik.de/australia-oceania/fiji-latest.shp.zip'
print 'Downloading file'
zip, headers = urllib.urlretrieve(download_url)
with zipfile.ZipFile(zip) as zf:
files = zf.namelist()
for filename in files:
if 'roads' in filename:
file_path = os.path.join(temp_dir, filename)
f = open(file_path, 'wb')
f.write(zf.read(filename))
f.close()
if filename == 'roads.shp':
roads_shp_path = file_path
Jalankan skrip yang sudah lengkap. Setiap anda menjalankan skrip, sebuah kopian asli dari data akan terunduh dan diproses.
Untuk mengotomatisasi dalam menjalankan skrip ini secara harian. Kita dapat menggunakan
Task Scheduler
pada Windows. Luncurkan Task Scheduler dan klik Create Basic Task.
Catatan
Pengguna Linux dan Mac dapat menggunakan cron jobs untuk penjadwalan tugas atau schedule task.
Beri nama task atau tugas dengan
Daily Download and Cleanup
dan klik Next.
Pilih
Daily
as the Trigger untuk Trigger dan klik Next
Tentukan waktu sesuai dengan pilihan anda dan klik Next.
Pilih
Start a program
sebagai Action dan klik Next.
Klik Browse dan cari lokasi
launch.bat
. Klik Next.
Klik Finish pada layar akhir untuk menjadwalkan tugas. Sekarang skrip akan secara otomatis jalan pada waktu yang sudah ditentukan untuk memberikan anda kopian asli dari data bersih setiap hari.
Dibawah ini merupakan skrip penuh download_and_clean.py
untuk referensi anda.
import sys
from qgis.core import *
import os
import urllib
import zipfile
import tempfile
# Initialize QGIS Application
QgsApplication.setPrefixPath("C:\\OSGeo4W64\\apps\\qgis", True)
app = QgsApplication([], True)
QgsApplication.initQgis()
# Add the path to Processing framework
sys.path.append('c:\\Users\\Ujaval\\.qgis2\\python\\plugins')
# Import and initialize Processing framework
from processing.core.Processing import Processing
Processing.initialize()
import processing
# Download and unzip the latest shapefile
temp_dir = tempfile.mkdtemp()
download_url = 'http://download.geofabrik.de/australia-oceania/fiji-latest.shp.zip'
print 'Downloading file'
zip, headers = urllib.urlretrieve(download_url)
with zipfile.ZipFile(zip) as zf:
files = zf.namelist()
for filename in files:
if 'roads' in filename:
file_path = os.path.join(temp_dir, filename)
f = open(file_path, 'wb')
f.write(zf.read(filename))
f.close()
if filename == 'roads.shp':
roads_shp_path = file_path
print 'Downloaded file to %s' % roads_shp_path
# Reproject the Roads layer
print 'Reprojecting the roads layer'
ret = processing.runalg('qgis:reprojectlayer', roads_shp_path, 'EPSG:3460', None)
output = ret['OUTPUT']
# Clean the Roads layer
print 'Cleaning the roads layer'
processing.runalg("grass:v.clean",
output,
1,
1,
None,
-1,
0.0001,
'C:\\Users\\Ujaval\\Desktop\\clean.shp',
'C:\Users\\Ujaval\\Desktop\\errors.shp')
print 'Success'
If you want to report any issues with this tutorial, please comment below. (requires GitHub account)