Outdated version of the documentation. Find the latest one here.

Работа с проекциями

Системы координат

Системы координат (Coordinate reference system, CRS) инкапсулируются классом QgsCoordinateReferenceSystem. Создать экземпляр этого класса можно одним из способов:

  • задать CRS по её ID:

    # PostGIS SRID 4326 is allocated for WGS84
    crs = QgsCoordinateReferenceSystem(4326, QgsCoordinateReferenceSystem.PostgisCrsId)
    

    QGIS использует три разных идентификатора для каждой системы координат:

    • PostgisCrsId — идентификатор, используемый в базах PostGIS

    • InternalCrsId — внутренний идентификатор, используемый в базе QGIS

    • EpsgCrsId — идентификатор, назначенный EPSG

    По умолчанию используется PostGIS SRID, если иное не определено вторым параметром.

  • задать CRS по её представлению в формате WKT (well-known text):

    wkt = 'GEOGCS["WGS84", DATUM["WGS84", SPHEROID["WGS84", 6378137.0, 298.257223563]],\
           PRIMEM["Greenwich", 0.0], UNIT["degree",0.017453292519943295],\
           AXIS["Longitude",EAST], AXIS["Latitude",NORTH]]'
    crs = QgsCoordinateReferenceSystem(wkt)
    
  • создать недействительную CRS, а затем использовать одну из функций create*() для её инициализации. В примере ниже для инициализации проекции используется строка в формате Proj4:

    crs = QgsCoordinateReferenceSystem()
    crs.createFromProj4("+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs")
    

Желательно проверить успешность создания (т.е выполнить поиск в базе данных) системы координат: isValid() должна вернуть True.

Заметим, что для инициализации систем координат QGIS требуется выполнить поиск необходимых значений в своей внутренней базе данных srs.db. Поэтому, если создаётся самостоятельное приложение, необходимо правильно настроить пути при помощи QgsApplication.setPrefixPath(), иначе не удастся найти базу данных. В случае создания расширения или при работе в консоли Python QGIS беспокоиться не о чем: всё уже настроено.

Получение информации о системе координат:

print "QGIS CRS ID:", crs.srsid()
print "PostGIS SRID:", crs.srid()
print "EPSG ID:", crs.epsg()
print "Description:", crs.description()
print "Projection Acronym:", crs.projectionAcronym()
print "Ellipsoid Acronym:", crs.ellipsoidAcronym()
print "Proj4 String:", crs.proj4String()
# check whether it's geographic or projected coordinate system
print "Is geographic:", crs.geographicFlag()
# check type of map units in this CRS (values defined in QGis::units enum)
print "Map units:", crs.mapUnits()

Проекции

Для преобразования между разными системами координат используется класс QgsCoordinateTransform. Наиболее простой способ использования — создать объекты для исходной и целевой систем координат и инициализировать ими экземпляр класса QgsCoordinateTransform. После чего можно выполнять преобразование, вызывая функцию transform(). По умолчанию выполняется прямое преобразование, но можно осуществлять и обратное:

crsSrc = QgsCoordinateReferenceSystem(4326)    # WGS 84
crsDest = QgsCoordinateReferenceSystem(32633)  # WGS 84 / UTM zone 33N
xform = QgsCoordinateTransform(crsSrc, crsDest)

# forward transformation: src -> dest
pt1 = xform.transform(QgsPoint(18,5))
print "Transformed point:", pt1

# inverse transformation: dest -> src
pt2 = xform.transform(pt1, QgsCoordinateTransform.ReverseTransform)
print "Transformed back:", pt2