اجرای و زمانبندی مشاغل پردازش QGIS
شما می توانید بسیاری از وظایف را در QGIS با استفاده از برنامه نویسی Python (PyQGIS) و چارچوب پردازش خودکار کنید. بیشتر اوقات، زمانی که QGIS باز است، این اسکریپت ها را به صورت دستی اجرا می کنید. در حالی که مفید است، بسیاری از اوقات شما به راهی برای اجرای این توابع از طریق خط فرمان و بدون نیاز به باز کردن QGIS نیاز دارید. خوشبختانه، شما می توانید اسکریپت های پایتون مستقلی بنویسید که از کتابخانه های QGIS استفاده می کنند و می توانند از طریق خط فرمان اجرا شوند. در این آموزش، نحوه نوشتن و زمان بندی کاری را یاد می گیریم که از چارچوب پردازش QGIS استفاده می کند.
نمای کلی کار
بیایید بگوییم که در حال کار بر روی برخی از تجزیه و تحلیل ها با استفاده از شیپ فایل های یک منطقه هستیم. شکل فایل ها به صورت روزانه به روز می شوند و ما همیشه به آخرین فایل نیاز داریم. اما قبل از اینکه بتوانیم از این فایل ها استفاده کنیم، باید داده ها را پاکسازی کنیم. ما میتوانیم یک کار QGIS راهاندازی کنیم که این فرآیند را خودکار میکند و روزانه آن را اجرا میکند تا شما جدیدترین فایلهای شیپافیل را برای کار خود داشته باشید. ما یک اسکریپت پایتون مستقل می نویسیم که یک شکل فایل را دانلود می کند و عملیات تمیز کردن توپولوژیکی را به صورت روزانه اجرا می کند.
خواهید گرفت
- دانلود و از حالت فشرده خارج کردن فایل ها با استفاده از پایتون
- اجرای هر الگوریتم پردازش از طریق PyQGIS.
- رفع خطاهای توپولوژیکی در لایه برداری
دریافت داده ها
Geofabrik شکل فایل های به روز شده روزانه مجموعه داده های OpenStreetMap را ارائه می دهد .
برای این تمرین از shapefiles برای فیجی استفاده خواهیم کرد . فایل fiji-latest.shp.zip را دانلود کرده و آن را در پوشه ای روی دیسک خود از حالت فشرده خارج کنید.
منبع داده [GEOFABRIK]
- ابتدا فرآیند تمیز کردن shapefile را به صورت دستی اجرا می کنیم تا دستوراتی را که در اسکریپت پایتون استفاده خواهیم کرد یادداشت کنیم. QGIS را راه اندازی کنید و به بروید .

- به پوشه حاوی فایل های شکل خارج شده مراجعه کنید و
roads.shpفایل را انتخاب کنید و روی Open کلیک کنید .

- ابتدا باید لایه roads را به یک CRS Projected دوباره طرح کنیم. این به ما این امکان را می دهد که از متر به عنوان واحد در هنگام انجام تجزیه و تحلیل به جای درجه استفاده کنیم. باز کنید .

- ابزار لایه Reproject را جستجو کنید . روی آن دوبار کلیک کنید تا دیالوگ اجرا شود.

- در گفتگوی لایه Reproject ،
roadsلایه را به عنوان لایه ورودی انتخاب کنید . ما از CRS به عنوان CRS هدف استفاده خواهیم کرد . روی Run کلیک کنید .EPSG:3460 Fiji ۱۹۸۶ / Fiji Map Grid

- پس از پایان فرآیند، لایه بازپروژه شده را خواهید دید که در QGIS بارگذاری شده است. به .

- در گفتگوی History and Log ، پوشه Algorithm را گسترش دهید و آخرین ورودی را انتخاب کنید. دستور پردازش کامل را در پانل پایینی مشاهده خواهید کرد. برای استفاده در اسکریپت به این دستور توجه کنید.

- به پنجره اصلی QGIS برگردید، روی دکمه CRS در گوشه پایین سمت راست کلیک کنید.

- در Project Properties | گفتگوی CRS ، تغییر شکل فعال کردن CRS در پرواز را علامت بزنید و به عنوان CRS انتخاب کنید. این اطمینان حاصل می کند که لایه های اصلی و بازپخش شده ما به درستی ردیف می شوند.
EPSG:3460 Fiji ۱۹۸۶ / Fiji Map Grid

