Spec-Zone.ru › Django 1.11

Справочник по API GeoQuerySet

class GeoQuerySet(model=None)

Пространственные запросы

Пространственные запросы в этом разделе доступны для GeometryField и RasterField.

Для ознакомления см. введение в пространственные запросы. Для обзора совместимости запросов с конкретным пространственным бэкендом, см. таблицу совместимости пространственных запросов.

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

Пространственные запросы теперь поддерживают растровый ввод.

Запросы с растрами

Все примеры в справочнике ниже приведены для геометрических полей и ввода, но запросы можно использовать аналогичным образом с растрами с обеих сторон. В тех случаях, когда запрос не поддерживает растровый ввод, вход автоматически преобразуется в геометрию, когда это необходимо, с использованием функции ST_Polygon. См. также введение в запросы с растрами.

Базовые операторы, используемые запросами, можно разделить на три категории:

  • Прямая поддержка растров N: оператор принимает растры непосредственно с обеих сторон запроса, и растровый ввод может быть смешан с геометрическими вводами.
  • Взаимодействие с растрами B: оператор поддерживает растры только если с обеих сторон запроса используются растровые вводы. Растровые данные автоматически преобразуются в геометрию для смешанных запросов.
  • Поддержка преобразования в геометрию C. Запрос не имеет прямой поддержки растров, все растровые данные автоматически преобразуются в геометрию.

Примеры ниже демонстрируют эквивалентный SQL для запросов в различных типах поддержки растров. Такая же структура применима ко всем пространственным запросам.

Случай Запрос Эквивалент SQL
N, B rast__contains=rst ST_Contains(rast, rst)
N, B rast__1__contains=(rst, 2) ST_Contains(rast, 1, rst, 2)
B, C rast__contains=geom ST_Contains(ST_Polygon(rast), geom)
B, C rast__1__contains=geom ST_Contains(ST_Polygon(rast, 1), geom)
B, C poly__contains=rst ST_Contains(poly, ST_Polygon(rst))
B, C poly__contains=(rst, 1) ST_Contains(poly, ST_Polygon(rst, 1))
C rast__crosses=rst ST_Crosses(ST_Polygon(rast), ST_Polygon(rst))
C rast__1__crosses=(rst, 2) ST_Crosses(ST_Polygon(rast, 1), ST_Polygon(rst, 2))
C rast__crosses=geom ST_Crosses(ST_Polygon(rast), geom)
C poly__crosses=rst ST_Crosses(poly, ST_Polygon(rst))

Пространственные запросы с растрами поддерживаются только для бэкэндов PostGIS (обозначаются как PGRaster в этом разделе).

bbcontains

Доступность: PostGIS, MySQL, SpatiaLite, PGRaster (Прямая поддержка)

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

Пример:

Zipcode.objects.filter(poly__bbcontains=geom)
Бэкенд Эквивалент SQL
PostGIS poly ~ geom
MySQL MBRContains(poly, geom)
SpatiaLite MbrContains(poly, geom)

bboverlaps

Доступность: PostGIS, MySQL, SpatiaLite, PGRaster (Прямая поддержка)

Проверяет, пересекаются ли ограничивающие прямоугольные области геометрического поля и геометрического объекта запроса.

Пример:

Zipcode.objects.filter(poly__bboverlaps=geom)
Бэкенд Эквивалент SQL
PostGIS poly && geom
MySQL MBROverlaps(poly, geom)
SpatiaLite MbrOverlaps(poly, geom)

contained

Доступность: PostGIS, MySQL, SpatiaLite, PGRaster (Прямая поддержка)

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

Пример:

Zipcode.objects.filter(poly__contained=geom)
Бэкенд Эквивалент SQL
PostGIS poly @ geom
MySQL MBRWithin(poly, geom)
SpatiaLite MbrWithin(poly, geom)

contains

Доступность: PostGIS, Oracle, MySQL, SpatiaLite, PGRaster (Взаимодействие)

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

Пример:

Zipcode.objects.filter(poly__contains=geom)
Бэкенд Эквивалент SQL
PostGIS ST_Contains(poly, geom)
Oracle SDO_CONTAINS(poly, geom)
MySQL MBRContains(poly, geom)
SpatiaLite Contains(poly, geom)

contains_properly

Доступность: PostGIS, PGRaster (Взаимодействие)

