Spec-Zone.ru › Django 1.10

GEOS API

Обзор

Что такое GEOS?

GEOS расшифровывается как Geometry Engine - Open Source и представляет собой библиотеку на C++, адаптированную из Java Topology Suite. GEOS реализует пространственные предикаты и операторы OpenGIS Simple Features for SQL. GEOS, ныне проект OSGeo, был первоначально разработан и поддерживался компанией Refractions Research из Виктории, Канада.

Возможности

GeoDjango реализует высокоуровневый Python-обёртку для библиотеки GEOS, её возможности включают:

  • Интерфейс с лицензией BSD к процедурам работы с геометрией GEOS, реализованный чисто на Python с использованием ctypes.
  • Слабая зависимость от GeoDjango. Например, объекты GEOSGeometry могут использоваться вне проекта/приложения Django. Другими словами, нет необходимости устанавливать DJANGO_SETTINGS_MODULE или использовать базу данных и т.д.
  • Изменяемость: объекты GEOSGeometry могут быть изменены.
  • Поддержка нескольких платформ и тестирование; совместимо с Windows, Linux, Solaris и Mac OS X.

Руководство

Этот раздел содержит краткое введение и руководство по использованию объектов GEOSGeometry.

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

Объекты GEOSGeometry могут быть созданы несколькими способами. Первый — простое создание объекта на основе пространственного ввода. Ниже приведены примеры создания одной и той же геометрии из WKT, HEX, WKB и GeoJSON:

>>> from django.contrib.gis.geos import GEOSGeometry
>>> pnt = GEOSGeometry('POINT(5 23)') # WKT
>>> pnt = GEOSGeometry('010100000000000000000014400000000000003740') # HEX
>>> pnt = GEOSGeometry(buffer('\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x14@\x00\x00\x00\x00\x00\x007@'))
>>> pnt = GEOSGeometry('{ "type": "Point", "coordinates": [ 5.000000, 23.000000 ] }') # GeoJSON

Другой вариант — использование конструктора для конкретного типа геометрии, которую вы хотите создать. Например, объект Point может быть создан путём передачи координат X и Y в его конструктор:

>>> from django.contrib.gis.geos import Point
>>> pnt = Point(5, 23)

Все эти конструкторы принимают ключевое слово srid. Например:

>>> from django.contrib.gis.geos import GEOSGeometry, LineString, Point
>>> print(GEOSGeometry('POINT (0 0)', srid=4326))
SRID=4326;POINT (0 0)
>>> print(LineString((0, 0), (1, 1), srid=4326))
SRID=4326;LINESTRING (0 0, 1 1)
>>> print(Point(0, 0, srid=32140))
SRID=32140;POINT (0 0)

Наконец, существует метод-фабрика fromfile(), который возвращает объект GEOSGeometry из файла:

>>> from django.contrib.gis.geos import fromfile
>>> pnt = fromfile('/path/to/pnt.wkt')
>>> pnt = fromfile(open('/path/to/pnt.wkt'))

Мои логи заполнены ошибками, связанными с GEOS

Вы обнаруживаете множество исключений TypeError или AttributeError в файлах журналов вашего веб-сервера. Это обычно означает, что вы создаёте объекты GEOS на верхнем уровне некоторых ваших Python-модулей. Затем, из-за проблемы гонки в сборщике мусора, ваш модуль собирается мусором до того, как объект GEOS. Чтобы предотвратить это, создавайте объекты GEOSGeometry внутри локальной области видимости ваших функций/методов.

Геометрии являются «питоническими»

Объекты GEOSGeometry являются «питоническими», другими словами, к компонентам можно получить доступ, изменить и перебрать их с помощью стандартных условностей Python. Например, можно перебрать координаты в объекте Point:

>>> pnt = Point(5, 23)
>>> [coord for coord in pnt]
[5.0, 23.0]

В любом объекте геометрии свойство GEOSGeometry.coords может использоваться для получения координат геометрии как кортежа Python:

>>> pnt.coords
(5.0, 23.0)

Вы можете получить/установить компоненты геометрии с помощью стандартных методов индексирования Python. Однако, возвращаемое значение зависит от типа геометрии объекта. Например, индексирование объекта LineString возвращает кортеж координат:

>>> from django.contrib.gis.geos import LineString
>>> line = LineString((0, 0), (0, 50), (50, 50), (50, 0), (0, 0))
>>> line[0]
(0.0, 0.0)
>>> line[-2]
(50.0, 0.0)

