پایتون و کیو جی آی اس (QGIS)

پایتون و qgis
بازدید 1347
0

QGIS یکی از بهترین سیستم های اطلاعات جغرافیایی منبع باز است. در حالی که توسعه برنامه‌های مکانی Python می‌تواند چالش‌برانگیز باشد، QGIS فرآیند را با کتابخانه‌های geoprocessing لازم و یک رابط کاربری ترکیب، و همه آن‌ها را مستقیماً با استفاده از کد پایتون کنترل و ساده می‌کند.

لینک وب سایت و کتاب آموزش

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

QGIS یک سیستم اطلاعات جغرافیایی محبوب، رایگان و منبع باز (GIS) است که بر روی تمام سیستم عامل های اصلی اجرا می شود. مردم اغلب از QGIS برای مشاهده، ویرایش و تجزیه و تحلیل داده های مکانی استفاده می کنند. با این حال، برای اهداف ما، QGIS چیزی بیش از یک سیستم GIS است. همچنین یک محیط برنامه نویسی جغرافیایی است که می توانیم از آن برای ساخت برنامه های مکانی خودمان با استفاده از پایتون استفاده کنیم. QGIS یک وب سایت جامع (http://qgis.org) دارد که دانلود، نصب و استفاده از آن را آسان می کند. قبل از مطالعه بیشتر، بهتر است به وب سایت نگاه کنید و با برنامه و مستندات موجود آنلاین آشنا شوید. به طور خاص، باید صفحه Documentation را بررسی کنید، جایی که سه کتابچه راهنمای مهم موجود است: راهنمای کاربر/راهنمای QGIS، راهنمای آموزشی QGIS، و کتاب آشپزی PyQGIS. راهنمای کاربر/راهنمای QGIS مستندات کاربری عمیقی را ارائه می دهد که ممکن است برای شما مفید باشد. کتابچه راهنمای آموزشی QGIS مقدمه ای مفصل بر سیستم ها و مفاهیم GIS مبتنی بر QGIS است. اگر از قبل با داده‌ها و تکنیک‌های جغرافیایی آشنایی ندارید، ممکن است کار در این دوره مفید باشد. در نهایت، کتاب آشپزی PyQGIS یک مرجع ضروری برای استفاده در هنگام توسعه برنامه های نقشه برداری خود که بر روی QGIS ساخته شده است، خواهد بود.

پیوند QGIS و پایتون

در حالی که QGIS خود به زبان C++ نوشته شده است، پشتیبانی گسترده ای از برنامه نویسی پایتون دارد. یک مفسر پایتون ساخته شده است و می تواند به صورت تعاملی از طریق کنسول پایتون یا برای اجرای افزونه های نوشته شده در پایتون استفاده شود. همچنین یک API جامع برای پرس و جو و کنترل برنامه QGIS با استفاده از کد پایتون وجود دارد. برای کار با سیستم QGIS به سه روش می توانید از پایتون استفاده کنید:

کنسول پایتون:

می‌توانید این کنسول را باز کنید، که مفسر تعاملی پایتون را اجرا می‌کند که در QGIS تعبیه شده است و به شما امکان می‌دهد دستورات را تایپ کنید و نتایج را فورا ببینید.

 افزونه پایتون:

اینها بسته های پایتون هستند که برای اجرا در محیط QGIS طراحی شده اند.

برنامه های خارجی:

می توانید از QGIS Python API در برنامه های خود استفاده کنید. این به شما امکان می دهد از QGIS به عنوان یک موتور پردازش مکانی استفاده کنید یا حتی برنامه های تعاملی خود را بر اساس QGIS بسازید.

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

 

کاوش در کنسول پایتون

پنجره QGIS Python Console با استفاده از آیتم Python Console در منوی Plugins قابل دسترسی است. وقتی این دستور را انتخاب می کنید، کنسول پایتون در گوشه سمت راست پایین پنجره QGIS ظاهر می شود. زمانی که کنسول پایتون را برای اولین بار باز می‌کنید،شبیه به شکل زیر به نظر می‌رسد:

کنسول پایتون

کنسول پایتون در QGIS

در حالی که کنسول پایتون یک ابزار عالی برای تعامل با یک پروژه QGIS موجود است، ما قصد داریم از آن برای ایجاد یک پروژه جدید از ابتدا استفاده کنیم. با این حال، قبل از انجام این کار، باید برخی از منابع داده مکانی را برای پروژه QGIS خود دانلود کنیم. ما به یک نقشه پایه مناسب برای پروژه خود و همچنین برخی اطلاعات رودخانه و شهر برای نمایش در بالای این نقشه پایه نیاز داریم. بیایید از وب سایت طبیعی زمین برای به دست آوردن اطلاعات مورد نیاز خود استفاده کنیم. به http://naturalearthdata.com بروید و روی تب Downloads کلیک کنید. در ابتدا، ما می خواهیم یک نقشه پایه با ظاهر زیبا برای پروژه خود دانلود کنیم. برای انجام این کار، پیوند Raster را در بخش داده‌های مقیاس متوسط، 1:50 متر انتخاب کنید، مجموعه داده‌های طبیعی Earth 1 را انتخاب کنید و روی پیوند دانلود در اندازه کوچک در زیر عنوان Natural Earth I with Shaded Relief and Water کلیک کنید. در مرحله بعد، ما به یک پوشش نیاز داریم که دریاچه ها و رودخانه ها را در بالای نقشه پایه ما نشان دهد. برای دریافت این اطلاعات، به تب دانلودها برگردید و پیوند فیزیکی را در بخش داده‌های مقیاس متوسط، 1:50 متر انتخاب کنید. مجموعه داده مورد نظر شما Rivers, Lake Centerlines نام دارد، بنابراین برای دریافت این فایل روی لینک دانلود رودخانه ها و خطوط مرکزی دریاچه کلیک کنید. در نهایت، می خواهیم شهرها را در بالای نقشه پایه خود برجسته کنیم. به صفحه دانلودها برگردید و پیوند فرهنگی را در زیر عنوان داده‌های مقیاس متوسط، 1:50 متر انتخاب کنید. در پایین قسمتی با عنوان مناطق شهری وجود دارد. برای دانلود این فایل روی لینک دانلود مناطق شهری کلیک کنید.

پس از انجام تمام این کارها، باید سه فایل زیر را داشته باشید:

  • A raster base map in a file named NE1_50M_SR_W.zip

  • Lake and river vector data in a file named ne_50m_rivers_lake_centerlines.zip

  • Urban area vector data in a file named ne_50m_urban_areas.zip

اکنون که داده های خود را در اختیار داریم، بیایید از کنسول پایتون QGIS برای وارد کردن این داده ها به یک پروژه استفاده کنیم. اگر قبلاً برخی از داده ها را در QGIS بارگذاری کرده اید گزینه New را از منوی پروژه انتخاب کنید تا دوباره با یک پروژه خالی شروع شود. سپس عبارت زیر را در کنسول پایتون QGIS تایپ کنید

layer1 = iface.addRasterLayer("/path/to/NE1_50M_SR_W/NE1_50M_SR_W.tif", "basemap")

مطمئن شوید که مسیر /path/to/ را با مسیر کامل دایرکتوری NE1_50M_SR_W که دانلود کرده اید جایگزین کرده اید. با فرض اینکه مسیر را به درستی تایپ کرده اید، نقشه پایه Natural Earth 1 باید در پنجره QGIS ظاهر شود:

python

اضافه کردن لایه رستری

همانطور که می بینید، نقشه پایه ما در حال حاضر کمی کوچک است. می‌توانید از دستورات متحرک و بزرگنمایی مختلف در نوار ابزار بالای پنجره برای بزرگ‌تر کردن آن استفاده کنید، اما بیایید از پایتون برای انجام همین کار استفاده کنیم:

iface.zoomFull()

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

layer2 = iface.addVectorLayer("/path/to/ne_50m_urban_areas/ne_50m_urban_areas.shp", "urban", "ogr")

یک بار دیگر مطمئن شوید که مسیر /path/to/ را با مسیر کامل دایرکتوری ne_50m_urban_areas که قبلا دانلود کرده اید جایگزین کنید. شکل فایل مناطق شهری در پروژه QGIS بارگذاری می شود و به صورت مجموعه ای از مناطق رنگی در بالای نقشه پایه ظاهر می شود. بیایید در منطقه ای از کالیفرنیا زوم کنیم تا بتوانیم با وضوح بیشتری ببینیم که چگونه به نظر می رسد. برای انجام این کار، دستورات زیر را در پنجره کنسول پایتون تایپ کنید:

iface.mapCanvas().setExtent(QgsRectangle(-125, 31, -113, 38))
iface.mapCanvas().refresh()

این روی نقشه بزرگ‌نمایی می‌کند تا منطقه ای از کالیفرنیا، از جمله لس آنجلس و بخش جنوبی سانفرانسیسکو، اکنون روی نقشه نشان داده شود

در نهایت، اجازه دهید داده های رودخانه و دریاچه خود را به پروژه خود اضافه کنیم. برای انجام این کار، موارد زیر را در کنسول پایتون وارد کنید:

layer3 = iface.addVectorLayer("/path/to/ne_50m_rivers_lake_centerlines/ne_50m_rivers_lake_centerlines.shp", "water", "ogr")

اگر به نقشه نگاه کنید، می بینید که رودخانه ها و دریاچه ها اکنون قابل مشاهده هستند. با این حال، آنها به رنگ سبز پیش فرض کشیده شده اند. بیایید این را طوری تغییر دهیم که آب اکنون آبی شود:

from PyQt4.QtGui import QColor
layer3.rendererV2().symbols()[0].setColor(QColor("#4040FF"))
iface.mapCanvas().refresh()

این کد ممکن است کمی گیج کننده باشد، اما نگران نباشید – ما در مورد رندرها و نمادها در آموزش QGIS Python API یاد خواهیم گرفت. اکنون که کار ما تمام شد، می توانید پروژه خود را با استفاده از آیتم Save As… در منوی Project ذخیره کنید. همانطور که می بینید، راه اندازی و سفارشی سازی پروژه QGIS با استفاده از پایتون کاملا امکان پذیر است.

بررسی یک افزونه پایتون

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

از آنجایی که QGIS با استفاده از چارچوب Qt نوشته شده است، افزونه های QGIS از اتصالات Python در Qt استفاده می کنند که PyQt نامیده می شود. هنگامی که شروع به ساخت پلاگین های خود در QGIS کنیم، PyQt و ابزارهای مرتبط را دانلود و نصب خواهیم کرد. برای درک نحوه عملکرد یک افزونه پایتون، اجازه دهید نگاهی به افزونه Lat Lon Tools بیندازیم. قبل از اینکه بتوانیم از آن استفاده کنیم، باید این افزونه را نصب کنیم. مورد Manage and Install Plugins… را از منوی Plugins انتخاب کنید و روی زبانه Not Installed کلیک کنید. شما باید Lat Lon Tools را در پایین لیست افزونه های موجود مشاهده کنید. روی این افزونه کلیک کنید و سپس بر روی دکمه Install Plugin کلیک کنید تا آن را دانلود و نصب کنید. بیایید این افزونه را اجرا کنیم تا ببینیم چگونه کار می کند. در حالی که پروژه ای که قبلا ایجاد کرده اید هنوز بارگذاری شده است، موقعی که روی ابزار show in external map روی نماد افزونه Lat Lon Tools در نوار ابزار کلیک کنید دقیقا نقشه به صورت پیش فرض در open street map نمایش داده می شود.

نوشتن یک برنامه خارجی

راه نهایی کار با پایتون و QGIS نوشتن یک برنامه پایتون کاملاً مستقل است که کتابخانه های QGIS را وارد کرده و مستقیماً با آنها کار می کند. از بسیاری جهات، این یک راه ایده آل برای نوشتن برنامه های نقشه برداری سفارشی شماست، زیرا برنامه شما مجبور نیست در رابط کاربری موجود QGIS اجرا شود. با این حال، هنگام تلاش برای استفاده از Python و QGIS به این روش، چند نکته وجود دارد که باید از آنها آگاه باشید:

  1. برنامه پایتون شما باید بتواند کتابخانه های QGIS Python را قبل از اجرا پیدا کند. از آنجایی که اینها در خود برنامه QGIS قرار می گیرند، باید دایرکتوری را که کتابخانه های PyQGIS در مسیر پایتون شما نصب شده است اضافه کنید.
  2. همچنین باید به کتابخانه های PyQGIS محل ذخیره منابع برنامه QGIS را بگویید.
  3. از آنجایی که برنامه خارج از برنامه QGIS در حال اجرا است، به متغیر iface دسترسی نخواهید داشت. همچنین نمی‌توانید از آن بخش‌هایی از کتابخانه PyQGIS استفاده کنید که فرض می‌کنند در داخل QGIS در حال اجرا هستید.

هیچ‌کدام از این‌ها خیلی طاقت‌فرسا نیست، اگرچه می‌تواند در اولین باری که سعی می‌کنید از کد خارجی پایتون به PyQGIS دسترسی پیدا کنید، شما را اذیت کند. بیایید نگاهی بیندازیم که چگونه می توانیم هنگام نوشتن برنامه های پایتون خود از این تله ها جلوگیری کنیم. در مرحله اول، برای اینکه برنامه شما به کتابخانه های PyQGIS دسترسی داشته باشد، قبل از اینکه بتوانید هر یک از بسته های QGIS را وارد کنید، باید مسیر پایتون (و احتمالاً برخی از متغیرهای محیطی دیگر) را تغییر دهید. برای MS Windows، می توانید این کار را با اجرای دستور زیر در خط فرمان انجام دهید:

SET OSGEO4W_ROOT=C:\OSGeo4W
SET QGIS_PREFIX=%OSGEO4W_ROOT%\apps\qgis
SET PATH=%PATH%;%QGIS_PREFIX%\bin
SET PYTHONPATH=%QGIS_PREFIX%\python;%PYTHONPATH%

نکته :

بدیهی است که باید مسیر /path/to/qgis را با مسیر واقعی نصب QGIS خود جایگزین کنید.

اگر QGIS را در یک مکان غیر استاندارد نصب کرده اید، ممکن است لازم باشد این دستورات را قبل از اینکه کار کنند تغییر دهید. برای بررسی اینکه آیا آنها کار می کنند، مفسر پایتون را راه اندازی کنید و دستور زیر را وارد کنید:

>>> import qgis

اگر همه چیز خوب پیش برود، به سادگی اعلان پایتون را خواهید دید:

>>>

اکنون که به کتابخانه های PyQGIS دسترسی داریم، وظیفه بعدی ما این است که این کتابخانه ها را مقداردهی اولیه کنیم. همانطور که قبلا ذکر شد، ما باید به PyQGIS بگوییم که منابع مختلف QGIS را کجا پیدا کند. ما این کار را با استفاده از تابع

QgsApplication.setPrefixPath()

انجام می دهیم، مانند این:

import os

QgsApplication.setPrefixPath(os.environ['QGIS_PREFIX'], True)

این از متغیر محیطی QGIS_PREFIX که قبلاً تنظیم کردیم استفاده می کند تا به QGIS بگوییم منابع خود را کجا پیدا کند. با انجام این کار، می توانید کتابخانه PyQGIS را با برقراری تماس زیر مقداردهی اولیه کنید:

QgsApplication.initQgis()

اکنون می توانیم از PyQGIS برای انجام هر کاری که می خواهیم در برنامه خود استفاده کنیم. هنگامی که برنامه ما خارج می شود، همچنین باید به کتابخانه PyQGIS اطلاع دهیم که در حال خروج هستیم:

QgsApplication.exitQgis()

با کنار هم گذاشتن همه اینها، مینیمال برنامه پایتون ما به شکل زیر است:

import os
from qgis.core import *

QgsApplication.setPrefixPath(os.environ[‘QGIS_PREFIX’], True)
QgsApplication.initQgis()

# …

QgsApplication.exitQgis()

البته، این برنامه هنوز هیچ کار مفیدی انجام نمی دهد – به سادگی کتابخانه های PyQGIS را راه اندازی و خاموش می کند. بنابراین بیایید خط “…” را با کد مفیدی جایگزین کنیم که ویجت اصلی نقشه را نمایش می دهد. برای انجام این کار، ما باید یک زیر کلاس QMainWindow تعریف کنیم که ویجت نقشه را نمایش می دهد و سپس یک شی QApplication ایجاد و استفاده می کنیم تا این پنجره را نمایش دهد و رویدادهای مختلف رابط کاربری را در حین اجرای برنامه مدیریت کند.

نکته :

QMainWindow و QApplication هر دو کلاس PyQt هستند. ما به طور گسترده با کلاس های مختلف PyQt کار خواهیم کرد زیرا برنامه های خارجی خود را با استفاده از QGIS و Python توسعه می دهیم.

بیایید با جایگزین کردن خط “…” با کد زیر شروع کنیم، که یک نمایشگر نقشه را نمایش می دهد و سپس حلقه رویداد اصلی برنامه را اجرا می کند:

app = QApplication(sys.argv)

viewer = MapViewer(“/path/to/shapefile.shp”)
viewer.show()

app.exec_()

همانطور که می بینید، یک نمونه MapViewer (که به زودی آن را تعریف خواهیم کرد) ایجاد و نمایش داده می شود و شی QApplication با فراخوانی متد exec_() اجرا می شود. برای سادگی، نام یک شکل فایل را برای نمایش در نمایشگر نقشه ارسال می کنیم. اجرای این کد باعث می شود که نمایشگر نقشه نمایش داده شود و تا زمانی که کاربر پنجره را ببندد یا دستور Quit را از منو انتخاب کند، برنامه اجرا می شود. حالا بیایید کلاس MapViewer را تعریف کنیم. در اینجا تعریف کلاس به نظر می رسد:

class MapViewer(QMainWindow):
def __init__(self, shapefile):
QMainWindow.__init__(self)
self.setWindowTitle("Map Viewer")

canvas = QgsMapCanvas()
canvas.useImageToRender(False)
canvas.setCanvasColor(Qt.white)
canvas.show()

layer = QgsVectorLayer(shapefile, “layer1”, “ogr”)
if not layer.isValid():
raise IOError(“Invalid shapefile”)

QgsMapLayerRegistry.instance().addMapLayer(layer)
canvas.setExtent(layer.extent())
canvas.setLayerSet([QgsMapCanvasLayer(layer)])

layout = QVBoxLayout()
layout.addWidget(canvas)

contents = QWidget()
contents.setLayout(layout)
self.setCentralWidget(contents)

زیاد نگران جزئیات این کلاس نباشید. ما اساساً فقط یک پنجره ایجاد می کنیم و یک شی QgsMapCanvas را در آن قرار می دهیم. سپس یک لایه نقشه (نمونه ای از QgsVectorLayer) ایجاد می کنیم و آن را به بوم نقشه اضافه می کنیم. در نهایت بوم را به محتویات پنجره اضافه می کنیم. توجه داشته باشید که QgsMapCanvas و QgsVectorLayer هر دو بخشی از PyQGIS هستند، در حالی که QMainWindow، QVBoxLayout و QWidget همگی کلاس های PyQt هستند. این برنامه از کلاس های PyQGIS در یک برنامه PyQt استفاده می کند و کلاس ها را از هر دو منبع ترکیب می کند. این امکان پذیر است زیرا QGIS با استفاده از Qt ساخته شده است و کلاس های مختلف PyQGIS بر اساس PyQt هستند. برای تبدیل کد قبلی به یک برنامه کاربردی، تنها کاری که باید انجام دهیم این است که تعدادی دستور import بیشتر را به بالای ماژول اضافه کنیم:

import sys
from PyQt4.QtGui import *
from PyQt4.QtCore import Qt

اگر این برنامه را اجرا کنید، نمایشگر نقشه نمایش داده می شود که محتویات فایل شیپ را نشان می دهد که کد به آن اشاره می کند. مثلا:

کیو جی آی اس در جی آی ارث

 

این برنامه هنوز کمی زشت است—شما می توانید فضای سفید را در بالا و پایین این نقشه ببینید زیرا نسبت ابعاد داده های نقشه را در نظر نمی گیرد. همچنین هیچ ویژگی بزرگنمایی یا حرکت در اطراف نقشه وجود ندارد. با این حال، اینها را می توان به راحتی اضافه کرد، و همانطور که می بینید، ایجاد برنامه های مستقل مکانی خود که بر روی QGIS ساخته شده اند، چندان دشوار نیست 🙂 .

 

نظرات کاربران

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

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

زمینه‌های نمایش داده شده را انتخاب نمایید. بقیه مخفی خواهند شد. برای تنظیم مجدد ترتیب، بکشید و رها کنید.
  • تصویر
  • شناسۀ محصول
  • امتیاز
  • قيمت
  • موجودی
  • دسترسی
  • افزودن به سبد خرید
  • توضیح
  • محتوا
  • وزن
  • اندازه
  • اطلاعات اضافی
برای مخفی‌کردن نوار مقایسه، بیرون را کلیک نمایید
مقایسه