.. index:: геометрия; обработка .. _geometry: Обработка геометрии =================== Точки, линии, полигоны, являющиеся пространственными объектами обычно называют геометрией. В QGIS все они представлены классом :class:`QgsGeometry`. Посмотреть на все существующие типы геометрий можно на `странице обсуждения JTS `_. Иногда одна геометрия на самом деле является множеством простых (single-part) объектов. Такую геометрию называют составной (multi-part). Если составная геометрия состоит из простых объектов одного типа, то ее называют мульти-точкой, мульти-линией или мульти-полигоном. Например, страна, состоящая из нескольких островов может быть представлена как мульти-полигон. Координаты, описывающие геометрию, могут быть в любой системе координат (CRS). Когда выполняется доступ к объектам слоя, ассоциированые геометрии будут выданы с координатами в СК слоя. .. index:: геометрия; создание Создание геометрий ------------------ Создать геометрию можно несколькими способами: * по координатам:: 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) ] ] ) Координаты задаются при помощи класса :class:`QgsPoint`. Полилиния описывается массивом точек. Полигон представляется как список линейных колец (например, замкнутых линий). Первое кольцо --- внешнее (граница), последующие не обязательные кольца описывают дырки в полигоне. Составные геометрии имеют дополнительный уровень вложености, так: мульти-точка это список точек, мульти-линия --- список линий и мульти-полигон является списком полигонов. * из описания в формате WKT (well-known text):: gem = QgsGeometry.fromWkt("POINT (3 4)") * из описания в формате WKB (well-known binary):: g = QgsGeometry() g.setWkbAndOwnership(wkb, len(wkb)) .. index:: геометрия; доступ Доступ к геометрии ------------------ Прежде всего необходимо определить тип геометрии, сделать это можно вызвав метод :func:`wkbType`, который вернет значение из перечислимого типа QGis.WkbType:: >>> gPnt.wkbType() == QGis.WKBPoint True >>> gLine.wkbType() == QGis.WKBLineString True >>> gPolygon.wkbType() == QGis.WKBPolygon True >>> gPolygon.wkbType() == QGis.WKBMultiPolygon False Также можно воспользоваться методом :func:`type`, который возвращает значение из перечислимого типа QGis.GeometryType. Вспомогательная функция :func:`isMultipart` поможет определить является ли геометрия составной или нет. Для извлечения информации из геометрии существуют фукции доступа для каждого вида объектов. Ниже показано как ими пользоваться:: >>> gPnt.asPoint() (1,1) >>> gLine.asPolyline() [(1,1), (2,2)] >>> gPolygon.asPolygon() [[(1,1), (2,2), (2,1), (1,1)]] Примечание: очередь (x,y) не является настоящей очередью, это объект :class:`QgsPoint`, а к его значениям можно обратиться при помощи методов :func:`x` и :func:`y`. Для составных геометрий существуют аналогичныей фукнции доступа: :func:`asMultiPoint`, :func:`asMultiPolyline`, :func:`asMultiPolygon()`. .. index:: геометрия; предикаты и операции Геометрические предикаты и операции ----------------------------------- QGIS использует библиотеку GEOS для выполнения различных действий над геометриями, таких как геометрические предикаты (:func:`contains`, :func:`intersects`, ...) и операции (:func:`union`, :func:`difference`, ...) **TODO:** * :func:`area`, :func:`length`, :func:`distance` * :func:`transform` * available predicates and set operations