اجرای الگوریتم های پردازش از طریق پایتون (QGIS3) 

جعبه ابزار پردازش در QGIS شامل مجموعه ای رو به رشد از ابزارهای ژئوپردازش می باشد. جعبه ابزار یک رابط پردازش دسته ای آسان برای اجرای هر الگوریتم بر روی تعداد زیادی ورودی ارائه می دهد. به پردازش دسته ای با استفاده از چارچوب پردازش (QGIS3) مراجعه کنید . اما مواردی وجود دارد که باید کمی منطق سفارشی را در پردازش دسته ای خود بگنجانید. از آنجایی که همه الگوریتم‌های پردازشی را می‌توان به صورت برنامه‌نویسی از طریق API پایتون اجرا کرد، می‌توانید آنها را از طریق کنسول پایتون اجرا کنید. این آموزش نحوه اجرای یک الگوریتم پردازش را از طریق کنسول پایتون برای انجام یک وظیفه پردازش جغرافیایی سفارشی تنها در چند خط کد نشان می دهد. لطفاً آموزش شروع برنامه‌نویسی پایتون (QGIS3) را مرور کنید تا با اصول اولیه محیط اسکریپت‌نویسی پایتون در QGIS آشنا شوید.

مروری بر وظیفه 

ما از ۱۲ لایه شطرنجی شبکه ای که نشان دهنده بارندگی برای هر ماه از سال است استفاده خواهیم کرد و میانگین بارندگی ماهانه را برای همه کدهای پستی در منطقه سیاتل محاسبه خواهیم کرد.

 خواهید گرفت

  • به تمام لایه ها (Raster و Vector) از کنسول پایتون دسترسی داشته باشید و نام آنها را چاپ کنید.
  • لایه های مختلف را با استفاده از اسکریپت پایتون در یک لایه ادغام کنید.

دریافت داده ها 

گروه آب و هوای PRISM مشاهدات آب و هوایی را جمع آوری می کند و داده های آب و هوایی تاریخی و فعلی را برای قاره ایالات متحده ارائه می دهد. به صفحه داده های سال های اخیر بروید و داده های بارش ماهانه سال ۲۰۱۷ را در قالب BIL دانلود کنید.

../../_images/data119.pngپورتال داده های باز شهر سیاتل داده های رایگان و باز را برای شهر فراهم می کند. داده‌های کدهای پستی را در قالب شیپ فایل جستجو و دانلود کنید .

برای راحتی کار، می‌توانید مستقیماً یک کپی از هر دو مجموعه داده را از لینک‌های زیر دانلود کنید:

PRISM_ppt_stable_4kmM3_2017_all_bil.zip

Zip_Codes.zip

منبع داده [PRISM] [CITYOFSEATTLE]

  1. PRISM_ppt_stable_4kmM3_2017_all_bil.zipپوشه را در مرورگر QGIS پیدا کنید و آن را گسترش دهید. این پوشه شامل ۱۲ لایه جداگانه برای هر ماه است. کلید را نگه دارید Ctrlو .bilفایل ها را برای تمام ۱۲ ماه انتخاب کنید. پس از انتخاب، آنها را به بوم بکشید.
../../_images/1140.png

توجه داشته باشید

داده ها در قالب BIL ارائه شده است . هر لایه با مجموعه ای از فایل ها، .bilیک فایل حاوی داده های واقعی، یک .hdrفایل که ساختار داده ها را توصیف می کند و یک .prjفایل حاوی اطلاعات طرح ریزی ارائه می شود. QGIS می تواند .bilفایل را بارگذاری کند و فایل های دیگر را در همان دایرکتوری وجود داشته باشد.

  1. یک کادر محاوره ای Select Transformation of PRISM_ppt_stable_4kmM3_2017_all_bil ظاهر می شود، انتخاب را به حالت پیش فرض رها کرده و روی OK کلیک کنید .
../../_images/2109.png
  1. بعد، Zip_Codes.zipپوشه را پیدا کرده و آن را گسترش دهید. Zip_Codes.shpفایل را روی بوم بکشید .
../../_images/357.png
  1. روی لایه کلیک راست کرده Zip_Codesو Zoom to Layer را انتخاب کنید . چند ضلعی کد پستی را برای شهر سیاتل و مناطق مجاور خواهید دید.