В то время как индексирование объекта Polygon вернёт кольцо (объект LinearRing) соответствующий индексу:

>>> from django.contrib.gis.geos import Polygon
>>> poly = Polygon( ((0.0, 0.0), (0.0, 50.0), (50.0, 50.0), (50.0, 0.0), (0.0, 0.0)) )
>>> poly[0]
<LinearRing object at 0x1044395b0>
>>> poly[0][-2] # second-to-last coordinate of external ring
(50.0, 0.0)

Кроме того, к координатам/компонентам геометрии можно добавлять или изменять их, точно так же, как в списке Python:

>>> line[0] = (1.0, 1.0)
>>> line.pop()
(0.0, 0.0)
>>> line.append((1.0, 1.0))
>>> line.coords
((1.0, 1.0), (0.0, 50.0), (50.0, 50.0), (50.0, 0.0), (1.0, 1.0))

Геометрии поддерживают операторы типа множества:

>>> from django.contrib.gis.geos import LineString
>>> ls1 = LineString((0, 0), (2, 2))
>>> ls2 = LineString((1, 1), (3, 3))
>>> print(ls1 | ls2)  # equivalent to `ls1.union(ls2)`
MULTILINESTRING ((0 0, 1 1), (1 1, 2 2), (2 2, 3 3))
>>> print(ls1 & ls2)  # equivalent to `ls1.intersection(ls2)`
LINESTRING (1 1, 2 2)
>>> print(ls1 - ls2)  # equivalent to `ls1.difference(ls2)`
LINESTRING(0 0, 1 1)
>>> print(ls1 ^ ls2)  # equivalent to `ls1.sym_difference(ls2)`
MULTILINESTRING ((0 0, 1 1), (2 2, 3 3))

Оператор равенства не проверяет пространственное равенство

Оператор равенства объекта GEOSGeometry использует equals_exact(), а не equals(), т.е. требует, чтобы сравниваемые геометрии имели одинаковые координаты в одних и тех же позициях:

>>> from django.contrib.gis.geos import LineString
>>> ls1 = LineString((0, 0), (1, 1))
>>> ls2 = LineString((1, 1), (0, 0))
>>> ls1.equals(ls2)
True
>>> ls1 == ls2
False

Объекты геометрии

GEOSGeometry

class GEOSGeometry(geo_input, srid=None) [source]
Параметры:
  • geo_input – Значение входных данных геометрии (строка или буфер)
  • srid (int) – идентификатор пространственной системы координат

Это базовый класс для всех объектов геометрии GEOS. Он инициализируется заданным аргументом geo_input, а затем предполагает соответствующий подкласс геометрии (например, GEOSGeometry('POINT(1 1)') создаст объект Point).

Принимаются следующие форматы ввода вместе с соответствующими типами Python:

Формат Тип ввода
WKT / EWKT str или unicode
HEX / HEXEWKB str или unicode
WKB / EWKB buffer
GeoJSON (требуется GDAL) str или unicode

Свойства

GEOSGeometry.coords

Возвращает координаты геометрии в виде кортежа.

GEOSGeometry.dims

Возвращает размерность геометрии:

  • 0 для Point и MultiPoint
  • 1 для LineString и MultiLineString
  • 2 для Polygon и MultiPolygon
  • -1 для пустых GeometryCollection
  • максимальный размер элементов для непустых GeometryCollection
GEOSGeometry.empty

Возвращает значение, указывающее на пустоту набора точек в геометрии.

GEOSGeometry.geom_type

Возвращает строку, соответствующую типу геометрии. Например:

>>> pnt = GEOSGeometry('POINT(5 23)')
>>> pnt.geom_type
'Point'
GEOSGeometry.geom_typeid

Возвращает идентификатор типа геометрии GEOS. В следующей таблице показано значение для каждого типа геометрии:

Геометрия ID
Point 0
LineString 1
LinearRing 2
Polygon 3
MultiPoint 4
MultiLineString 5
MultiPolygon 6
GeometryCollection 7
GEOSGeometry.num_coords

Возвращает количество координат в геометрии.

GEOSGeometry.num_geom

Возвращает количество геометрий в данной геометрии. Другими словами, вернёт 1 для всех, кроме коллекций геометрий.

GEOSGeometry.hasz

Возвращает булево значение, указывающее, является ли геометрия трёхмерной.

GEOSGeometry.ring

Возвращает булево значение, указывающее, является ли геометрия LinearRing.

GEOSGeometry.simple

