شروع با برنامه نویسی پایتون (QGIS3)
QGIS دارای یک رابط برنامه نویسی قدرتمند است که به شما امکان می دهد عملکرد اصلی نرم افزار را گسترش دهید و همچنین اسکریپت هایی را برای خودکارسازی وظایف خود بنویسید. QGIS از زبان برنامه نویسی محبوب پایتون پشتیبانی می کند. حتی اگر مبتدی هستید، یادگیری کمی رابط برنامه نویسی پایتون و QGIS به شما این امکان را می دهد که در کار خود بهره وری بسیار بیشتری داشته باشید. این آموزش هیچ دانش برنامه نویسی قبلی را فرض نمی کند و قصد دارد مقدمه ای بر اسکریپت نویسی پایتون در QGIS (PyQGIS) ارائه دهد.
نمای کلی کار
ما یک لایه نقطه برداری که همه فرودگاه های اصلی را نشان می دهد بارگذاری می کنیم و از برنامه نویسی پایتون برای ایجاد یک فایل متنی با نام فرودگاه، کد فرودگاه، طول و عرض جغرافیایی برای هر یک از فرودگاه های موجود در لایه استفاده می کنیم.
دریافت داده ها
ما از مجموعه داده فرودگاه ها از Natural Earth استفاده خواهیم کرد.
شکل فایل فرودگاه ها را دانلود کنید .
ne_10m_airports.zip
فایل را در مرورگر QGIS بیابید و آن را گسترش دهید. فایل را انتخاب کنیدne_10m_airports.shp
و آن را روی بوم بکشید.
ne_10m_airports
لایه بارگذاری شده در QGIS را خواهید دید .
- ابزار Identify را انتخاب کرده و روی هر یک از نقاط کلیک کنید تا ویژگی های موجود را بررسی کنید. مشاهده خواهید کرد که نام فرودگاه و کد ۳ رقمی آن به ترتیب در صفات موجود
name
استiata_code
. می توانید پنجره Identify را ببندید .
- QGIS یک کنسول داخلی ارائه می دهد که می توانید دستورات پایتون را تایپ کنید و نتیجه را دریافت کنید. این کنسول یک راه عالی برای یادگیری اسکریپت و همچنین پردازش سریع داده ها است. کنسول Python را با رفتن به باز کنید .
- یک پانل جدید در پایین بوم QGIS باز می شود. یک اعلان مانند
>>>
در پایین خواهید دید که می توانید دستورات را تایپ کنید. برای تعامل با محیط QGIS باید ازiface
متغیر استفاده کنیم. برای دسترسی به لایه فعال در حال حاضر در QGIS، می توانید عبارت زیر را تایپ کرده و فشار دهید Enter. این دستور ارجاع به لایه بارگذاری شده فعلی را واکشی می کند و آن را درlayer
متغیر ذخیره می کند.
layer = iface.activeLayer()
- یک تابع مفید به نام پایتون وجود دارد
dir()
که تمام روش های موجود برای هر شی را به شما نشان می دهد. این زمانی مفید است که مطمئن نیستید چه توابعی برای شی موجود است. دستور زیر را اجرا کنید تا ببینید چه عملیاتی می توانیم رویlayer
متغیر انجام دهیم.
dir(layer)
- لیست طولانی از توابع موجود را مشاهده خواهید کرد. در حال حاضر، ما از تابعی به نام استفاده خواهیم کرد
getFeatures()
که به شما ارجاع به تمام ویژگی های یک لایه می دهد. در مورد ما، هر ویژگی یک نقطه نشان دهنده یک فرودگاه خواهد بود. می توانید دستور زیر را برای تکرار در هر یک از ویژگی های لایه فعلی تایپ کنید.
توجه داشته باشید
تورفتگی (یا تعداد فاصله های قبل از هر عبارت) در پایتون بسیار مهم است. اگر در این مرحله با خطا مواجه شدید، قبل از تایپ خط دوم مطمئن شوید که ۲ فاصله اضافه کرده اید.
از آنجایی که دستور print(f) در داخل یک حلقه for قرار دارد، باید Enterدو بار بعد از آن عبارت را فشار دهید – یک بار برای خروج از حلقه – و دیگری برای اجرای دستور.
for f in layer.getFeatures():
print(f)
- همانطور که در خروجی مشاهده خواهید کرد، هر خط حاوی یک مرجع به یک ویژگی در لایه است. ارجاع به ویژگی در
f
متغیر ذخیره می شود. ما می توانیم ازf
متغیر برای دسترسی به ویژگی های هر ویژگی استفاده کنیم. برای چاپname
وiata_code
برای هر ویژگی فرودگاه عبارت زیر را تایپ کنید.
for f in layer.getFeatures():
print(f['name'], f['iata_code'])
- بنابراین اکنون می دانید که چگونه به صورت برنامه نویسی به ویژگی هر ویژگی در یک لایه دسترسی داشته باشید. بیایید ببینیم چگونه می توانیم به مختصات ویژگی دسترسی پیدا کنیم. مختصات یک ویژگی برداری با فراخوانی تابع قابل دسترسی است
geometry()
. این تابع یک شی هندسی را برمیگرداند که میتوانیم آن را در متغیر ذخیره کنیمgeom
. می توانیدasPoint()
تابع را روی شی هندسه اجرا کنید تا مختصات x و y نقطه را بدست آورید. اگر ویژگی شما یک خط یا چند ضلعی است، می توانید ازasPolyline()
یاasPolygon()
توابع استفاده کنید. کد زیر را در خط فرمان تایپ کنید و Enterبرای دیدن مختصات x و y هر ویژگی فشار دهید.
for f in layer.getFeatures():
geom = f.geometry()
print(geom.asPoint())
- اگر بخواهیم فقط
x
مختصات ویژگی را بدست آوریم چه می شود؟ می توانیدx()
تابع روی شی نقطه ای را فراخوانی کرده و مختصات x آن را بدست آورید.
for f in layer.getFeatures():
geom = f.geometry()
print(geom.asPoint().x())
- اکنون تمام قطعاتی را داریم که میتوانیم آنها را به هم بچسبانیم تا خروجی مورد نظر خود را تولید کنیم. برای چاپ نام، 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()))
- می توانید خروجی چاپ شده روی کنسول را ببینید. یک راه مفیدتر برای ذخیره خروجی در یک فایل است. برای ایجاد فایل می توانید کد زیر را تایپ کرده و خروجی را در آنجا بنویسید. مسیر فایل را با یک مسیر در سیستم خود جایگزین کنید. توجه داشته باشید که ما
\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)
- می توانید به محل فایل خروجی که مشخص کرده اید بروید و فایل متنی را باز کنید. داده های شکل فایل فرودگاه ها را که با استفاده از برنامه نویسی پایتون استخراج کردیم، مشاهده خواهید کرد.
اگر می خواهید بازخورد بدهید یا تجربه خود را در مورد این آموزش به اشتراک بگذارید، لطفاً در زیر نظر دهید. (به حساب GitHub نیاز دارد)