../../_images/429.png
  1. به پردازش ‣ جعبه ابزار بروید .
../../_images/527.png
  1. الگوریتم نمونه برداری از یک لایه شطرنجی با استفاده از چند ضلعی های برداری به عنوان شناخته می شود . الگوریتم را در جعبه ابزار پردازش جستجو کنید . الگوریتم را انتخاب کنید و ماوس خود را روی آن قرار دهید. یک راهنمای ابزار با متن شناسه الگوریتم: ‘native:zonalstatisticsfb’ خواهید دید . به این شناسه توجه کنید که برای فراخوانی این الگوریتم از طریق API پایتون لازم است. برای اجرا روی الگوریتم دوبار کلیک کنید .Zonal statisticsZonal Statistics
../../_images/627.png
  1. ما یک آزمایش دستی الگوریتم را برای یک لایه انجام می دهیم. این یک راه مفید برای بررسی اینکه آیا الگوریتم مطابق انتظار عمل می کند و همچنین راهی آسان برای یافتن نحوه انتقال پارامترها به الگوریتم هنگام استفاده از آن از طریق پایتون است. در گفتگوی Zonal Statistics ، لایه ورودی راZip_Codes به عنوان لایه Raster انتخاب کنید و سایر پارامترها را به حالت پیش فرض رها کنید. برای محاسبه و انتخاب فقط روی دکمه  کنار Statistics کلیک کنید ، سپس روی دکمه  کنار Zonal Statistics کلیک کنید و لایه را به عنوان Click Run ذخیره کنید . PRISM_ppt_stable_4kmM3_201701_bilMeanjanuary_mean.gpkg
../../_images/726.png
  1. پس از اتمام الگوریتم، به تب Log بروید . پارامترهای ورودی که به الگوریتم ارسال شده اند را یادداشت کنید . روی Close کلیک کنید .
../../_images/826.png
  1. اکنون یک لایه جدید january_meanبه بوم اضافه می شود. بیایید نتایج را بررسی کنیم، روی لایه کلیک راست کرده و Open Attribute Table را انتخاب کنید . این الگوریتم خاص لایه ناحیه ورودی را در محل تغییر می دهد و برای هر آماری که انتخاب می شود یک ستون جدید اضافه می کند. از آنجایی که فقط مقدار را انتخاب کرده بودیم Mean، یک ستون جدید با نام _meanبه جدول اضافه می شود. _پیشوند پیش فرض بود . وقتی الگوریتم را برای لایه‌های هر ماه اجرا می‌کنیم، تعیین یک پیشوند سفارشی با شماره ماه مفید خواهد بود تا بتوانیم به راحتی مقادیر میانگین را برای هر ماه شناسایی کنیم (یعنی ۰۱_mean، ۰۲_mean و غیره). تعیین این پیشوند سفارشی در رابط پردازش دسته ای QGIS امکان پذیر نیست و اگر این دستور را با استفاده از آن رابط اجرا کنیم، باید پیشوند سفارشی را برای هر لایه به صورت دستی وارد کنیم. اگر با تعداد زیادی لایه کار می کنید، این می تواند بسیار دست و پا گیر باشد. از این رو، می‌توانیم این منطق سفارشی را با استفاده از API پایتون اضافه کنیم و الگوریتم را در یک حلقه for برای هر لایه اجرا کنیم.
../../_images/926.png
  1. در پنجره اصلی QGIS، به Plugins ‣ Python Console بروید .
../../_images/1034.png
  1. بر روی دکمه نمایش ویرایشگر کلیک کنید . با این کار ویرایشگر پایتون باز می شود که در آن تعدادی کد پایتون را می توان با یک کلیک یک دکمه نوشت و اجرا کرد.
../../_images/1141.png
  1. برای اجرای الگوریتم پردازش از طریق پایتون، باید به نام تمام لایه ها دسترسی داشته باشیم. کد زیر را در ویرایشگر وارد کرده و روی دکمه Play کلیک کنید . نام تمام لایه ها را در کنسول خواهید دید.
root = QgsProject.instance().layerTreeRoot()
for layer in root.children():
  print(layer.name())

