Spec-Zone.ru › Django 5.2

API GEOS

Обзор

Что такое GEOS?

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

Функциональные возможности

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

  • Интерфейс с лицензией BSD для геометрических функций GEOS, реализованный исключительно на 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. Это обычно означает, что вы создаёте объекты GEOS на верхнем уровне некоторых из ваших Python-модулей. Затем из-за проблемы гонки в сборщике мусора ваш модуль собирается мусором до того, как объект GEOS. Чтобы избежать этого, создавайте объекты GEOSGeometry внутри области видимости локальных функций/методов.

Геометрии — это Pythonic-объекты

Объекты GEOSGeometry — это ‘Pythonic-объекты’, другими словами, к их компонентам можно обращаться, их можно изменять и по ним можно итерироваться, используя стандартные 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) [source]
Параметры:
  • geo_input – Значение входных данных геометрии (строка или memoryview)
  • srid (int) – идентификатор пространственной системы координат

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

Параметр srid, если задан, устанавливается в качестве SRID созданной геометрии, если у geo_input нет SRID. Если разные SRID предоставлены через geo_input и 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

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

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
END_OF_DOCUMENT_MARKER

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

Свойства в этом разделе экспортируют объект 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.

GEOSGeometry.wkb

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

GEOSGeometry.ewkb

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

GEOSGeometry.wkt

Возвращает текст Well-Known (WKT) геометрии (стандарт 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

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

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. Не накладывает никаких ограничений на SRID геометрии, если вызывается с объектом CoordTransform.

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) [source]

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

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

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

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

LineString

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([])
closed

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

LinearRing

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

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

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

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

is_counterclockwise [source]

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

Polygon

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))
classmethod from_bbox(bbox) [source]

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

num_interior_rings [source]

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

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

Обратите внимание, что возможно сравнить 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)))

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])
merged

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

closed

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

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])

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))

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

Для получения предварительно обработанной геометрии обратитесь к свойству 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 или путь к файлу) – входной файл, содержащий пространственные данные

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

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

Пример:

>>> from django.contrib.gis.geos import fromfile
>>> g = fromfile("/home/bob/geom.wkt")
fromstr(string, srid=None) [source]
Параметры:
  • 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 [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, которая включает дополнительную информацию. Подробнее о параметре dim см. документацию WKBWriter.outdim.

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

Big Endian (например, совместимо с системами RISC)

1

Little Endian (например, совместимо с системами 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 [source]

Это свойство можно установить для изменения размерности выходных данных геометрии. Другими словами, если у вас есть 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 [source]

Установите это свойство со значением булевого типа, чтобы указать, следует ли включать 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.

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 [source]

См. WKBWriter.outdim.

trim [source]

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

>>> 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 [source]

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

Настройки

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/5.2/ref/contrib/gis/geos/

Spec-Zone.ru

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