Возвращает true, если геометрический объект запроса пересекает внутреннюю часть геометрического поля, но не границу (или внешнюю часть).

Пример:

Zipcode.objects.filter(poly__contains_properly=geom)
Бэкенд Эквивалент SQL
PostGIS ST_ContainsProperly(poly, geom)

coveredby

Доступность: PostGIS, Oracle, PGRaster (Взаимодействие)

Проверяет, что ни одна точка в геометрическом поле не находится вне геометрического объекта запроса. [3]

Пример:

Zipcode.objects.filter(poly__coveredby=geom)
Бэкенд Эквивалент SQL
PostGIS ST_CoveredBy(poly, geom)
Oracle SDO_COVEREDBY(poly, geom)

covers

Доступность: PostGIS, Oracle, PGRaster (Взаимодействие)

Проверяет, что ни одна точка в геометрическом объекте запроса не находится вне геометрического поля. [3]

Пример:

Zipcode.objects.filter(poly__covers=geom)
Бэкенд Эквивалент SQL
PostGIS ST_Covers(poly, geom)
Oracle SDO_COVERS(poly, geom)

crosses

Доступность: PostGIS, SpatiaLite, PGRaster (Преобразование)

Проверяет, пересекает ли геометрическое поле пространственно геометрический объект запроса.

Пример:

Zipcode.objects.filter(poly__crosses=geom)
Бэкенд Эквивалент SQL
PostGIS ST_Crosses(poly, geom)
SpatiaLite Crosses(poly, geom)

disjoint

Доступность: PostGIS, Oracle, MySQL, SpatiaLite, PGRaster (Взаимодействие)

Проверяет, являются ли геометрическое поле и геометрический объект запроса пространственно непересекающимися.

Пример:

Zipcode.objects.filter(poly__disjoint=geom)
Бэкенд Эквивалент SQL
PostGIS ST_Disjoint(poly, geom)
Oracle SDO_GEOM.RELATE(poly, 'DISJOINT', geom, 0.05)
MySQL MBRDisjoint(poly, geom)
SpatiaLite Disjoint(poly, geom)

equals

Доступность: PostGIS, Oracle, MySQL, SpatiaLite, PGRaster (Преобразование)

exact, same_as

Доступность: PostGIS, Oracle, MySQL, SpatiaLite, PGRaster (Взаимодействие)

intersects

Доступность: PostGIS, Oracle, MySQL, SpatiaLite, PGRaster (Взаимодействие)

Проверяет, пересекаются ли геометрическое поле и геометрический объект запроса.

Пример:

Zipcode.objects.filter(poly__intersects=geom)
Бэкенд Эквивалент SQL
PostGIS ST_Intersects(poly, geom)
Oracle SDO_OVERLAPBDYINTERSECT(poly, geom)
MySQL MBRIntersects(poly, geom)
SpatiaLite Intersects(poly, geom)

isvalid

Новое в Django 1.10.

Доступность: PostGIS, Oracle, SpatiaLite

Проверяет, является ли геометрия валидной.

Пример:

Zipcode.objects.filter(poly__isvalid=True)
Backend SQL-эквивалент
PostGIS, SpatiaLite ST_IsValid(poly)
Oracle SDO_GEOM.VALIDATE_GEOMETRY_WITH_CONTEXT(poly, 0.05) = 'TRUE'
Изменено в Django 1.11:

Добавлена поддержка Oracle и SpatiaLite.

overlaps

Доступность: PostGIS, Oracle, MySQL, SpatiaLite, PGRaster (Взаимно)

relate

Доступность: PostGIS, Oracle, SpatiaLite, PGRaster (Преобразование)

Проверяет, пространственно ли поле geometry связано с геометрией поиска в соответствии со значениями, заданными в указанном шаблоне. Этот поиск требует параметра кортежа, (geom, pattern); форма pattern будет зависеть от пространственного бэкэнда:

PostGIS и SpatiaLite

В этих пространственных бэкендах шаблон пересечения представляет собой строку из девяти символов, определяющих пересечения между внутренней, граничной и внешней частями поля geometry и геометрией поиска. Матрица шаблона пересечения может использовать только следующие символы: 1, 2, T, F, или *. Этот тип поиска позволяет пользователям «точно настроить» определённое геометрическое соотношение, соответствующее модели DE-9IM. [1]

Пример геометрии:

# A tuple lookup parameter is used to specify the geometry and
# the intersection pattern (the pattern here is for 'contains').
Zipcode.objects.filter(poly__relate=(geom, 'T*T***FF*'))

SQL-эквивалент для PostGIS:

SELECT ... WHERE ST_Relate(poly, geom, 'T*T***FF*')

SQL-эквивалент для SpatiaLite:

SELECT ... WHERE Relate(poly, geom, 'T*T***FF*')

Пример растрового изображения:

Zipcode.objects.filter(poly__relate=(rast, 1, 'T*T***FF*'))
Zipcode.objects.filter(rast__2__relate=(rast, 1, 'T*T***FF*'))

SQL-эквивалент для PostGIS:

SELECT ... WHERE ST_Relate(poly, ST_Polygon(rast, 1), 'T*T***FF*')
SELECT ... WHERE ST_Relate(ST_Polygon(rast, 2), ST_Polygon(rast, 1), 'T*T***FF*')

Oracle

Здесь шаблон соотношения состоит как минимум из одной из девяти строк соотношений: TOUCH, OVERLAPBDYDISJOINT, OVERLAPBDYINTERSECT, EQUAL, INSIDE, COVEREDBY, CONTAINS, COVERS, ON, и ANYINTERACT. Несколько строк могут быть объединены логическим булевым оператором ИЛИ, например, 'inside+touch'. [2] Строки соотношений нечувствительны к регистру.

Пример:

Zipcode.objects.filter(poly__relate=(geom, 'anyinteract'))

SQL-эквивалент для Oracle:

SELECT ... WHERE SDO_RELATE(poly, geom, 'anyinteract')

touches

Доступность: PostGIS, Oracle, MySQL, SpatiaLite

Проверяет, касается ли поле geometry геометрию поиска.

Пример:

Zipcode.objects.filter(poly__touches=geom)
Backend SQL-эквивалент
PostGIS ST_Touches(poly, geom)
MySQL MBRTouches(poly, geom)
Oracle SDO_TOUCH(poly, geom)
SpatiaLite Touches(poly, geom)

within

Доступность: PostGIS, Oracle, MySQL, SpatiaLite, PGRaster (Взаимно)

Проверяет, находится ли поле geometry внутри геометрии поиска.

Пример:

Zipcode.objects.filter(poly__within=geom)
Backend SQL-эквивалент
PostGIS ST_Within(poly, geom)
MySQL MBRWithin(poly, geom)
Oracle SDO_INSIDE(poly, geom)
SpatiaLite Within(poly, geom)

left

Доступность: PostGIS, PGRaster (Преобразование)

Проверяет, находится ли прямоугольник ограничивающей области поля geometry строго слева от прямоугольника ограничивающей области геометрии поиска.

Пример:

Zipcode.objects.filter(poly__left=geom)

Эквивалент PostGIS:

SELECT ... WHERE poly << geom

right

Доступность: PostGIS, PGRaster (Преобразование)

Проверяет, находится ли прямоугольник ограничивающей области поля geometry строго справа от прямоугольника ограничивающей области геометрии поиска.

Пример:

Zipcode.objects.filter(poly__right=geom)

Эквивалент PostGIS:

SELECT ... WHERE poly >> geom

overlaps_left

Доступность: PostGIS, PGRaster (Взаимно)

Проверяет, пересекается ли или находится ли прямоугольник ограничивающей области поля geometry слева от прямоугольника ограничивающей области геометрии поиска.

Пример:

Zipcode.objects.filter(poly__overlaps_left=geom)

Эквивалент PostGIS:

SELECT ... WHERE poly &< geom

overlaps_right

Доступность: PostGIS, PGRaster (Взаимно)

Проверяет, пересекается ли или находится ли прямоугольник ограничивающей области поля geometry справа от прямоугольника ограничивающей области геометрии поиска.

Пример:

Zipcode.objects.filter(poly__overlaps_right=geom)

Эквивалент PostGIS:

SELECT ... WHERE poly &> geom

overlaps_above

Доступность: PostGIS, PGRaster (Преобразование)

Проверяет, пересекается ли или находится ли прямоугольник ограничивающей области поля geometry сверху от прямоугольника ограничивающей области геометрии поиска.

Пример:

Zipcode.objects.filter(poly__overlaps_above=geom)

Эквивалент PostGIS:

SELECT ... WHERE poly |&> geom

overlaps_below

Доступность: PostGIS, PGRaster (Преобразование)

Проверяет, пересекается ли или находится ли прямоугольник ограничивающей области поля geometry снизу от прямоугольника ограничивающей области геометрии поиска.

Пример:

Zipcode.objects.filter(poly__overlaps_below=geom)

Эквивалент PostGIS:

SELECT ... WHERE poly &<| geom

strictly_above

Доступность: PostGIS, PGRaster (Преобразование)

Проверяет, находится ли прямоугольник ограничивающей области поля geometry строго над прямоугольником ограничивающей области геометрии поиска.

Пример:

Zipcode.objects.filter(poly__strictly_above=geom)

Эквивалент PostGIS:

SELECT ... WHERE poly |>> geom

strictly_below

Доступность: PostGIS, PGRaster (Преобразование)

Проверяет, находится ли прямоугольник ограничивающей области поля geometry строго под прямоугольником ограничивающей области геометрии поиска.

Пример:

Zipcode.objects.filter(poly__strictly_below=geom)

Эквивалент PostGIS:

SELECT ... WHERE poly <<| geom

Поиск по расстоянию

Доступность: PostGIS, Oracle, SpatiaLite, PGRaster (Native)

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

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

<field>__<distance lookup>=(<geometry/raster>, <distance value>[, 'spheroid'])
<field>__<distance lookup>=(<raster>, <band_index>, <distance value>[, 'spheroid'])
<field>__<band_index>__<distance lookup>=(<raster>, <band_index>, <distance value>[, 'spheroid'])

Передаваемое значение в поиске по расстоянию — кортеж; первые два значения обязательны и представляют собой геометрию, к которой необходимо вычислить расстояния, и значение расстояния (число в единицах поля, объект Distance, или query expression <ref/models/expressions>). Чтобы передать индекс полосы в поиск, используйте кортеж из трёх элементов, где вторым элементом является индекс полосы.

Во всех поисках по расстоянию, кроме dwithin, можно включить необязательный элемент, 'spheroid', чтобы использовать более точные функции вычисления расстояний по сфероиду для полей с геодезической системой координат.

В PostgreSQL опция 'spheroid' использует ST_DistanceSpheroid вместо ST_DistanceSphere. Простая функция ST_Distance используется с проекционными системами координат. Растровые данные преобразуются в геометрию для поисков, основанных на сфероиде.

Добавлено в Django 1.10:

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

Добавлено в Django 1.11:

Добавлена поддержка опции 'spheroid' в SQLite.

distance_gt

Возвращает модели, где расстояние до поля geometry от геометрии поиска больше заданного значения расстояния.

Пример:

Zipcode.objects.filter(poly__distance_gt=(geom, D(m=5)))
Backend SQL-эквивалент
PostGIS ST_Distance/ST_Distance_Sphere(poly, geom) > 5
Oracle SDO_GEOM.SDO_DISTANCE(poly, geom, 0.05) > 5
SpatiaLite Distance(poly, geom) > 5

distance_gte

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

Пример:

Zipcode.objects.filter(poly__distance_gte=(geom, D(m=5)))
Backend SQL-эквивалент
PostGIS ST_Distance/ST_Distance_Sphere(poly, geom) >= 5
Oracle SDO_GEOM.SDO_DISTANCE(poly, geom, 0.05) >= 5
SpatiaLite Distance(poly, geom) >= 5

distance_lt

Возвращает модели, где расстояние до поля geometry от геометрии поиска меньше заданного значения расстояния.

Пример:

Zipcode.objects.filter(poly__distance_lt=(geom, D(m=5)))
Backend SQL-эквивалент
PostGIS ST_Distance/ST_Distance_Sphere(poly, geom) < 5
Oracle SDO_GEOM.SDO_DISTANCE(poly, geom, 0.05) < 5
SpatiaLite Distance(poly, geom) < 5

distance_lte

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

Пример:

Zipcode.objects.filter(poly__distance_lte=(geom, D(m=5)))
Бэкенд SQL эквивалент
PostGIS ST_Distance/ST_Distance_Sphere(poly, geom) <= 5
Oracle SDO_GEOM.SDO_DISTANCE(poly, geom, 0.05) <= 5
SpatiaLite Distance(poly, geom) <= 5

dwithin