../../_images/1235.png

  1. حالا بیایید Meanیک ماه را محاسبه کنیم و یک لایه خروجی ایجاد کنیم. در کد زیر برای خروج از حلقه بعد از اولین اجرا استفاده می شود، با این کار می توانیم میانگین ماه ژانویه را محاسبه کنیم.
import re

root = QgsProject.instance().layerTreeRoot()

input_layer = 'Zip_Codes'
unique_field = 'OBJECTID'

# Iterate through all raster layers
for layer in root.children():
  if layer.name().startswith('PRISM'):
    # Run Zonal Stats algorithm
    # Extract the YYYYMM part of the layer name
    pattern = r'_(\d+)_'
    matches = re.findall(pattern, layer.name())
    # Use the month as the prefix
    prefix = matches[0][-2:]
    params = {'INPUT_RASTER': layer.name(),
        'RASTER_BAND': 1, 'INPUT': input_layer,
        'COLUMN_PREFIX': prefix+'_', 'STATISTICS': [2],
        'OUTPUT': 'memory:'
        }
    result = processing.run("native:zonalstatisticsfb", params)

    result_layer = result['OUTPUT']
    QgsProject.instance().addMapLayer(result_layer)
    # Breaking out of loop to demonstrate the
    # zonalstatistics algorithm.
    break

../../_images/1333.png

توجه داشته باشید

همچنین می توانید یک الگوریتم پردازش QGIS را از طریق پایتون با استفاده از تابع processing.runAndLoadResults به جای processing.run() همانطور که در بالا نشان داده شده است اجرا کنید – که نتیجه را مستقیماً در بوم QGIS بارگذاری می کند.

  1. یک لایه جدید outputبه بوم اضافه می شود، روی لایه کلیک راست کرده و Open Attribute Table را انتخاب کنید . ۰۱_mean نشان دهنده میانگین یک ماه است، به همین ترتیب الگوریتم فوق در صورت اجرا بدون وقفه، ۱۲ لایه جدید تولید می کند.
../../_images/1431.png
  1. اکنون اجازه می‌دهیم کدی را برای ادغام میانگین ماه‌ها اضافه کنیم و یک لایه خروجی از آن ایجاد کنیم. ما کد قبلی را به روز می کنیم تا الگوریتم آمار منطقه ای را به طور مکرر اجرا کنیم. ما یک متغیر جدید تعریف می کنیم result_layerکه Zip_Codesدر ابتدا روی آن تنظیم شده است اما با لایه خروجی از هر تکرار به روز می شود. این به ما امکان می دهد از نتیجه هر تکرار استفاده کنیم و ستون های جدیدی به آن اضافه کنیم. کد زیر را وارد کنید تا روی تمام لایه های شطرنجی تکرار شود و یک لایه واحد حاوی معنی تمام ماه ها ایجاد کنید.
import re

root = QgsProject.instance().layerTreeRoot()

input_layer = 'Zip_Codes'
result_layer = input_layer
unique_field = 'OBJECTID'

# Iterate through all raster layers
for layer in root.children():
  if layer.name().startswith('PRISM'):
    # Run Zonal Stats algorithm
    # Extract the YYYYMM part of the layer name
    pattern = r'_(\d+)_'
    matches = re.findall(pattern, layer.name())
    # Use the month as the prefix
    prefix = matches[0][-2:]
    params = {'INPUT_RASTER': layer.name(),
        'RASTER_BAND': 1, 'INPUT': result_layer,
        'COLUMN_PREFIX': prefix+'_', 'STATISTICS': [2],
        'OUTPUT': 'memory:'
        }
    result = processing.run("native:zonalstatisticsfb", params)

    # Update the result_layer variable
    # The result will be used as input for the next iteration
    result_layer = result['OUTPUT']

QgsProject.instance().addMapLayer(result_layer)

../../_images/1526.png

  1. پس از پایان پردازش، یک لایه جدید outputبه بوم اضافه می شود، روی لایه کلیک راست کرده و Open Attribute Table را انتخاب کنید .
../../_images/1625.png
  1. ۱۲ ستون جدید با پیشوندهای سفارشی و مقادیر میانگین بارش استخراج شده از لایه های شطرنجی به جدول اضافه می شوند.
../../_images/1726.png

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


دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

خانهدربارهتماسارتباط با ما