شروع با برنامه نویسی پایتون (QGIS3) 

QGIS دارای یک رابط برنامه نویسی قدرتمند است که به شما امکان می دهد عملکرد اصلی نرم افزار را گسترش دهید و همچنین اسکریپت هایی را برای خودکارسازی وظایف خود بنویسید. QGIS از زبان برنامه نویسی محبوب پایتون پشتیبانی می کند. حتی اگر مبتدی هستید، یادگیری کمی رابط برنامه نویسی پایتون و QGIS به شما این امکان را می دهد که در کار خود بهره وری بسیار بیشتری داشته باشید. این آموزش هیچ دانش برنامه نویسی قبلی را فرض نمی کند و قصد دارد مقدمه ای بر اسکریپت نویسی پایتون در QGIS (PyQGIS) ارائه دهد.

نمای کلی کار 

ما یک لایه نقطه برداری که همه فرودگاه های اصلی را نشان می دهد بارگذاری می کنیم و از برنامه نویسی پایتون برای ایجاد یک فایل متنی با نام فرودگاه، کد فرودگاه، طول و عرض جغرافیایی برای هر یک از فرودگاه های موجود در لایه استفاده می کنیم.

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

ما از مجموعه داده فرودگاه ها از Natural Earth استفاده خواهیم کرد.

شکل فایل فرودگاه ها را دانلود کنید .

  1. ne_10m_airports.zipفایل را در مرورگر QGIS بیابید و آن را گسترش دهید. فایل را انتخاب کنید ne_10m_airports.shpو آن را روی بوم بکشید.

../../_images/1101.png

  1. ne_10m_airportsلایه بارگذاری شده در QGIS را خواهید دید .

../../_images/270.png

  1. ابزار Identify را انتخاب کرده و روی هر یک از نقاط کلیک کنید تا ویژگی های موجود را بررسی کنید. مشاهده خواهید کرد که نام فرودگاه و کد ۳ رقمی آن به ترتیب در صفات موجود nameاست iata_code. می توانید پنجره Identify را ببندید .

../../_images/335.png

  1. QGIS یک کنسول داخلی ارائه می دهد که می توانید دستورات پایتون را تایپ کنید و نتیجه را دریافت کنید. این کنسول یک راه عالی برای یادگیری اسکریپت و همچنین پردازش سریع داده ها است. کنسول Python را با رفتن به Plugins ‣ Python Console باز کنید .

../../_images/416.png

  1. یک پانل جدید در پایین بوم QGIS باز می شود. یک اعلان مانند >>>در پایین خواهید دید که می توانید دستورات را تایپ کنید. برای تعامل با محیط QGIS باید از ifaceمتغیر استفاده کنیم. برای دسترسی به لایه فعال در حال حاضر در QGIS، می توانید عبارت زیر را تایپ کرده و فشار دهید Enter. این دستور ارجاع به لایه بارگذاری شده فعلی را واکشی می کند و آن را در layerمتغیر ذخیره می کند.
layer = iface.activeLayer()

../../_images/515.png

  1. یک تابع مفید به نام پایتون وجود دارد dir()که تمام روش های موجود برای هر شی را به شما نشان می دهد. این زمانی مفید است که مطمئن نیستید چه توابعی برای شی موجود است. دستور زیر را اجرا کنید تا ببینید چه عملیاتی می توانیم روی layerمتغیر انجام دهیم.
dir(layer)

../../_images/615.png

  1. لیست طولانی از توابع موجود را مشاهده خواهید کرد. در حال حاضر، ما از تابعی به نام استفاده خواهیم کرد getFeatures()که به شما ارجاع به تمام ویژگی های یک لایه می دهد. در مورد ما، هر ویژگی یک نقطه نشان دهنده یک فرودگاه خواهد بود. می توانید دستور زیر را برای تکرار در هر یک از ویژگی های لایه فعلی تایپ کنید.

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

تورفتگی (یا تعداد فاصله های قبل از هر عبارت) در پایتون بسیار مهم است. اگر در این مرحله با خطا مواجه شدید، قبل از تایپ خط دوم مطمئن شوید که ۲ فاصله اضافه کرده اید.

