8. دعم الإسقاطات

تلميح

تحتاج مقتطفات الشيفرة في هذه الصفحة إلى الاستيرادات التالية إذا كنت خارج وحدة تحكم pyqgis:

1from qgis.core import (
2    QgsCoordinateReferenceSystem,
3    QgsCoordinateTransform,
4    QgsProject,
5    QgsPointXY,
6)

8.1. أنظمة الإحداثيات المرجعية

تُغلَّف أنظمة الإحداثيات المرجعية (CRS) في الصنف QgsCoordinateReferenceSystem. ويمكن إنشاء نسخ من هذا الصنف بعدة طرق مختلفة:

  • حدّد نظام الإحداثيات المرجعي بمعرّفه

    # EPSG 4326 is allocated for WGS84
    crs = QgsCoordinateReferenceSystem("EPSG:4326")
    print(crs.isValid())
    
    True
    

    يدعم QGIS معرّفات مختلفة لأنظمة الإحداثيات المرجعية بالصيغ التالية:

    • EPSG:<code> --- معرّف تعيّنه منظمة EPSG - يُعالَج باستخدام createFromOgcWms()

    • POSTGIS:<srid>--- معرّف يُستخدم في قواعد بيانات PostGIS - يُعالَج باستخدام createFromSrid()

    • INTERNAL:<srsid> --- معرّف يُستخدم في قاعدة بيانات QGIS الداخلية - يُعالَج باستخدام createFromSrsId()

    • PROJ:<proj> - يُعالَج باستخدام createFromProj()

    • WKT:<wkt> - يُعالَج باستخدام createFromWkt()

إذا لم تُحدَّد بادئة، يُفترض أن التعريف بصيغة WKT.

  • حدّد نظام الإحداثيات المرجعي بنصّه المعروف (WKT)

    1wkt = 'GEOGCS["WGS84", DATUM["WGS84", SPHEROID["WGS84", 6378137.0, 298.257223563]],' \
    2      'PRIMEM["Greenwich", 0.0], UNIT["degree",0.017453292519943295],' \
    3      'AXIS["Longitude",EAST], AXIS["Latitude",NORTH]]'
    4crs = QgsCoordinateReferenceSystem(wkt)
    5print(crs.isValid())
    
    True
    
  • أنشئ نظام إحداثيات مرجعيًا غير صالح ثم استخدم إحدى دوال create* لتهيئته. في المثال التالي نستخدم سلسلة Proj لتهيئة الإسقاط.

    crs = QgsCoordinateReferenceSystem()
    crs.createFromProj("+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs")
    print(crs.isValid())
    
    True
    

من الحكمة التحقق من نجاح إنشاء نظام الإحداثيات المرجعي (أي البحث عنه في قاعدة البيانات): يجب أن تُعيد isValid() القيمة True.

لاحظ أن QGIS يحتاج، لتهيئة أنظمة الإسناد المكاني، إلى البحث عن القيم المناسبة في قاعدة بياناته الداخلية srs.db. لذا إذا أنشأت تطبيقًا مستقلًا فعليك تعيين المسارات بشكل صحيح باستخدام QgsApplication.setPrefixPath()، وإلا فسيفشل في العثور على قاعدة البيانات. أما إذا كنت تشغّل الأوامر من وحدة تحكم Python في QGIS أو تطوّر إضافة فلا داعي للقلق: فكل شيء مُعدّ لك مسبقًا.

الوصول إلى معلومات نظام الإسناد المكاني:

 1crs = QgsCoordinateReferenceSystem("EPSG:4326")
 2
 3print("QGIS CRS ID:", crs.srsid())
 4print("PostGIS SRID:", crs.postgisSrid())
 5print("Description:", crs.description())
 6print("Projection Acronym:", crs.projectionAcronym())
 7print("Ellipsoid Acronym:", crs.ellipsoidAcronym())
 8print("Proj String:", crs.toProj())
 9# check whether it's geographic or projected coordinate system
10print("Is geographic:", crs.isGeographic())
11# check type of map units in this CRS (values defined in QGis::units enum)
12print("Map units:", crs.mapUnits())

المخرجات:

1QGIS CRS ID: 3452
2PostGIS SRID: 4326
3Description: WGS 84
4Projection Acronym: longlat
5Ellipsoid Acronym: EPSG:7030
6Proj String: +proj=longlat +datum=WGS84 +no_defs
7Is geographic: True
8Map units: DistanceUnit.Degrees

8.2. تحويل نظام الإحداثيات المرجعي

يمكنك إجراء التحويل بين أنظمة الإسناد المكاني المختلفة باستخدام الصنف QgsCoordinateTransform. وأسهل طريقة لاستخدامه هي إنشاء نظام إحداثيات مرجعي مصدر وآخر هدف، ثم بناء نسخة من QgsCoordinateTransform بهما وبالمشروع الحالي. بعد ذلك استدعِ الدالة transform() بشكل متكرر لإجراء التحويل. يُجري افتراضيًا التحويل الأمامي، لكنه قادر أيضًا على إجراء التحويل العكسي.

 1crsSrc = QgsCoordinateReferenceSystem("EPSG:4326")    # WGS 84
 2crsDest = QgsCoordinateReferenceSystem("EPSG:32633")  # WGS 84 / UTM zone 33N
 3transformContext = QgsProject.instance().transformContext()
 4xform = QgsCoordinateTransform(crsSrc, crsDest, transformContext)
 5
 6# forward transformation: src -> dest
 7pt1 = xform.transform(QgsPointXY(18,5))
 8print("Transformed point:", pt1)
 9
10# inverse transformation: dest -> src
11pt2 = xform.transform(pt1, QgsCoordinateTransform.ReverseTransform)
12print("Transformed back:", pt2)

المخرجات:

Transformed point: <QgsPointXY: POINT(832713.79873844375833869 553423.98688333143945783)>
Transformed back: <QgsPointXY: POINT(18 4.99999999999999911)>