اجرای الگوریتم های پردازش از طریق پایتون (QGIS3)
جعبه ابزار پردازش در QGIS شامل مجموعه ای رو به رشد از ابزارهای ژئوپردازش می باشد. جعبه ابزار یک رابط پردازش دسته ای آسان برای اجرای هر الگوریتم بر روی تعداد زیادی ورودی ارائه می دهد. به پردازش دسته ای با استفاده از چارچوب پردازش (QGIS3) مراجعه کنید . اما مواردی وجود دارد که باید کمی منطق سفارشی را در پردازش دسته ای خود بگنجانید. از آنجایی که همه الگوریتمهای پردازشی را میتوان به صورت برنامهنویسی از طریق API پایتون اجرا کرد، میتوانید آنها را از طریق کنسول پایتون اجرا کنید. این آموزش نحوه اجرای یک الگوریتم پردازش را از طریق کنسول پایتون برای انجام یک وظیفه پردازش جغرافیایی سفارشی تنها در چند خط کد نشان می دهد. لطفاً آموزش شروع برنامهنویسی پایتون (QGIS3) را مرور کنید تا با اصول اولیه محیط اسکریپتنویسی پایتون در QGIS آشنا شوید.
مروری بر وظیفه
ما از ۱۲ لایه شطرنجی شبکه ای که نشان دهنده بارندگی برای هر ماه از سال است استفاده خواهیم کرد و میانگین بارندگی ماهانه را برای همه کدهای پستی در منطقه سیاتل محاسبه خواهیم کرد.
خواهید گرفت
- به تمام لایه ها (Raster و Vector) از کنسول پایتون دسترسی داشته باشید و نام آنها را چاپ کنید.
- لایه های مختلف را با استفاده از اسکریپت پایتون در یک لایه ادغام کنید.
دریافت داده ها
گروه آب و هوای PRISM مشاهدات آب و هوایی را جمع آوری می کند و داده های آب و هوایی تاریخی و فعلی را برای قاره ایالات متحده ارائه می دهد. به صفحه داده های سال های اخیر بروید و داده های بارش ماهانه سال ۲۰۱۷ را در قالب BIL دانلود کنید.
پورتال داده های باز شهر سیاتل داده های رایگان و باز را برای شهر فراهم می کند. دادههای کدهای پستی را در قالب شیپ فایل جستجو و دانلود کنید .
برای راحتی کار، میتوانید مستقیماً یک کپی از هر دو مجموعه داده را از لینکهای زیر دانلود کنید:
PRISM_ppt_stable_4kmM3_2017_all_bil.zip
منبع داده [PRISM] [CITYOFSEATTLE]
PRISM_ppt_stable_4kmM3_2017_all_bil.zip
پوشه را در مرورگر QGIS پیدا کنید و آن را گسترش دهید. این پوشه شامل ۱۲ لایه جداگانه برای هر ماه است. کلید را نگه دارید Ctrlو.bil
فایل ها را برای تمام ۱۲ ماه انتخاب کنید. پس از انتخاب، آنها را به بوم بکشید.
توجه داشته باشید
داده ها در قالب BIL ارائه شده است . هر لایه با مجموعه ای از فایل ها، .bil
یک فایل حاوی داده های واقعی، یک .hdr
فایل که ساختار داده ها را توصیف می کند و یک .prj
فایل حاوی اطلاعات طرح ریزی ارائه می شود. QGIS می تواند .bil
فایل را بارگذاری کند و فایل های دیگر را در همان دایرکتوری وجود داشته باشد.
- یک کادر محاوره ای Select Transformation of PRISM_ppt_stable_4kmM3_2017_all_bil ظاهر می شود، انتخاب را به حالت پیش فرض رها کرده و روی OK کلیک کنید .
- بعد،
Zip_Codes.zip
پوشه را پیدا کرده و آن را گسترش دهید.Zip_Codes.shp
فایل را روی بوم بکشید .
- روی لایه کلیک راست کرده
Zip_Codes
و Zoom to Layer را انتخاب کنید . چند ضلعی کد پستی را برای شهر سیاتل و مناطق مجاور خواهید دید.
- به بروید .
- الگوریتم نمونه برداری از یک لایه شطرنجی با استفاده از چند ضلعی های برداری به عنوان شناخته می شود . الگوریتم را در جعبه ابزار پردازش جستجو کنید . الگوریتم را انتخاب کنید و ماوس خود را روی آن قرار دهید. یک راهنمای ابزار با متن شناسه الگوریتم: ‘native:zonalstatisticsfb’ خواهید دید . به این شناسه توجه کنید که برای فراخوانی این الگوریتم از طریق API پایتون لازم است. برای اجرا روی الگوریتم دوبار کلیک کنید .
Zonal statistics
Zonal Statistics
- ما یک آزمایش دستی الگوریتم را برای یک لایه انجام می دهیم. این یک راه مفید برای بررسی اینکه آیا الگوریتم مطابق انتظار عمل می کند و همچنین راهی آسان برای یافتن نحوه انتقال پارامترها به الگوریتم هنگام استفاده از آن از طریق پایتون است. در گفتگوی Zonal Statistics ، لایه ورودی را
Zip_Codes
به عنوان لایه Raster انتخاب کنید و سایر پارامترها را به حالت پیش فرض رها کنید. برای محاسبه و انتخاب فقط روی دکمه … کنار Statistics کلیک کنید ، سپس روی دکمه … کنار Zonal Statistics کلیک کنید و لایه را به عنوان Click Run ذخیره کنید .PRISM_ppt_stable_4kmM3_201701_bil
Mean
january_mean.gpkg
- پس از اتمام الگوریتم، به تب Log بروید . پارامترهای ورودی که به الگوریتم ارسال شده اند را یادداشت کنید . روی Close کلیک کنید .
- اکنون یک لایه جدید
january_mean
به بوم اضافه می شود. بیایید نتایج را بررسی کنیم، روی لایه کلیک راست کرده و Open Attribute Table را انتخاب کنید . این الگوریتم خاص لایه ناحیه ورودی را در محل تغییر می دهد و برای هر آماری که انتخاب می شود یک ستون جدید اضافه می کند. از آنجایی که فقط مقدار را انتخاب کرده بودیمMean
، یک ستون جدید با نام_mean
به جدول اضافه می شود._
پیشوند پیش فرض بود . وقتی الگوریتم را برای لایههای هر ماه اجرا میکنیم، تعیین یک پیشوند سفارشی با شماره ماه مفید خواهد بود تا بتوانیم به راحتی مقادیر میانگین را برای هر ماه شناسایی کنیم (یعنی ۰۱_mean، ۰۲_mean و غیره). تعیین این پیشوند سفارشی در رابط پردازش دسته ای QGIS امکان پذیر نیست و اگر این دستور را با استفاده از آن رابط اجرا کنیم، باید پیشوند سفارشی را برای هر لایه به صورت دستی وارد کنیم. اگر با تعداد زیادی لایه کار می کنید، این می تواند بسیار دست و پا گیر باشد. از این رو، میتوانیم این منطق سفارشی را با استفاده از API پایتون اضافه کنیم و الگوریتم را در یک حلقه for برای هر لایه اجرا کنیم.
- در پنجره اصلی QGIS، به بروید .
- بر روی دکمه نمایش ویرایشگر کلیک کنید . با این کار ویرایشگر پایتون باز می شود که در آن تعدادی کد پایتون را می توان با یک کلیک یک دکمه نوشت و اجرا کرد.
- برای اجرای الگوریتم پردازش از طریق پایتون، باید به نام تمام لایه ها دسترسی داشته باشیم. کد زیر را در ویرایشگر وارد کرده و روی دکمه Play کلیک کنید . نام تمام لایه ها را در کنسول خواهید دید.
root = QgsProject.instance().layerTreeRoot() for layer in root.children(): print(layer.name())
- حالا بیایید
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
توجه داشته باشید
همچنین می توانید یک الگوریتم پردازش QGIS را از طریق پایتون با استفاده از تابع processing.runAndLoadResults به جای processing.run() همانطور که در بالا نشان داده شده است اجرا کنید – که نتیجه را مستقیماً در بوم QGIS بارگذاری می کند.
- یک لایه جدید
output
به بوم اضافه می شود، روی لایه کلیک راست کرده و Open Attribute Table را انتخاب کنید . ۰۱_mean نشان دهنده میانگین یک ماه است، به همین ترتیب الگوریتم فوق در صورت اجرا بدون وقفه، ۱۲ لایه جدید تولید می کند.
- اکنون اجازه میدهیم کدی را برای ادغام میانگین ماهها اضافه کنیم و یک لایه خروجی از آن ایجاد کنیم. ما کد قبلی را به روز می کنیم تا الگوریتم آمار منطقه ای را به طور مکرر اجرا کنیم. ما یک متغیر جدید تعریف می کنیم
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)
- پس از پایان پردازش، یک لایه جدید
output
به بوم اضافه می شود، روی لایه کلیک راست کرده و Open Attribute Table را انتخاب کنید .
- ۱۲ ستون جدید با پیشوندهای سفارشی و مقادیر میانگین بارش استخراج شده از لایه های شطرنجی به جدول اضافه می شوند.
اگر می خواهید بازخورد بدهید یا تجربه خود را در مورد این آموزش به اشتراک بگذارید، لطفاً در زیر نظر دهید. (به حساب GitHub نیاز دارد)