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

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

نمای کلی تمرین

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

اخذ داده

ما داده های Airports از Natural Earth استفاده می کنیم.

Download the Airports shapefile.

مراحل

  1. فایل ne_10m_airports.zip در مرورگر QGIS Browser پیدا کنید و آن را باز کنید. فایل شیب فایل ne_10m_airports.shp را انتخاب کنید و آن را به پنجره اصلی نقشه بکشید.

../../_images/1101.png
  1. شما لایه ne_10m_airports بارگذاری شده در QGIS مشاهده کنید.

../../_images/270.png
  1. ابزار Identify را انتخاب کرده و بر روی هر یک از نقاط کلیک کنید تا اطلاعات توصیفی موجود بررسی شود. خواهید دید که نام فرودگاه و کد 3 رقمی آن به ترتیب در ستون توصیفی "name" و "iata_code" موجود است. می توانید پنجره :guilabel:`Identify`را ببندید.

../../_images/335.png
  1. QGIS یک کنسول داخلی در اختیار شما قرار می دهد که در آن می توانید دستورات پایتون را تایپ کرده و نتیجه بگیرید. این کنسول یک روش عالی برای یادگیری اسکریپت نویسی و همچنین انجام پردازش سریع داده است. کنسول Python را با رفتن به منوی :menuselection:`Plugins --> Python Console`باز کنید.

../../_images/416.png
  1. یک پانل جدید را در پایین پنجره اصلی QGIS مشاهده خواهید کرد. در زیر یک دستور ">>>" مشاهده خواهید کرد که می توانید دستورات را در آنجا تایپ کنید. برای تعامل با محیط QGIS ، باید از متغیر iface استفاده کنیم. برای دسترسی به لایه فعال فعلی در QGIS ، می توانید موارد زیر را تایپ کرده و دکمه اینتر Enter از صفحه کلید را فشار دهید. این دستور ارجاع به لایه بارگیری شده در حال حاضر را می گیرد و آن را در متغیر``layer`` ذخیره می کند.

layer = iface.activeLayer()
../../_images/515.png
  1. یک تابع مفید به نام ()dir در پایتون وجود دارد که تمام روش های موجود را برای هر شی به شما نشان می دهد. این مورد زمانی مفید است که مطمئن نیستید چه توابع برای شیء موجود هستند. دستور زیر را اجرا کنید تا ببینید چه کارهایی می توانیم روی متغیر لایه انجام دهیم.

dir(layer)
../../_images/615.png
  1. لیست طولانی از توابع موجود را مشاهده خواهید کرد. در حال حاضر ، ما از تابعی به نام "()getFeatures " استفاده خواهیم کرد که به شما ارجاع به تمام عارضه های یک لایه می دهد. ما ، یک عارضه نقطه ای داریم که یک فرودگاه را نشان می دهد. برای تکرار از طریق هر یک از عارضه های لایه فعلی می توانید دستور زیر را تایپ کنید.

توجه

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

از آنجایی که دستور 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" ذخیره کنیم. برای بدست آوردن مختصات x و y از نقطه ، می توانید تابع "()asPoint " را بر روی شیء هندسی اجرا کنید. اگر عارضه شما یک خط یا چندضلعی است ، می توانید از توابع "()asPolyline " یا "()asPolygon " استفاده کنید. کد زیر را تایپ کنید و برای دیدن مختصات x و y هر عارضه بر دکمه Enter فشار دهید

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 " استفاده می کنیم که کنترل بیشتری بر چاپ چند متغیر دارد. علامت ".2f" این است که مختصات را به 2 اعشار محدود کنید.

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\ را در انتهای قالب بندی خط خود اضافه می کنیم. این کار برای اضافه کردن یک خط جدید بعد از اضافه کردن داده های هر عارضه است.

توجه

در قسمت زیر 2 سطح بلوک کد وجود دارد. اطمینان حاصل کنید که 4 فاصله را قبل از کد خط 3 اضافه کنید.

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

If you want to give feedback or share your experience with this tutorial, please comment below. (requires GitHub account)