از آنجایی که دستور print(f) در داخل یک حلقه for قرار دارد، باید Enterدو بار بعد از آن عبارت را فشار دهید – یک بار برای خروج از حلقه – و دیگری برای اجرای دستور.

for f in layer.getFeatures():
  print(f)

../../_images/7.gif

  1. همانطور که در خروجی مشاهده خواهید کرد، هر خط حاوی یک مرجع به یک ویژگی در لایه است. ارجاع به ویژگی در fمتغیر ذخیره می شود. ما می توانیم از fمتغیر برای دسترسی به ویژگی های هر ویژگی استفاده کنیم. برای چاپ nameو iata_codeبرای هر ویژگی فرودگاه عبارت زیر را تایپ کنید.
for f in layer.getFeatures():
  print(f['name'], f['iata_code'])

../../_images/8.gif

  1. بنابراین اکنون می دانید که چگونه به صورت برنامه نویسی به ویژگی هر ویژگی در یک لایه دسترسی داشته باشید. بیایید ببینیم چگونه می توانیم به مختصات ویژگی دسترسی پیدا کنیم. مختصات یک ویژگی برداری با فراخوانی تابع قابل دسترسی است geometry(). این تابع یک شی هندسی را برمی‌گرداند که می‌توانیم آن را در متغیر ذخیره کنیم geom. می توانید asPoint()تابع را روی شی هندسه اجرا کنید تا مختصات x و y نقطه را بدست آورید. اگر ویژگی شما یک خط یا چند ضلعی است، می توانید از asPolyline()یا asPolygon()توابع استفاده کنید. کد زیر را در خط فرمان تایپ کنید و Enterبرای دیدن مختصات x و y هر ویژگی فشار دهید.
for f in layer.getFeatures():
  geom = f.geometry()
  print(geom.asPoint())

../../_images/9.gif

  1. اگر بخواهیم فقط xمختصات ویژگی را بدست آوریم چه می شود؟ می توانید x()تابع روی شی نقطه ای را فراخوانی کرده و مختصات x آن را بدست آورید.
for f in layer.getFeatures():
  geom = f.geometry()
  print(geom.asPoint().x())

../../_images/10.gif

  1. اکنون تمام قطعاتی را داریم که می‌توانیم آن‌ها را به هم بچسبانیم تا خروجی مورد نظر خود را تولید کنیم. برای چاپ نام، iata_code، طول و عرض جغرافیایی هر یک از ویژگی های فرودگاه، کد زیر را تایپ کنید. در اینجا ما از .format()روشی استفاده می کنیم که کنترل بیشتری بر چاپ متغیرهای متعدد می دهد. نماد .۲fاین است که مختصات را به ۲ اعشار محدود کنید.
for f in layer.getFeatures():
  geom = f.geometry()
  print('{},{},{:.2f},{:.2f}'.format(f['name'], f['iata_code'], geom.asPoint().y(), geom.asPoint().x()))

../../_images/11.gif

  1. می توانید خروجی چاپ شده روی کنسول را ببینید. یک راه مفیدتر برای ذخیره خروجی در یک فایل است. برای ایجاد فایل می توانید کد زیر را تایپ کرده و خروجی را در آنجا بنویسید. مسیر فایل را با یک مسیر در سیستم خود جایگزین کنید. توجه داشته باشید که ما \nدر انتهای خط خود قالب بندی را اضافه می کنیم. این برای اضافه کردن یک خط جدید پس از اضافه کردن داده ها برای هر ویژگی است.

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

۲ سطح بلوک کد در زیر وجود دارد. حتماً ۴ فاصله به خط شروع کد ۳ اضافه کنید.

with open('/Users/ujaval/Desktop/airports.txt', 'w') as file:
  for f in layer.getFeatures():
    geom = f.geometry()
    line = '{},{},{:.2f},{:.2f}\n'.format(f['name'], f['iata_code'], geom.asPoint().y(), geom.asPoint().x())
    file.write(line)

../../_images/12.gif

  1. می توانید به محل فایل خروجی که مشخص کرده اید بروید و فایل متنی را باز کنید. داده های شکل فایل فرودگاه ها را که با استفاده از برنامه نویسی پایتون استخراج کردیم، مشاهده خواهید کرد.

../../_images/1320.png


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


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

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

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