- اکنون عملیات پاکسازی را اجرا می کنیم. GRASS دارای مجموعه بسیار قدرتمندی از ابزارهای تمیز کننده توپولوژیکی است. اینها در QGIS از طریق
v.cleanالگوریتم در دسترس هستند. این الگوریتم را در Processing Toolbox جستجو کنید و روی آن دوبار کلیک کنید تا گفتگو باز شود.

- میتوانید در مورد ابزارها و گزینههای مختلف در تب Help بیشتر بخوانید . برای این آموزش،
snapاز ابزاری برای حذف رئوس تکراری که در فاصله ۱ متری از یکدیگر هستند استفاده خواهیم کرد . به عنوان لایه برای تمیز کردن انتخاب کنید . به عنوان ابزار تمیز کردن انتخاب کنید . به عنوان آستانه وارد کنید . فیلدهای دیگر را خالی بگذارید و روی Run کلیک کنید .Reprojected layersnap1.00

- پس از اتمام پردازش، شاهد اضافه شدن ۲ لایه جدید به QGIS خواهید بود. لایه با خطاهای توپولوژیک اصلاح شد. شما همچنین خواهید داشت که ویژگی های تعمیر شده را برجسته می کند. می توانید از لایه errors به عنوان راهنما استفاده کنید و برای دیدن رئوس حذف شده بزرگنمایی کنید.
Cleaned vector layerErrors layer

- بروید و دستور پردازش کامل را برای استفاده بعدی یادداشت کنید.

- اکنون آماده شروع کدنویسی هستیم. برای دستورالعملهای تنظیم ویرایشگر متن یا IDE، بخش A Text Editor یا Python IDE را در آموزش ساخت افزونه Python ببینید . برای اجرای اسکریپت های پایتون مستقل که از QGIS استفاده می کنند، باید گزینه های پیکربندی مختلفی را تنظیم کنیم. یک راه خوب برای اجرای اسکریپت های مستقل راه اندازی آنها از طریق یک
.batفایل است. این فایل ابتدا گزینه های پیکربندی صحیح را تنظیم می کند و سپس اسکریپت پایتون را فراخوانی می کند. یک فایل جدید با نام ایجاد کنیدlaunch.batو متن زیر را وارد کنید. مقادیر را با توجه به پیکربندی QGIS خود تغییر دهید. فراموش نکنید که نام کاربری را با نام کاربری خود در مسیر اسکریپت پایتون جایگزین کنید. اگر QGIS را از طریق نصب کنید، مسیرهای این فایل در سیستم شما یکسان خواهد بود . فایل را روی دسکتاپ خود ذخیره کنید.OSGeo4W Installer
توجه داشته باشید
کاربران لینوکس و مک باید یک اسکریپت پوسته برای تنظیم مسیرها و متغیرهای محیطی ایجاد کنند.
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

- یک فایل پایتون جدید ایجاد کنید و کد زیر را وارد کنید. فایل را به عنوان نام گذاری کنید
download_and_clean.pyو آن را در دسکتاپ خود ذخیره کنید.
from qgis.core import *
print 'Hello QGIS!'

- به دسکتاپ خود بروید و
launch.batنماد را پیدا کنید. روی آن دوبار کلیک کنید تا یک پنجره فرمان جدید راه اندازی شود و اسکریپت اجرا شود. اگر می بینید که در پنجره فرمان چاپ شده است، پیکربندی و راه اندازی شما به خوبی کار می کند. اگر خطا می بینید یا متن را نمی بینید، فایل خود را بررسی کنید و مطمئن شوید که همه مسیرها با مکان های موجود در سیستم شما مطابقت دارند.Hello QGIS!launch.bat

- در ویرایشگر متن خود،
download_and_clean.pyاسکریپت را تغییر دهید تا کد زیر را اضافه کنید. این کد بوت استرپ برای مقداردهی اولیه QGIS است. اگر اسکریپت را در QGIS اجرا می کنید، اینها غیر ضروری هستند. اما از آنجایی که ما آن را خارج از QGIS اجرا می کنیم، باید اینها را در ابتدا اضافه کنیم. مطمئن شوید که نام کاربری را با نام کاربری خود جایگزین کرده اید. پس از انجام این تغییرات، فایل را ذخیره کرده وlaunch.batدوباره اجرا کنید. اگر چاپ شده را مشاهده کردید ، آماده هستید که منطق پردازش را به اسکریپت اضافه کنید.Hello QGIS!
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!'

