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

Обработка геометрии

Точки, линии, полигоны, являющиеся пространственными объектами обычно называют геометрией. В QGIS все они представлены классом QgsGeometry. Посмотреть на все существующие типы геометрий можно на странице обсуждения JTS.

Иногда одна геометрия на самом деле является множеством простых (single-part) объектов. Такую геометрию называют составной (multi-part). Если составная геометрия состоит из простых объектов одного типа, то ее называют мульти-точкой, мульти-линией или мульти-полигоном. Например, страна, состоящая из нескольких островов может быть представлена как мульти-полигон.

Координаты, описывающие геометрию, могут быть в любой системе координат (CRS). Когда выполняется доступ к объектам слоя, ассоциированые геометрии будут выданы с координатами в СК слоя.

Создание геометрий

Создать геометрию можно несколькими способами:

  • по координатам:

    gPnt = QgsGeometry.fromPoint(QgsPoint(1,1))
    gLine = QgsGeometry.fromPolyline( [ QgsPoint(1,1), QgsPoint(2,2) ] )
    gPolygon = QgsGeometry.fromPolygon( [ [ QgsPoint(1,1), QgsPoint(2,2), QgsPoint(2,1) ] ] )
    

    Координаты задаются при помощи класса QgsPoint.

    Полилиния описывается массивом точек. Полигон представляется как список линейных колец (например, замкнутых линий). Первое кольцо — внешнее (граница), последующие не обязательные кольца описывают дырки в полигоне.

    Составные геометрии имеют дополнительный уровень вложености, так: мульти-точка это список точек, мульти-линия — список линий и мульти-полигон является списком полигонов.

  • из описания в формате WKT (well-known text):

    gem = QgsGeometry.fromWkt("POINT (3 4)")
    
  • из описания в формате WKB (well-known binary):

    g = QgsGeometry()
    g.setWkbAndOwnership(wkb, len(wkb))
    

Доступ к геометрии

Прежде всего необходимо определить тип геометрии, сделать это можно вызвав метод wkbType(), который вернет значение из перечислимого типа QGis.WkbType:

>>> gPnt.wkbType() == QGis.WKBPoint
True
>>> gLine.wkbType() == QGis.WKBLineString
True
>>> gPolygon.wkbType() == QGis.WKBPolygon
True
>>> gPolygon.wkbType() == QGis.WKBMultiPolygon
False

Также можно воспользоваться методом type(), который возвращает значение из перечислимого типа QGis.GeometryType. Вспомогательная функция isMultipart() поможет определить является ли геометрия составной или нет.

Для извлечения информации из геометрии существуют фукции доступа для каждого вида объектов. Ниже показано как ими пользоваться:

>>> gPnt.asPoint()
(1,1)
>>> gLine.asPolyline()
[(1,1), (2,2)]
>>> gPolygon.asPolygon()
[[(1,1), (2,2), (2,1), (1,1)]]

Примечание: очередь (x,y) не является настоящей очередью, это объект QgsPoint, а к его значениям можно обратиться при помощи методов x() и y().

Для составных геометрий существуют аналогичныей фукнции доступа: asMultiPoint(), asMultiPolyline(), asMultiPolygon().

Геометрические предикаты и операции

QGIS использует библиотеку GEOS для выполнения различных действий над геометриями, таких как геометрические предикаты (contains(), intersects(), ...) и операции (union(), difference(), ...)

TODO:

  • area(), length(), distance()
  • transform()
  • available predicates and set operations