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"))
Геометрии соответствуют идиомам 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) – идентификатор системы пространственных координат
-
geo_input – входное значение геометрии (строка или
Это базовый класс для всех геометрических объектов 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 |
|
HEX / HEXEWKB |
|
WKB / EWKB |
|
|
Для формата 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. В следующей таблице приведено значение для каждого типа геометрии:
Геометрия
Идентификатор
0
1
2
3
4
5
6
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
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)[исходный код] -
- Параметры:
- Тип возвращаемого значения:
-
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)'
-
Сноски
Настройки
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/