Возвращает булево значение, указывающее, является ли геометрия «простой». Геометрия простая тогда и только тогда, когда она не пересекается сама с собой (кроме граничных точек). Например, объект LineString не является простым, если он пересекается сам с собой. Таким образом, объекты LinearRing и Polygon всегда простые, поскольку, по определению, они не могут пересекаться сами с собой.

GEOSGeometry.valid

Возвращает булево значение, указывающее, является ли геометрия валидной.

GEOSGeometry.valid_reason

Возвращает строку, описывающую причину невалидности геометрии.

GEOSGeometry.srid

Свойство, которое можно использовать для получения или установки SRID, связанного с геометрией. Например:

>>> pnt = Point(5, 23)
>>> print(pnt.srid)
None
>>> pnt.srid = 4326
>>> pnt.srid
4326

Свойства вывода

Свойства в этом разделе экспортируют объект GEOSGeometry в другой формат. Этот вывод может быть представлен в виде строки, буфера или даже другого объекта.

GEOSGeometry.ewkt

Возвращает «расширенный» текст Well-Known (EWKT) геометрии. Это представление специфично для PostGIS и является надмножеством стандарта OGC WKT. [1] По существу, SRID предваряет представление WKT, например, SRID=4326;POINT(5 23).

Примечание

Вывод этого свойства не включает информацию 3dm, 3dz и 4d, которую PostGIS поддерживает в своих представлениях EWKT.

GEOSGeometry.hex

Возвращает WKB этой геометрии в шестнадцатеричном формате. Обратите внимание, что значение SRID не включено в это представление, так как оно не является частью спецификации OGC (используйте свойство GEOSGeometry.hexewkb вместо него).

GEOSGeometry.hexewkb

Возвращает EWKB этой геометрии в шестнадцатеричном формате. Это расширение спецификации WKB, которое включает значение SRID, являющееся частью этой геометрии.

GEOSGeometry.json

Возвращает представление GeoJSON геометрии. Обратите внимание, что результат не является полной структурой GeoJSON, а только содержимое ключа geometry структуры GeoJSON. См. также Сериализатор GeoJSON.

GEOSGeometry.geojson

Псевдоним для GEOSGeometry.json.

GEOSGeometry.kml

Возвращает представление KML (Keyhole Markup Language) геометрии. Используйте только для геометрий со SRID 4326 (WGS84), но это ограничение не проверяется.

GEOSGeometry.ogr

Возвращает объект OGRGeometry, соответствующий геометрии GEOS.

Примечание

Требуется GDAL.

GEOSGeometry.wkb

Возвращает представление WKB (Well-Known Binary) этой геометрии в виде Python-буфера. Значение SRID не включается, используйте свойство GEOSGeometry.ewkb вместо него.

GEOSGeometry.ewkb

Возвращает представление EWKB этой геометрии в виде Python-буфера. Это расширение спецификации WKB, которое включает любое значение SRID, являющееся частью этой геометрии.

GEOSGeometry.wkt

Возвращает Well-Known Text (WKT) геометрии (стандарт OGC).

Изменено в Django 1.10:

Незначительные нули удаляются из вывода.

Пространственные предикатны методы

Все следующие пространственные предикатны методы принимают другой экземпляр GEOSGeometry (other) в качестве параметра и возвращают булево значение.

GEOSGeometry.contains(other) [source]

Возвращает True если other.within(this) возвращает True.

GEOSGeometry.covers(other) [source]
Добавлена в Django 1.10.

Возвращает True если эта геометрия покрывает указанную геометрию.

Предикат covers имеет следующие эквивалентные определения:

  • Каждая точка другой геометрии является точкой этой геометрии.
  • Матрица пересечения DE-9IM для двух геометрий равна T*****FF*, *T****FF*, ***T**FF*, или ****T*FF*.

Если хотя бы одна из геометрий пуста, возвращает False.

Этот предикат похож на GEOSGeometry.contains(), но более общий (т.е. возвращает True в большем количестве случаев). В частности, в отличие от contains(), он не различает точки на границе и внутри геометрий. В большинстве случаев, covers() следует предпочесть contains(). Кроме того, covers() более пригоден для оптимизации и, следовательно, должен превосходить contains().

GEOSGeometry.crosses(other) [source]

Возвращает True если матрица пересечения DE-9IM для двух геометрий равна T*T****** (для точки и кривой, точки и области или линии и области) 0******** (для двух кривых).

GEOSGeometry.disjoint(other) [source]

Возвращает True если матрица пересечения DE-9IM для двух геометрий является FF*FF****.

GEOSGeometry.equals(other) [source]