- اولین دستور پردازشی را که از لاگ ذخیره کرده بودیم به یاد بیاورید. این دستور پروژه مجدد یک لایه بود. دستور را در اسکریپت خود قرار دهید و کدهای اطراف را به صورت زیر اضافه کنید. توجه داشته باشید که دستورات پردازشی مسیر را به لایه های خروجی به صورت دیکشنری برمی گرداند. ما این را به عنوان
retمقدار ذخیره می کنیم و مسیر لایه reprojected را چاپ می کنیم.
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

- اسکریپت را از طریق اجرا کنید
launch.batو مسیر لایه بازپروژه شده جدید ایجاد شده را خواهید دید.

- حالا کد تمیز کردن توپولوژی را اضافه کنید. از آنجایی که این خروجی نهایی ما است، مسیرهای فایل خروجی را به عنوان ۲ آرگومان آخر برای
grass.v.cleanالگوریتم اضافه می کنیم. اگر این موارد را خالی بگذارید، خروجی در یک دایرکتوری موقت ایجاد می شود.
processing.runalg("grass:v.clean",
output,
۱,
۱,
None,
-۱,
۰٫۰۰۰۱,
'C:\\Users\\Ujaval\\Desktop\\clean.shp',
'C:\Users\\Ujaval\\Desktop\\errors.shp')

- اسکریپت را اجرا کنید و ۲ شکل فایل جدید را روی دسکتاپ خود خواهید دید. این قسمت پردازش اسکریپت را کامل می کند. بیایید کدی را اضافه کنیم تا داده ها را از وب سایت اصلی بارگیری کنیم و آن را به طور خودکار از حالت فشرده خارج کنیم. همچنین مسیر فایل زیپ نشده را در متغیری ذخیره می کنیم که بعداً می توانیم آن را به الگوریتم پردازش منتقل کنیم. برای انجام این کار باید چند ماژول اضافی وارد کنیم. (پایان آموزش را برای اسکریپت کامل با تمام تغییرات ببینید)
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

- اسکریپت تکمیل شده را اجرا کنید. هر بار که اسکریپت را اجرا می کنید، یک نسخه جدید از داده ها دانلود و پردازش می شود.

- برای خودکار کردن اجرای روزانه بر روی این اسکریپت، میتوانیم از آن در ویندوز استفاده کنیم. Task Scheduler را اجرا کنید و روی Create Basic Task کلیک کنید .
Task Scheduler
توجه داشته باشید
کاربران لینوکس و مک می توانند از cron job برای برنامه ریزی وظایف استفاده کنند.

- کار را به عنوان نامگذاری کنید و روی Next کلیک کنید .
Daily Download and Cleanup

Dailyبه عنوان Trigger انتخاب کنید و روی Next کلیک کنید

- زمان مورد نظر خود را انتخاب کنید و روی Next کلیک کنید .

- به عنوان عمل انتخاب کنید و روی Next کلیک کنید .
Start a program

- روی Browse کلیک کنید و
launch.batاسکریپت را پیدا کنید. روی Next کلیک کنید .

- برای برنامه ریزی کار، در آخرین صفحه روی Finish کلیک کنید . اکنون اسکریپت به طور خودکار در زمان مشخص شده راه اندازی می شود تا هر روز یک کپی تازه از داده های پاک شده را در اختیار شما قرار دهد.
در زیر اسکریپت کامل download_and_clean.pyبرای مرجع شما آمده است.
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,
۱,
۱,
None,
-۱,
۰٫۰۰۰۱,
'C:\\Users\\Ujaval\\Desktop\\clean.shp',
'C:\Users\\Ujaval\\Desktop\\errors.shp')
print 'Success'

اگر می خواهید بازخورد بدهید یا تجربه خود را در مورد این آموزش به اشتراک بگذارید، لطفاً در زیر نظر دهید. (به حساب GitHub نیاز دارد)