Spec-Zone.ru › Django 6.0

API GEOS

Общие сведения

Что такое GEOS?

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

Возможности

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

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

Учебное руководство

В этом разделе представлено краткое введение и учебное руководство по использованию объектов 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(
...     memoryview(
...         b"\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x14@\x00\x00\x00\x00\x00\x007@"
...     )
... )  # WKB
>>> 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 в локальной области видимости ваших функций и методов.

Геометрии соответствуют идиомам Python

Объекты GEOSGeometry соответствуют идиомам Python: их компоненты можно получать, изменять и перебирать, используя стандартные соглашения 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(). Иными словами, сравниваемые геометрии должны иметь одинаковые координаты в одинаковом порядке и одинаковые SRID:

>>> from django.contrib.gis.geos import LineString
>>> ls1 = LineString((0, 0), (1, 1))
>>> ls2 = LineString((1, 1), (0, 0))
>>> ls3 = LineString((1, 1), (0, 0), srid=4326)
>>> ls1.equals(ls2)
True
>>> ls1 == ls2
False
>>> ls3 == ls2  # different SRIDs
False

Геометрические объекты

GEOSGeometry

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

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

Параметр srid, если он задан, устанавливается как SRID созданной геометрии, если у geo_input нет SRID. Если через параметры geo_input и srid переданы разные SRID, возникает исключение ValueError:

>>> from django.contrib.gis.geos import GEOSGeometry
>>> GEOSGeometry("POINT EMPTY", srid=4326).ewkt
'SRID=4326;POINT EMPTY'
>>> GEOSGeometry("SRID=4326;POINT EMPTY", srid=4326).ewkt
'SRID=4326;POINT EMPTY'
>>> GEOSGeometry("SRID=1;POINT EMPTY", srid=4326)
Traceback (most recent call last):
...
ValueError: Input geometry already has SRID: 1.

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

Формат

Тип входных данных

WKT / EWKT

str

HEX / HEXEWKB

str

WKB / EWKB

memoryview

GeoJSON

str

Для формата GeoJSON SRID задаётся на основе элемента crs. Если crs не указан, по умолчанию используется SRID 4326.

classmethod GEOSGeometry.from_gml(gml_string)

Создаёт GEOSGeometry из заданной строки GML.

Свойства

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. В следующей таблице приведено значение для каждого типа геометрии:

Геометрия

Идентификатор

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

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

GEOSGeometry.hasm
Добавлено в Django 6.0.

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

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 Text геометрии. Это представление специфично для 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.

GEOSGeometry.wkb

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

GEOSGeometry.ewkb

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

GEOSGeometry.wkt

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

Методы пространственных предикатов

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

GEOSGeometry.contains(other)

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

GEOSGeometry.covers(other)

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

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

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

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

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

GEOSGeometry.crosses(other)

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

GEOSGeometry.disjoint(other)

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

GEOSGeometry.equals(other)

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

GEOSGeometry.equals_exact(other, tolerance=0)

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

GEOSGeometry.equals_identical(other)

Возвращает True, если две геометрии поточечно эквивалентны: структура, порядок и значения всех вершин совпадают во всех измерениях. Значения NaN считаются равными другим значениям NaN. Требуется GEOS 3.12.

GEOSGeometry.intersects(other)

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

GEOSGeometry.overlaps(other)

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

GEOSGeometry.relate_pattern(other, pattern)

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

GEOSGeometry.touches(other)

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

GEOSGeometry.within(other)

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

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

GEOSGeometry.buffer(width, quadsegs=8)

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

GEOSGeometry.buffer_with_style(width, quadsegs=8, end_cap_style=1, join_style=1, mitre_limit=5.0)

Аналогичен buffer(), но позволяет настроить стиль буфера.

  • end_cap_style может быть круглым (1), плоским (2) или квадратным (3).
  • join_style может быть круглым (1), с острым углом (2) или с фаской (3).
  • Предельное отношение скоса (mitre_limit) влияет только на стиль соединения со скосом.
GEOSGeometry.difference(other)

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

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

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

Обратная операция для GEOSGeometry.project().

GEOSGeometry.intersection(other)

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

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

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

Обратная операция для GEOSGeometry.interpolate().

GEOSGeometry.relate(other)

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

GEOSGeometry.simplify(tolerance=0.0, preserve_topology=False)

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

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

GEOSGeometry.sym_difference(other)

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

GEOSGeometry.union(other)

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

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

GEOSGeometry.boundary

Возвращает границу в виде вновь созданного объекта Geometry.

GEOSGeometry.centroid

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