Возвращает True если матрица пересечения DE-9IM для двух геометрий является T*F**FFF*.

GEOSGeometry.equals_exact(other, tolerance=0) [source]

Возвращает true, если две геометрии точно равны с заданной точностью. Значение tolerance должно быть числом с плавающей точкой, представляющим толерантность ошибки в сравнении, например, poly1.equals_exact(poly2, 0.001) будет сравнивать равенство с точностью до одной тысячной единицы.

GEOSGeometry.intersects(other) [source]

Возвращает True если GEOSGeometry.disjoint() равно False.

GEOSGeometry.overlaps(other) [source]

Возвращает true, если матрица пересечения DE-9IM для двух геометрий равна T*T***T** (для двух точек или двух поверхностей) 1*T***T** (для двух кривых).

GEOSGeometry.relate_pattern(other, pattern) [source]

Возвращает True если элементы в матрице пересечения DE-9IM для этой геометрии и другой соответствуют заданному шаблону – строке из девяти символов алфавита: {T, F, *, 0}.

GEOSGeometry.touches(other) [source]

Возвращает True если матрица пересечения DE-9IM для двух геометрий равна FT*******, F**T***** или F***T****.

GEOSGeometry.within(other) [source]

Возвращает True если матрица пересечения DE-9IM для двух геометрий равна T*F**F***.

Топологические методы

GEOSGeometry.buffer(width, quadsegs=8) [source]

Возвращает GEOSGeometry, представляющую все точки, расстояние от которых до этой геометрии меньше или равно заданному width. Опциональный параметр quadsegs устанавливает количество сегментов, используемых для аппроксимации четверти окружности (по умолчанию 8).

GEOSGeometry.difference(other) [source]

Возвращает GEOSGeometry, представляющую точки, составляющие эту геометрию, но не составляющие другую.

GEOSGeometry.interpolate(distance)
GEOSGeometry.interpolate_normalized(distance)

При заданном расстоянии (число с плавающей точкой) возвращает точку (или ближайшую точку) внутри геометрии (LineString или MultiLineString) на этом расстоянии. Нормализованная версия принимает расстояние как число с плавающей точкой между 0 (началом) и 1 (концом).

Обратная функция GEOSGeometry.project().

GEOSGeometry.intersection(other) [source]

Возвращает GEOSGeometry, представляющую точки, общие для этой геометрии и другой.

GEOSGeometry.project(point)
GEOSGeometry.project_normalized(point)

Возвращает расстояние (число с плавающей точкой) от начала геометрии (LineString или MultiLineString) до точки, спроектированной на геометрию (т. е. до точки на линии, ближайшей к заданной точке). Нормализованная версия возвращает расстояние как число с плавающей точкой между 0 (началом) и 1 (концом).

Обратная функция GEOSGeometry.interpolate().

GEOSGeometry.relate(other) [source]

Возвращает матрицу пересечения DE-9IM (строку), представляющую топологические отношения между этой геометрией и другой.

GEOSGeometry.simplify(tolerance=0.0, preserve_topology=False) [source]

Возвращает новую GEOSGeometry, упрощенную до заданной толерантности с использованием алгоритма Даугаса-Пеккера. Более высокое значение толерантности подразумевает меньше точек в выводе. Если толерантность не указана, по умолчанию используется 0.

По умолчанию эта функция не сохраняет топологию. Например, объекты Polygon могут быть разделены, сжаты в линии или исчезнуть. Внутренние области объектов Polygon могут быть созданы или исчезнуть, а линии могут пересекаться. Указав preserve_topology=True, результат будет иметь ту же размерность и количество компонентов, что и входной; однако это значительно медленнее.

GEOSGeometry.sym_difference(other) [source]

Возвращает GEOSGeometry, объединяющую точки этой геометрии, не входящие в другую, и точки другой, не входящие в эту геометрию.

GEOSGeometry.union(other) [source]

Возвращает GEOSGeometry, представляющую все точки в этой геометрии и другой.

Топологические свойства

GEOSGeometry.boundary

Возвращает границу как новый объект геометрии.

GEOSGeometry.centroid

Возвращает объект Point, представляющий геометрический центр геометрии. Точка не гарантированно находится внутри геометрии.

GEOSGeometry.convex_hull

Возвращает наименьший Polygon, содержащий все точки в геометрии.

END_OF_DOCUMENT_MARKER
GEOSGeometry.envelope

Возвращает Polygon, представляющий ограничивающую оболочку этой геометрии. Обратите внимание, что он также может вернуть Point, если входная геометрия является точкой.

