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

  1. Pertama kita akan melewati proses pembersihan shapfelie secara manual untuk melihat command yang akan kita gunakan pada skript phyton. Luncurkan QGIS dan akses Layer ‣ Add Layer ‣ Add Vector Layer.

../_images/1204.png
  1. Jelajah folder yang berisi shapefile yang belum di unzip dan pilih file roads.shp dan klik Open.

../_images/2169.png
  1. 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 Processing ‣ Toolbox.

../_images/3101.png
  1. Caru tool Reproject layer . Dobel-klik untuk meluncurkan dialog.

../_images/466.png
  1. Pada dialog Reproject layer , pilih layer roads sebagai Input layer .Kita akan menggunakan CRS EPSG:3460 Fiji 1986 / Fiji Map Grid untuk Target CRS . Klik Run.

../_images/564.png
  1. Ketika proses selesai, anda akan melihat layer yang terproyeksi terbuka di QGIS. Akses Processing ‣ History and Log...

../_images/661.png
  1. 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.

../_images/760.png
  1. Kembali ke jendela utama QGIS, klik tombol CRS di sudut bawah kanan.

../_images/858.png
  1. 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.

../_images/957.png
  1. 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.

../_images/1065.png
  1. 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. Pilih Reprojected layer sebagai Layer to clean . Pilih snap sebagai Cleaning tool . Masukkan 1.00 sebagai Threshold . Biarkan field yang lain kosong dan klik Run.

../_images/11104.png
  1. 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 sebuah Errors layer yang akan menandai fitur yang digantikan. Anda dapat menggunakan layer error sebagai panduan dan zoom ini untuk melihat vertices yang terhapus-

../_images/1266.png
  1. Akses dialog Processing ‣ History and Log dan perhatikan command pemrosessan penuh untuk penggunaan dimasa yang akan datang.

../_images/1363.png
  1. 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
../_images/1460.png
  1. 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!'
../_images/1556.png
  1. Pindah ke Desktop anda dan cari lokasi ikon launch.bat . Dobel-klik untuk meluncurkan jendela window yang baru dan jalankan skrip. Jika anda melihat Hello QGIS! tercetak di jendela command, konfigurasi dan pengaturan bekerja dengan baik. Jika anda melihat error atau tidak melihat teks, periksa file launch.bat anda dan pastikan semua path cocok dengan lokasi file pada sistem anda.

../_images/1653.png
  1. 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 jalankan launch.bat kembali. Jika anda melihat Hello 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!'
../_images/1749.png
  1. 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
../_images/1847.png
  1. Jalankan skrip lewat launch.bat dan anda akan melihat path ke layer terproyeksi yang baru.

../_images/1939.png
  1. 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')
../_images/2034.png
  1. 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
../_images/2170.png
  1. Jalankan skrip yang sudah lengkap. Setiap anda menjalankan skrip, sebuah kopian asli dari data akan terunduh dan diproses.

../_images/2233.png
  1. 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.

../_images/2330.png
  1. Beri nama task atau tugas dengan Daily Download and Cleanup dan klik Next.

../_images/2429.png
  1. Pilih Daily as the Trigger untuk Trigger dan klik Next

../_images/2527.png
  1. Tentukan waktu sesuai dengan pilihan anda dan klik Next.

../_images/2624.png
  1. Pilih Start a program sebagai Action dan klik Next.

../_images/2723.png
  1. Klik Browse dan cari lokasi launch.bat . Klik Next.

../_images/2822.png
  1. 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.

../_images/2919.png

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)