Возвращает модели, где расстояние до геометрического поля от геометрии поиска находится в пределах заданного расстояния друг от друга. Обратите внимание, что вы можете указать только объекты Distance, если целевые геометрии находятся в проектной системе координат. Для географических геометрий следует использовать единицы измерения поля геометрии (например, градусы для WGS84) .

Пример:

Zipcode.objects.filter(poly__dwithin=(geom, D(m=5)))
Бэкенд SQL эквивалент
PostGIS ST_DWithin(poly, geom, 5)
Oracle SDO_WITHIN_DISTANCE(poly, geom, 5)
SpatiaLite PtDistWithin(poly, geom, 5)
Изменено в Django 1.11:

Добавлена поддержка SpatiaLite.

GeoQuerySet Методы

Устарело начиная с версии 1.9: Использование GeoQuerySet методов устарело и теперь не рекомендуется в пользу новых Функций географической базы данных. Хотя они немного более подробные, они намного мощнее в том, как их можно комбинировать для построения более сложных запросов.

GeoQuerySet методы указывают, что пространственная операция должна быть выполнена над каждым пространственным полем в наборе запросов и результат должен быть сохранён в новом атрибуте модели (в общем случае, это имя GeoQuerySet метода).

Также существуют агрегирующие GeoQuerySet методы, которые возвращают одно значение вместо набора запросов. В этом разделе будет описан API и доступность каждого GeoQuerySet метода, доступного в GeoDjango.

Примечание

Доступные методы зависят от вашего пространственного бэкенда. Дополнительные сведения см. в таблице совместимости.

За исключением нескольких случаев, следующие ключевые аргументы могут быть использованы со всеми GeoQuerySet методами:

Ключевой аргумент Описание
field_name

По умолчанию GeoQuerySet методы используют первое геометрическое поле, встречающееся в модели. Этот ключевой аргумент следует использовать для указания другого геометрического поля (например, field_name='point2') при наличии нескольких геометрических полей в модели.

В PostGIS ключевой аргумент field_name также может использоваться для геометрических полей в моделях, связанных через ForeignKey отношение (например, field_name='related__point') .

model_att

По умолчанию GeoQuerySet методы обычно прикрепляют свой результат в атрибут с тем же именем, что и GeoQuerySet метод. Установка этого ключевого аргумента с желаемым именем атрибута переопределит это поведение по умолчанию. Например, qs = Zipcode.objects.centroid(model_att='c') прикрепит центр Zipcode геометрического поля в атрибут c каждой модели, а не в атрибут centroid.

Этот ключевой аргумент необходим, если имя метода конфликтует с существующим GeoQuerySet методом - например, если вы хотите использовать метод area() для модели с полем PolygonField с именем area.

Измерение

Доступность: PostGIS, Oracle, SpatiaLite

area

GeoQuerySet.area(**kwargs)

Устарело начиная с версии 1.9: Используйте функцию Area вместо неё.

Возвращает площадь геометрического поля в атрибуте area каждого элемента этого набора запросов.

distance

GeoQuerySet.distance(geom, **kwargs)

Устарело начиная с версии 1.9: Используйте функцию Distance вместо неё.

Этот метод принимает геометрию в качестве параметра и прикрепляет атрибут distance к каждой модели в возвращаемом наборе запросов, содержащему расстояние (в виде объекта Distance) до заданной геометрии.

В следующем примере (взятом из GeoDjango тестов расстояния) вычисляется расстояние от города Хобарт (Тасмания) до каждой другой точки PointField в наборе запросов AustraliaCity.

>>> pnt = AustraliaCity.objects.get(name='Hobart').point
>>> for city in AustraliaCity.objects.distance(pnt): print(city.name, city.distance)
Wollongong 990071.220408 m
Shellharbour 972804.613941 m
Thirroul 1002334.36351 m
Mittagong 975691.632637 m
Batemans Bay 834342.185561 m
Canberra 598140.268959 m
Melbourne 575337.765042 m
Sydney 1056978.87363 m
Hobart 0.0 m
Adelaide 1162031.83522 m
Hillsdale 1049200.46122 m

Примечание

Поскольку атрибут distance является объектом Distance, вы можете легко выразить значение в необходимых единицах измерения. Например, city.distance.mi - это значение расстояния в милях, а city.distance.km - это значение расстояния в километрах. Подробные сведения об использовании и список поддерживаемых единиц измерения см. в Объектах измерения.