GEOSGeometry.point_on_surface

Вычисляет и возвращает Point, гарантированно находящуюся внутри этой геометрии.

GEOSGeometry.unary_union
Новое в Django 1.10.

Вычисляет объединение всех элементов этой геометрии.

Результат подчиняется следующему соглашению:

  • Объединение набора LineString приводит к полному узловому соединению и растворению линий.
  • Объединение набора Polygon всегда вернёт Polygon или MultiPolygon геометрию (в отличие от GEOSGeometry.union(), которое может вернуть геометрию меньшей размерности, если произошёл топологический обрыв).

Другие свойства и методы

GEOSGeometry.area

Это свойство возвращает площадь геометрии.

GEOSGeometry.extent

Это свойство возвращает область этой геометрии в виде 4-кортежа, состоящего из (xmin, ymin, xmax, ymax).

GEOSGeometry.clone() [source]

Этот метод возвращает GEOSGeometry, являющийся клоном оригинала.

GEOSGeometry.distance(geom) [source]

Возвращает расстояние между ближайшими точками этой геометрии и заданной geom (другой объект GEOSGeometry).

Примечание

Расчёты расстояний GEOS линейные – другими словами, GEOS не выполняет сферический расчёт, даже если SRID задаёт географическую систему координат.

GEOSGeometry.length

Возвращает длину этой геометрии (например, 0 для Point, длину LineString или окружность Polygon).

GEOSGeometry.prepared

Возвращает GEOS PreparedGeometry для содержимого этой геометрии. PreparedGeometry объекты оптимизированы для операций contains, intersects, covers, crosses, disjoint, overlaps, touches и within. Обратитесь к документации Предготовленные геометрии для получения дополнительной информации.

GEOSGeometry.srs

Возвращает объект SpatialReference, соответствующий SRID геометрии или None.

Примечание

Требуется GDAL.

GEOSGeometry.transform(ct, clone=False) [source]

Преобразует геометрию в соответствии с заданным параметром преобразования координат (ct), который может быть целочисленным SRID, строкой WKT пространственной ссылки, строкой PROJ.4, объектом SpatialReference или объектом CoordTransform. По умолчанию геометрия преобразуется на месте, и ничего не возвращается. Однако, если установлен ключевой параметр clone, то геометрия не изменяется, и вместо этого возвращается преобразованный клон геометрии.

Примечание

Требуется GDAL. Вызывает GEOSException, если GDAL недоступен или SRID геометрии None или меньше 0. Не накладывает никаких ограничений на SRID геометрии, если вызывается с объектом CoordTransform.

Изменено в Django 1.10:

В предыдущих версиях требовалось, чтобы SRID геометрии был положительным целым числом, даже если вызывался с объектом CoordTransform.

Точка

class Point(x=None, y=None, z=None, srid=None) [source]

Объекты Point создаются с помощью аргументов, представляющих координаты компонентов точки или с единственной последовательностью координат. Например, следующие эквивалентны:

>>> pnt = Point(5, 23)
>>> pnt = Point([5, 23])

Пустые объекты Point можно создать, не передавая аргументы или передав пустую последовательность. Следующие эквивалентны:

>>> pnt = Point()
>>> pnt = Point([])
Изменено в Django 1.10:

В предыдущих версиях пустой объект Point нельзя было создать.

Линия

class LineString(*args, **kwargs) [source]

Объекты LineString создаются с использованием аргументов, которые являются либо последовательностью координат, либо объектами Point. Например, следующие эквивалентны:

>>> ls = LineString((0, 0), (1, 1))
>>> ls = LineString(Point(0, 0), Point(1, 1))

Кроме того, объекты LineString также можно создать, передав одну последовательность координат или объекты Point:

>>> ls = LineString( ((0, 0), (1, 1)) )
>>> ls = LineString( [Point(0, 0), Point(1, 1)] )

Пустые объекты LineString можно создать, не передавая аргументы или передав пустую последовательность. Следующие эквивалентны:

>>> ls = LineString()
>>> ls = LineString([])
Изменено в Django 1.10:

В предыдущих версиях пустой объект LineString нельзя было создать.

closed
Новое в Django 1.10.

Возвращает, замкнута ли эта линия.

Линейный полигон

class LinearRing(*args, **kwargs) [source]

Объекты LinearRing создаются точно так же, как объекты LineString, однако координаты должны быть замкнутыми, то есть первая координата должна быть такой же, как последняя. Например:

>>> ls = LinearRing((0, 0), (0, 1), (1, 1), (0, 0))

Обратите внимание, что (0, 0) является первой и последней координатой – если они не были равны, было бы выведено сообщение об ошибке.

Полигон

class Polygon(*args, **kwargs) [source]

Polygon объекты могут быть созданы путём передачи параметров, представляющих кольца полигона. Параметры должны быть экземплярами LinearRing или последовательностью, которая может быть использована для построения LinearRing:

>>> ext_coords = ((0, 0), (0, 1), (1, 1), (1, 0), (0, 0))
>>> int_coords = ((0.4, 0.4), (0.4, 0.6), (0.6, 0.6), (0.6, 0.4), (0.4, 0.4))
>>> poly = Polygon(ext_coords, int_coords)
>>> poly = Polygon(LinearRing(ext_coords), LinearRing(int_coords))
Изменено в Django 1.10:

В предыдущих версиях пустой Polygon не мог быть создан.

classmethod from_bbox(bbox) [source]

Возвращает объект полигона из заданной прямоугольной области, 4-кортеж, содержащий (xmin, ymin, xmax, ymax).

num_interior_rings

Возвращает количество внутренних колец в данной геометрии.

Сравнение полигонов

Обратите внимание, что можно сравнивать Polygon объекты напрямую с < или >, но так как сравнение выполняется через LineString полигона, это не имеет большого смысла (но согласованно и быстро). Вы всегда можете принудительно выполнить сравнение с помощью свойства area:

>>> if poly_1.area > poly_2.area:
>>>     pass

Наборы геометрий

MultiPoint

class MultiPoint(*args, **kwargs) [source]

MultiPoint объекты могут быть созданы путём передачи в качестве аргументов объектов Point, или одной последовательностью объектов Point:

>>> mp = MultiPoint(Point(0, 0), Point(1, 1))
>>> mp = MultiPoint( (Point(0, 0), Point(1, 1)) )
Изменено в Django 1.10:

В предыдущих версиях пустой MultiPoint не мог быть создан.

MultiLineString

class MultiLineString(*args, **kwargs) [source]

MultiLineString объекты могут быть созданы путём передачи в качестве аргументов объектов LineString, или одной последовательностью объектов LineString:

>>> ls1 = LineString((0, 0), (1, 1))
>>> ls2 = LineString((2, 2), (3, 3))
>>> mls = MultiLineString(ls1, ls2)
>>> mls = MultiLineString([ls1, ls2])
Изменено в Django 1.10:

В предыдущих версиях пустой MultiLineString не мог быть создан.

merged

Возвращает LineString, представляющий объединённую линию всех компонентов в этом MultiLineString.

closed
Добавлено в Django 1.10.

Возвращает True тогда и только тогда, когда все элементы закрыты. Требуется GEOS 3.5.

MultiPolygon

class MultiPolygon(*args, **kwargs) [source]

MultiPolygon объекты могут быть созданы путём передачи объектов Polygon в качестве аргументов, или одной последовательностью объектов Polygon:

>>> p1 = Polygon( ((0, 0), (0, 1), (1, 1), (0, 0)) )
>>> p2 = Polygon( ((1, 1), (1, 2), (2, 2), (1, 1)) )
>>> mp = MultiPolygon(p1, p2)
>>> mp = MultiPolygon([p1, p2])
Изменено в Django 1.10:

В предыдущих версиях пустой MultiPolygon не мог быть создан.

cascaded_union

Устарело начиная с версии 1.10: Используйте свойство GEOSGeometry.unary_union вместо этого.

Возвращает Polygon, который является объединением всех полигонов-компонентов в этом наборе. Используемый алгоритм значительно эффективнее (быстрее), чем объединение геометрий по отдельности. [2]

GeometryCollection

class GeometryCollection(*args, **kwargs) [source]

GeometryCollection объекты могут быть созданы путём передачи других объектов GEOSGeometry в качестве аргументов, или одной последовательностью объектов GEOSGeometry:

>>> poly = Polygon( ((0, 0), (0, 1), (1, 1), (0, 0)) )
>>> gc = GeometryCollection(Point(0, 0), MultiPoint(Point(0, 0), Point(1, 1)), poly)
>>> gc = GeometryCollection((Point(0, 0), MultiPoint(Point(0, 0), Point(1, 1)), poly))
Изменено в Django 1.10:

В предыдущих версиях пустой GeometryCollection не мог быть создан.

Подготовленные геометрии

