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

هشدار

نسخه جدید این آموزش شروع برنامه نویسی پایتون (QGIS3) در دسترس است

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

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

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

اخذ داده

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

شیب فایل Airports shapefile را دانلود کنید.

منابع داده [NATURALEARTH]

مراحل

  1. در QGIS به قسمت منوی Layers ‣ Add Vector Layer بروید. به فایل بارگیری شده ne_10m_airports.zip بروید و بر دکمه Open کلیک کنید. لایه "ne_10m_airports.shp" را انتخاب کرده و روی ``ne_10m_airports.shp``کلیک کنید.

../_images/1185.png
  1. You will see the ne_10m_airports layer loaded in QGIS.

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

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

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

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

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

for f in layer.getFeatures():
  print f
../_images/749.png
  1. همانطور که در خروجی مشاهده خواهید کرد ، هر خط حاوی ارجاع به یک ویژگی درون لایه است. ارجاع به این ویژگی در متغیر "f" ذخیره می شود. برای دستیابی به صفات هر عراضه می توانیم از متغیر "f" استفاده کنیم. برای چاپ "نام" و "iata_code" برای هر عارضه فرودگاه ، موارد زیر را تایپ کنید.

for f in layer.getFeatures():
  print f['name'], f['iata_code']
../_images/848.png
  1. بنابراین اکنون می دانید که چگونه می توانید به خصوصیات توصیفی هر عراضه در یک لایه با برنامه ای دسترسی پیدا کنید. حال ، بیایید ببینیم که چگونه می توانیم به مختصات عارضه دسترسی پیدا کنیم. با فراخوانی تابع "()geometry " می توان به مختصات یک عارضه برداری دسترسی پیدا کرد. این تابع یک شی ء هندسی را برمی گرداند که می توانیم آن را در متغیر "geom" ذخیره کنیم. برای بدست آوردن مختصات x و y نقطه می توانید تابع ()asPoint``را بر روی شی ء هندسی اجرا کنید. اگر عار ضه شما یک خط یا چند ضلعی باشد می توانید از توابع``()asPolyline یا ()asPolygon استفاده کنید. کد زیر را در سریع تایپ کنید و برای دیدن مختصات x و y هر عارضه بر دکمه Enter فشار دهید.

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

for f in layer.getFeatures():
  geom = f.geometry()
  print geom.asPoint().x()
../_images/1055.png
  1. اکنون ما تمام قطعاتی را داریم که می توانیم آنها را بهم متصل کنیم تا خروجی مورد نظر خود را فراهم کنیم. کد زیر را تایپ کنید تا نام، کد یاتا، طول جغرافیایی و عرض جغرافیایی هر یک از عارضه های فرودگاه چاپ شود. علامت های s% و f% روشهایی برای قالب بندی متغیرهای رشته و اعداد هستند.

for f in layer.getFeatures():
  geom = f.geometry()
  print '%s, %s, %f, %f' % (f['name'], f['iata_code'],
         geom.asPoint().y(), geom.asPoint().x())
../_images/1186.png
  1. خروجی چاپ شده روی کنسول را مشاهده می کنید. یک روش مفیدتر برای ذخیره خروجی در یک فایل است. برای ایجاد پرونده می توانید کد زیر را تایپ کنید و خروجی را در آنجا بنویسید. مسیر فایل را با یک مسیر روی سیستم خود جایگزین کنید. توجه داشته باشید که "n" را در انتهای قالب بندی خط خود اضافه می کنیم. این کار برای اضافه کردن یک خط جدید بعد از اضافه کردن داده ها برای هر عارضه است. همچنین باید خط ``unicode_line = line.encode('utf-8')` را یادداشت کنید. از آنجا که لایه ما شامل برخی از عارضه ها با نویسه های یونیکد است ، نمی توانیم آن را به سادگی در یک فایل متنی بنویسیم. ما متن را با استفاده از رمزگذاری UTF-8 رمزگذاری می کنیم و سپس در فایل متنی می نویسیم.

output_file = open('c:/Users/Ujaval/Desktop/airports.txt', 'w')
for f in layer.getFeatures():
  geom = f.geometry()
  line = '%s, %s, %f, %f\n' % (f['name'], f['iata_code'],
          geom.asPoint().y(), geom.asPoint().x())
  unicode_line = line.encode('utf-8')
  output_file.write(unicode_line)
output_file.close()
../_images/1257.png
  1. می توانید به محل فایل خروجی که تعیین کرده اید بروید و فایل متنی را باز کنید. شما داده های مربوط به فایل بردرای فرودگاه ها را که با استفاده از برنامه نویسی پایتون استخراج کردیم ، مشاهده خواهید کرد.

../_images/1355.png

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