length

GeoQuerySet.length(**kwargs)

Устарело начиная с версии 1.9: Используйте функцию Length вместо неё.

Возвращает длину поля геометрии в атрибуте length (объект Distance) каждой модели в наборе запросов.

perimeter

GeoQuerySet.perimeter(**kwargs)

Устарело начиная с версии 1.9: Используйте функцию Perimeter вместо неё.

Возвращает периметр поля геометрии в атрибуте perimeter (объект Distance) каждой модели в наборе запросов.

Геометрические отношения

Следующие методы не принимают аргументов и прикрепляют геометрические объекты к каждому элементу набора запросов GeoQuerySet, являющегося результатом вычисления функции отношения над полем геометрии.

centroid

GeoQuerySet.centroid(**kwargs)

Устарело начиная с версии 1.9: Используйте функцию Centroid вместо неё.

Доступность: PostGIS, Oracle, SpatiaLite

Возвращает значение centroid для геометрического поля в атрибуте centroid каждого элемента GeoQuerySet.

envelope

GeoQuerySet.envelope(**kwargs)

Устарело начиная с версии 1.9: Используйте функцию Envelope вместо неё.

Доступность: PostGIS, SpatiaLite

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

point_on_surface

GeoQuerySet.point_on_surface(**kwargs)

Устарело начиная с версии 1.9: Используйте функцию PointOnSurface вместо неё.

Доступность: PostGIS, Oracle, SpatiaLite

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

Редактор геометрии

force_rhr

GeoQuerySet.force_rhr(**kwargs)

Deprecated since version 1.9: Use the ForceRHR function instead.

Availability: PostGIS

Returns a modified version of the polygon/multipolygon in which all of the vertices follow the Right-Hand-Rule, and attaches as a force_rhr attribute on each element of the queryset.

reverse_geom

GeoQuerySet.reverse_geom(**kwargs)

Deprecated since version 1.9: Use the Reverse function instead.

Availability: PostGIS, Oracle

Reverse the coordinate order of the geometry field, and attaches as a reverse attribute on each element of the queryset.

scale

GeoQuerySet.scale(x, y, z=0.0, **kwargs)

Deprecated since version 1.9: Use the Scale function instead.

Availability: PostGIS, SpatiaLite

snap_to_grid

GeoQuerySet.snap_to_grid(*args, **kwargs)

Deprecated since version 1.9: Use the SnapToGrid function instead.

Snap all points of the input geometry to the grid. How the geometry is snapped to the grid depends on how many numeric (either float, integer, or long) arguments are given.

Number of Arguments Description
1 A single size to snap both the X and Y grids to.
2 X and Y sizes to snap the grid to.
4 X, Y sizes and the corresponding X, Y origins.

transform

GeoQuerySet.transform(srid=4326, **kwargs)

Deprecated since version 1.9: Use the Transform function instead.

Availability: PostGIS, Oracle, SpatiaLite

The transform method transforms the geometry field of a model to the spatial reference system specified by the srid parameter. If no srid is given, then 4326 (WGS84) is used by default.

Примечание

В отличие от других GeoQuerySet методов, transform сохраняет свой результат «на месте». Другими словами, новое атрибута для преобразованной геометрии не размещается на моделях.

Примечание

Какой пространственная система ссылок соответствует целочисленному SRID, может зависеть от используемой пространственной базы данных. Другими словами, номера SRID, используемые для Oracle, не обязательно совпадают с теми, которые используются PostGIS.

Пример:

>>> qs = Zipcode.objects.all().transform() # Transforms to WGS84
>>> qs = Zipcode.objects.all().transform(32140) # Transforming to "NAD83 / Texas South Central"
>>> print(qs[0].poly.srid)
32140
>>> print(qs[0].poly)
POLYGON ((234055.1698884720099159 4937796.9232223574072123 ...

translate

GeoQuerySet.translate(x, y, z=0.0, **kwargs)

Deprecated since version 1.9: Use the Translate function instead.

Availability: PostGIS, SpatiaLite

Translates the geometry field to a new location using the given numeric parameters as offsets.

Геометрические операции

Availability: PostGIS, Oracle, SpatiaLite

Следующие методы принимают геометрию в качестве параметра и прикрепляют геометрию к каждому элементу GeoQuerySet, являющегося результатом операции.

difference

GeoQuerySet.difference(geom)

Deprecated since version 1.9: Use the Difference function instead.

Returns the spatial difference of the geographic field with the given geometry in a difference attribute on each element of the GeoQuerySet.

intersection

GeoQuerySet.intersection(geom)

Deprecated since version 1.9: Use the Intersection function instead.

Returns the spatial intersection of the geographic field with the given geometry in an intersection attribute on each element of the GeoQuerySet.

sym_difference

GeoQuerySet.sym_difference(geom)

Deprecated since version 1.9: Use the SymDifference function instead.

Returns the symmetric difference of the geographic field with the given geometry in a sym_difference attribute on each element of the GeoQuerySet.

union

GeoQuerySet.union(geom)

Deprecated since version 1.9: Use the Union function instead.

Returns the union of the geographic field with the given geometry in an union attribute on each element of the GeoQuerySet.

Вывод геометрии

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

geohash

GeoQuerySet.geohash(precision=20, **kwargs)

Deprecated since version 1.9: Use the GeoHash function instead.

Attaches a geohash attribute to every model the queryset containing the GeoHash representation of the geometry.

geojson

GeoQuerySet.geojson(**kwargs)

Deprecated since version 1.9: Use the AsGeoJSON function instead.

Availability: PostGIS, SpatiaLite

Attaches a geojson attribute to every model in the queryset that contains the GeoJSON representation of the geometry.

Keyword Argument Description
precision It may be used to specify the number of significant digits for the coordinates in the GeoJSON representation – the default value is 8.
crs Set this to True if you want the coordinate reference system to be included in the returned GeoJSON.
bbox Set this to True if you want the bounding box to be included in the returned GeoJSON.

gml

GeoQuerySet.gml(**kwargs)

Deprecated since version 1.9: Use the AsGML function instead.

Availability: PostGIS, Oracle, SpatiaLite

Attaches a gml attribute to every model in the queryset that contains the Geographic Markup Language (GML) representation of the geometry.

Example:

>>> qs = Zipcode.objects.all().gml()
>>> print(qs[0].gml)
<gml:Polygon srsName="EPSG:4326"><gml:OuterBoundaryIs>-147.78711,70.245363 ...  -147.78711,70.245363</gml:OuterBoundaryIs></gml:Polygon>
Keyword Argument Description
precision This keyword is for PostGIS only. It may be used to specify the number of significant digits for the coordinates in the GML representation – the default value is 8.
version This keyword is for PostGIS only. It may be used to specify the GML version used, and may only be values of 2 or 3. The default value is 2.

kml

GeoQuerySet.kml(**kwargs)

Устарело начиная с версии 1.9: Используйте функцию AsKML вместо неё.

Доступность: PostGIS, SpatiaLite

Прикрепляет атрибут kml к каждой модели в наборе запросов, содержащем представление языка разметки ключей (KML) геометрических полей. Следует отметить, что содержимое KML преобразуется в WGS84 при необходимости.

Пример:

>>> qs = Zipcode.objects.all().kml()
>>> print(qs[0].kml)
<Polygon><outerBoundaryIs><LinearRing><coordinates>-103.04135,36.217596,0 ... -103.04135,36.217596,0</coordinates></LinearRing></outerBoundaryIs></Polygon>
Ключевое слово Описание
precision Это ключевое слово может быть использовано для указания количества значащих цифр для координат в представлении KML — значение по умолчанию равно 8.

svg

GeoQuerySet.svg(**kwargs)

Устарело начиная с версии 1.9: Используйте функцию AsSVG вместо неё.

Доступность: PostGIS, SpatiaLite

Прикрепляет атрибут svg к каждой модели в наборе запросов, содержащем данные пути в формате Scalable Vector Graphics (SVG) геометрических полей.

Ключевое слово Описание
relative Если установлено в значение True, данные пути будут реализованы в терминах относительных перемещений. По умолчанию это False, что означает использование абсолютных перемещений.
precision Это ключевое слово может быть использовано для указания количества значащих цифр для координат в представлении SVG — значение по умолчанию равно 8.

Разное

mem_size

GeoQuerySet.mem_size(**kwargs)

Устарело начиная с версии 1.9: Используйте функцию MemSize вместо неё.

Доступность: PostGIS

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

num_geom

GeoQuerySet.num_geom(**kwargs)

Устарело начиная с версии 1.9: Используйте функцию NumGeometries вместо неё.

Доступность: PostGIS, Oracle, SpatiaLite

Возвращает количество геометрий в атрибуте num_geom на каждом элементе набора запросов GeoQuerySet, если геометрическое поле представляет собой коллекцию (например, поле GEOMETRYCOLLECTION или MULTI*); в противном случае устанавливается значение None.

num_points

GeoQuerySet.num_points(**kwargs)

Устарело начиная с версии 1.9: Используйте функцию NumPoints вместо неё.

Доступность: PostGIS, Oracle, SpatiaLite

Возвращает количество точек в первом полилинии в геометрическом поле в атрибуте num_points на каждом элементе набора запросов GeoQuerySet; в противном случае устанавливается значение None.

Функции агрегирования

Django предоставляет некоторые специфичные для GIS функции агрегирования. Подробнее о том, как использовать эти функции агрегирования, см. в руководстве по агрегированию.

Ключевое слово Описание
tolerance Это ключевое слово используется только для Oracle. Оно предназначено для значения толерантности, используемого процедурой SDOAGGRTYPE; в документации Oracle есть более подробная информация.

Пример:

>>> from django.contrib.gis.db.models import Extent, Union
>>> WorldBorder.objects.aggregate(Extent('mpoly'), Union('mpoly'))

Collect

class Collect(geo_field)

Доступность: PostGIS, SpatiaLite

Возвращает объект геометрии типа GEOMETRYCOLLECTION или MULTI из столбца геометрии. Это аналогично упрощенной версии агрегата Union, за исключением того, что она может быть на несколько порядков быстрее при выполнении объединения, так как просто сворачивает геометрии в коллекцию или многоугольник, не обращая внимания на растворение границ.

Extent

class Extent(geo_field)

Доступность: PostGIS, Oracle, SpatiaLite

Возвращает область всех geo_field в наборе запросов QuerySet в виде четвёрки, включающей координаты нижнего левого и верхнего правого углов.

Пример:

>>> qs = City.objects.filter(name__in=('Houston', 'Dallas')).aggregate(Extent('poly'))
>>> print(qs['poly__extent'])
(-96.8016128540039, 29.7633724212646, -95.3631439208984, 32.782058715820)

Extent3D

class Extent3D(geo_field)

Доступность: PostGIS

Возвращает 3D-объём всех geo_field в наборе запросов QuerySet в виде шестерки, включающей координаты нижнего левого и верхнего правого углов (каждая с координатами x, y и z).

Пример:

>>> qs = City.objects.filter(name__in=('Houston', 'Dallas')).aggregate(Extent3D('poly'))
>>> print(qs['poly__extent3d'])
(-96.8016128540039, 29.7633724212646, 0, -95.3631439208984, 32.782058715820, 0)

MakeLine

class MakeLine(geo_field)

Доступность: PostGIS, SpatiaLite

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

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

Добавлена поддержка SpatiaLite.

Пример:

>>> qs = City.objects.filter(name__in=('Houston', 'Dallas')).aggregate(MakeLine('poly'))
>>> print(qs['poly__makeline'])
LINESTRING (-95.3631510000000020 29.7633739999999989, -96.8016109999999941 32.7820570000000018)

Union

class Union(geo_field)

Доступность: PostGIS, Oracle, SpatiaLite

Этот метод возвращает объект GEOSGeometry, представляющий объединение всех геометрий в наборе запросов. Обратите внимание, что использование Union является ресурсоемким и может занять значительное время на больших наборах запросов.

Примечание

Если время вычислений при использовании этого метода слишком велико, рассмотрите использование Collect вместо него.

Пример:

>>> u = Zipcode.objects.aggregate(Union(poly))  # This may take a long time.
>>> u = Zipcode.objects.filter(poly__within=bbox).aggregate(Union(poly))  # A more sensible approach.

Примечания

[1] См. OpenGIS Simple Feature Specification For SQL, в гл. 2.1.13.2, стр. 2-13 (Модель девяти пересечений с расширенными измерениями).
[2] См. документацию SDO_RELATE из руководства разработчика Oracle Spatial and Graph.
[3] (1, 2) Для объяснения этой процедуры прочтите О тонкостях пространственного предиката "Содержит" Мартина Дэвиса (разработчика PostGIS).

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

Spec-Zone.ru

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