Для получения подготовленной геометрии просто обратитесь к свойству GEOSGeometry.prepared. После получения экземпляра PreparedGeometry его пространственные предикатные методы, перечисленные ниже, могут быть использованы с другими GEOSGeometry объектами. Операция с подготовленной геометрией может быть на порядки быстрее — чем сложнее подготовленная геометрия, тем больше ускорение при выполнении операции. Для получения дополнительной информации, пожалуйста, обратитесь к странице wiki GEOS о подготовленных геометриях.

Например:

>>> from django.contrib.gis.geos import Point, Polygon
>>> poly = Polygon.from_bbox((0, 0, 5, 5))
>>> prep_poly = poly.prepared
>>> prep_poly.contains(Point(2.5, 2.5))
True

PreparedGeometry

class PreparedGeometry

Все методы PreparedGeometry принимают аргумент other, который должен быть экземпляром GEOSGeometry.

contains(other)
contains_properly(other)
covers(other)
crosses(other)
disjoint(other)
intersects(other)
overlaps(other)
touches(other)
within(other)

Геометрические фабрики

fromfile(file_h) [source]
Параметры: file_h (объект Python file или строковый путь к файлу) – входной файл, содержащий пространственные данные
Тип возвращаемого значения: a GEOSGeometry соответствующий пространственным данным в файле

Пример:

>>> from django.contrib.gis.geos import fromfile
>>> g = fromfile('/home/bob/geom.wkt')
fromstr(string, srid=None) [source]
Параметры:
  • string (string) – строка, содержащая пространственные данные
  • srid (int) – идентификатор пространственной системы координат
Тип возвращаемого значения:

объект GEOSGeometry, соответствующий пространственным данным в строке

Это эквивалентно GEOSGeometry(string, srid).

Пример:

>>> from django.contrib.gis.geos import fromstr
>>> pnt = fromstr('POINT(-90.5 29.5)', srid=4326)

Объекты ввода/вывода

Объекты-ридеры

Классы ввода/вывода ридера просто возвращают экземпляр GEOSGeometry из входных данных WKB и/или WKT, переданных в их метод read(geom).

class WKBReader [source]

Пример:

>>> from django.contrib.gis.geos import WKBReader
>>> wkb_r = WKBReader()
>>> wkb_r.read('0101000000000000000000F03F000000000000F03F')
<Point object at 0x103a88910>
class WKTReader [source]

Пример:

>>> from django.contrib.gis.geos import WKTReader
>>> wkt_r = WKTReader()
>>> wkt_r.read('POINT(1 1)')
<Point object at 0x103a88b50>

Объекты-райтеры

Все объекты-райтеры имеют метод write(geom) , который возвращает WKB или WKT заданной геометрии. Кроме того, объекты WKBWriter также имеют свойства, которые можно использовать для изменения порядка байтов и/или включения значения SRID (иными словами, EWKB).

class WKBWriter(dim=2) [source]

WKBWriter предоставляет наибольший контроль над выводом. По умолчанию он возвращает совместимый с OGC WKB, когда вызывается его метод write. Однако он имеет свойства, которые позволяют создавать EWKB — расширение стандарта WKB, которое включает дополнительную информацию. См. документацию по WKBWriter.outdim для получения более подробной информации об аргументе dim.

Изменено в Django 1.10:

Добавлена возможность передать аргумент dim в конструктор.

write(geom) [source]

Возвращает WKB заданной геометрии в виде объекта Python buffer. Пример:

>>> from django.contrib.gis.geos import Point, WKBWriter
>>> pnt = Point(1, 1)
>>> wkb_w = WKBWriter()
>>> wkb_w.write(pnt)
<read-only buffer for 0x103a898f0, size -1, offset 0 at 0x103a89930>
write_hex(geom) [source]

Возвращает WKB геометрии в шестнадцатеричном формате. Пример:

>>> from django.contrib.gis.geos import Point, WKBWriter
>>> pnt = Point(1, 1)
>>> wkb_w = WKBWriter()
>>> wkb_w.write_hex(pnt)
'0101000000000000000000F03F000000000000F03F'
byteorder

Это свойство можно установить, чтобы изменить порядок байтов представления геометрии.

Значение порядка байтов Описание
0 Большой порядок байтов (например, совместимо с RISC-системами)
1 Малый порядок байтов (например, совместимо с x86-системами)

Пример:

>>> from django.contrib.gis.geos import Point, WKBWriter
>>> wkb_w = WKBWriter()
>>> pnt = Point(1, 1)
>>> wkb_w.write_hex(pnt)
'0101000000000000000000F03F000000000000F03F'
>>> wkb_w.byteorder = 0
'00000000013FF00000000000003FF0000000000000'
outdim