GEOSGeometry.convex_hull

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

GEOSGeometry.envelope

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

GEOSGeometry.point_on_surface

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

GEOSGeometry.unary_union

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

Результат соответствует следующим условиям:

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

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

GEOSGeometry.area

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

GEOSGeometry.extent

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

GEOSGeometry.clone()

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

GEOSGeometry.distance(geom)

Возвращает расстояние между ближайшими точками этой геометрии и заданного 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.

GEOSGeometry.transform(ct, clone=False)

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

Примечание

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

GEOSGeometry.make_valid()

Возвращает эквивалентную корректную GEOSGeometry, стараясь не потерять ни одной из входных вершин. Если геометрия уже корректна, она возвращается без изменений. Это аналогично функции базы данных MakeValid. Требуется GEOS 3.8.

GEOSGeometry.normalize(clone=False)

Преобразует эту геометрию в каноническую форму. Если задано ключевое слово clone, геометрия не изменяется, а вместо этого возвращается её нормализованная копия:

>>> g = MultiPoint(Point(0, 0), Point(2, 2), Point(1, 1))
>>> print(g)
MULTIPOINT (0 0, 2 2, 1 1)
>>> g.normalize()
>>> print(g)
MULTIPOINT (2 2, 1 1, 0 0)

Point

class Point(x=None, y=None, z=None, srid=None) [исходный код]

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

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

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

>>> pnt = Point()
>>> pnt = Point([])

LineString

class LineString(*args, **kwargs) [исходный код]

Объекты 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([])
closed

Возвращает признак того, является ли эта LineString замкнутой.

LinearRing

class LinearRing(*args, **kwargs) [исходный код]

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

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

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

is_counterclockwise [исходный код]

Возвращает признак того, является ли эта LinearRing ориентированной против часовой стрелки.

Polygon

class Polygon(*args, **kwargs) [исходный код]

Объекты 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))
classmethod from_bbox(bbox) [исходный код]

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

num_interior_rings [исходный код]

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

Сравнение многоугольников

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

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

Коллекции геометрий

MultiPoint

class MultiPoint(*args, **kwargs) [исходный код]

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

>>> mp = MultiPoint(Point(0, 0), Point(1, 1))
>>> mp = MultiPoint((Point(0, 0), Point(1, 1)))

MultiLineString

class MultiLineString(*args, **kwargs) [исходный код]

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

>>> ls1 = LineString((0, 0), (1, 1))
>>> ls2 = LineString((2, 2), (3, 3))
>>> mls = MultiLineString(ls1, ls2)
>>> mls = MultiLineString([ls1, ls2])
merged

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

closed

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

MultiPolygon

class MultiPolygon(*args, **kwargs) [исходный код]

Объекты 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])

GeometryCollection

class GeometryCollection(*args, **kwargs) [исходный код]

Объекты 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))

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

Чтобы получить подготовленную геометрию, обратитесь к свойству GEOSGeometry.prepared. Получив экземпляр PreparedGeometry, можно применять к другим объектам GEOSGeometry его методы пространственных предикатов, перечисленные ниже. Операция с подготовленной геометрией может выполняться на порядки быстрее; чем сложнее подготавливаемая геометрия, тем выше ускорение операции. Дополнительные сведения см. на вики-странице 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) [исходный код]
Параметры:

file_h (объект Python file или строковый путь к файлу) – входной файл, содержащий пространственные данные

Тип возвращаемого значения:

GEOSGeometry, соответствующий пространственным данным в файле

Пример:

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

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

fromstr(string, srid) эквивалентен 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 [исходный код]

Пример:

>>> from django.contrib.gis.geos import WKBReader
>>> wkb_r = WKBReader()
>>> wkb_r.read("0101000000000000000000F03F000000000000F03F")
<Point object at 0x103a88910>
class WKTReader [исходный код]

Пример:

>>> 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) [исходный код]

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

write(geom) [исходный код]

Возвращает 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) [исходный код]

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

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

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

Значение 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 [исходный код]

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

Значение Outdim

Описание

2

По умолчанию выводится двумерный WKB.

3

Выводится трёхмерный 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) [исходный код]

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

write(geom) [исходный код]

Возвращает 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 [исходный код]

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

>>> 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 [исходный код]

Это свойство управляет точностью округления координат; если задать 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]

См. EWKB, EWKT и канонические формы PostGIS, документацию PostGIS, гл. 4.1.2.

Настройки

GEOS_LIBRARY_PATH

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

Примечание

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

Исключения

exception GEOSException [исходный код]

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

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

Spec-Zone.ru

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