Это свойство можно установить, чтобы изменить размерность вывода представления геометрии. Другими словами, если у вас есть 3D геометрия, установите его в 3, чтобы значение Z было включено в WKB.

Значение outdim Описание
2 По умолчанию, вывод 2D WKB.
3 Вывод 3D WKB.

Пример:

>>> from django.contrib.gis.geos import Point, WKBWriter
>>> wkb_w = WKBWriter()
>>> wkb_w.outdim
2
>>> pnt = Point(1, 1, 1)
>>> wkb_w.write_hex(pnt) # By default, no Z value included:
'0101000000000000000000F03F000000000000F03F'
>>> wkb_w.outdim = 3 # Tell writer to include Z values
>>> wkb_w.write_hex(pnt)
'0101000080000000000000F03F000000000000F03F000000000000F03F'
srid

Установите это свойство в булевое значение, чтобы указать, следует ли включать SRID геометрии в представление WKB. Пример:

>>> from django.contrib.gis.geos import Point, WKBWriter
>>> wkb_w = WKBWriter()
>>> pnt = Point(1, 1, srid=4326)
>>> wkb_w.write_hex(pnt) # By default, no SRID included:
'0101000000000000000000F03F000000000000F03F'
>>> wkb_w.srid = True # Tell writer to include SRID
>>> wkb_w.write_hex(pnt)
'0101000020E6100000000000000000F03F000000000000F03F'
class WKTWriter(dim=2, trim=False, precision=None) [source]

Этот класс позволяет выводить представление WKT геометрии. См. атрибуты WKBWriter.outdim, trim и precision для получения подробностей об аргументах конструктора.

Изменено в Django 1.10:

Добавлена возможность передать аргументы dim, trim, и precision в конструктор.

write(geom) [source]

Возвращает WKT заданной геометрии. Пример:

>>> from django.contrib.gis.geos import Point, WKTWriter
>>> pnt = Point(1, 1)
>>> wkt_w = WKTWriter()
>>> wkt_w.write(pnt)
'POINT (1.0000000000000000 1.0000000000000000)'
outdim

См. WKBWriter.outdim.

trim
Добавлен в Django 1.10.

Это свойство используется для включения или выключения обрезки ненужных десятичных знаков.

>>> from django.contrib.gis.geos import Point, WKTWriter
>>> pnt = Point(1, 1)
>>> wkt_w = WKTWriter()
>>> wkt_w.trim
False
>>> wkt_w.write(pnt)
'POINT (1.0000000000000000 1.0000000000000000)'
>>> wkt_w.trim = True
>>> wkt_w.write(pnt)
'POINT (1 1)'
precision
Добавлен в Django 1.10.

Это свойство управляет точностью округления координат; если установлено в None округление отключено.

>>> from django.contrib.gis.geos import Point, WKTWriter
>>> pnt = Point(1.44, 1.66)
>>> wkt_w = WKTWriter()
>>> print(wkt_w.precision)
None
>>> wkt_w.write(pnt)
'POINT (1.4399999999999999 1.6599999999999999)'
>>> wkt_w.precision = 0
>>> wkt_w.write(pnt)
'POINT (1 2)'
>>> wkt_w.precision = 1
>>> wkt_w.write(pnt)
'POINT (1.4 1.7)'

Примечания

[1] См. PostGIS EWKB, EWKT и канонические формы, документация PostGIS в гл. 4.1.2.
[2] Для получения дополнительной информации прочитайте статью в блоге Пола Рэмси о (Значительно) более быстрых объединениях в PostGIS 1.4 и статью в блоге Мартина Дэвиса о Быстром объединении полигонов в JTS с использованием каскадного объединения.

Настройки

GEOS_LIBRARY_PATH

Строка, определяющая расположение библиотеки GEOS C. Как правило, эта настройка используется только в том случае, если библиотека GEOS C находится в нестандартном расположении (например, /home/bob/lib/libgeos_c.so).

Примечание

Настройка должна быть полным путем к библиотеке общего использования C; другими словами, вы хотите использовать libgeos_c.so, а не libgeos.so.

Исключения

exception GEOSException [source]

Базовое исключение GEOS, указывает на ошибку, связанную с GEOS.

© Django Software Foundation and individual contributors
Licensed under the BSD License.
https://docs.djangoproject.com/en/1.10/ref/contrib/gis/geos/

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API