Referencia API de Consultas GIS

Búsquedas Espaciales

Las consultas espaciales en esta sección están disponibles para GeometryField y RasterField.

Para una introducción, consulta la introducción a las consultas espaciales. Para obtener información sobre qué consultas son compatibles con un backend espacial en particular, consulta la tabla de compatibilidad de consultas espaciales.

Consultas con rasters

Todas las ejemplos en la referencia a continuación se dan para campos de geometría e inputs, pero las consultas pueden usarse de la misma manera con rasters en ambos lados. Cada vez que una consulta no admite entrada raster, la entrada se convierte automáticamente a una geometría donde sea necesario utilizando la función ST_Polygon. Consulta también la introducción a las consultas de rasters.

Los operadores de base de datos utilizados por las consultas se pueden dividir en tres categorías:

  • Soporte nativo de raster N: el operador acepta rasters de forma nativa en ambos lados del lookup, y la entrada de raster se puede mezclar con entradas geométricas.

  • Soporte de raster bilateral B: el operador admite rasters solo si ambos lados del lookup reciben entradas de raster. Los datos de raster se convierten automáticamente a geometrías para los lookups mixtos.

  • Soporte de conversión geométrica C. La búsqueda no tiene soporte nativo para rasters, todos los datos raster se convierten automáticamente a geometrías.

Los ejemplos a continuación muestran el equivalente en SQL para las consultas de los diferentes tipos de soporte raster. El mismo patrón se aplica a todas las consultas espaciales.

Casos

Búsqueda

Equivalente SQL

N, B

rast__contains=rst

ST_Contains(rast, rst)

N, B

La traducción de los textos es la siguiente:

ST_Contiene(rast, 1, rst, 2)

A, C

rast__contiene=geom

ST_Contiene(ST_Polígono(rast), geom)

A, C

rast__1__contiene=geom

ST_Contiene(ST_Polígono(rast, 1), geom)

A, C

poly__contiene=rst

ST_Contiene(poly, ST_Polígono(rst))

A, C

poly__contiene=(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))

Consultas espaciales con rasters solo están soportadas para backends de PostGIS (denominados como PGRaster en esta sección).

bbcontains

Disponibilidad: PostGIS, MariaDB, MySQL, SpatiaLite, PGRaster (nativo)

Se prueba si el rectángulo de contención del campo de geometría o raster completamente contiene el rectángulo de contención del campo de búsqueda de geometría.

Ejemplo:

Zipcode.objects.filter(poly__bbcontains=geom)

Backend

Equivalente SQL

PostGIS

poly ~ geom

MariaDB

MBRContains(poly, geom)

MySQL

MBRContains(poly, geom)

SpatiaLite

MbrContains(poly, geom)

bboverlaps

Disponibilidad: PostGIS, MariaDB, MySQL, SpatiaLite, PGRaster (nativo)

Se prueba si el rectángulo de contención del campo de geometría se superpone con el rectángulo de contención del campo de búsqueda de geometría.

Ejemplo:

Zipcode.objects.filter(poly__bboverlaps=geom)

Backend

Equivalente SQL

PostGIS

poly && geom

MariaDB

MBROverlaps(poly, geom)

MySQL

MBROverlaps(poly, geom)

SpatiaLite

MbrOverlaps(poly, geom)

contenida

Disponibilidad: PostGIS, MariaDB, MySQL, SpatiaLite, PGRaster (nativo)

Comprueba si la caja de encaje del campo de geometría está completamente contenida por la caja de encaje de la geometría de búsqueda.

Ejemplo:

Zipcode.objects.filter(poly__contained=geom)

Backend

Equivalente SQL

PostGIS

poly @ geom

MariaDB

MBRWithin(poly, geom)

MySQL

MBRWithin(poly, geom)

SpatiaLite

MbrWithin(poly, geom)

contiene

Disponibilidad*: PostGIS, Oracle, MariaDB, MySQL, SpatiaLite, PGRaster (Bilateral)

Comprueba si el campo de geometría contiene espacialmente la geometría de búsqueda.

Ejemplo:

Zipcode.objects.filter(poly__contains=geom)

Backend

Equivalente SQL

PostGIS

ST_Contains(poly, geom)

Oracle

SDO_CONTAINS(poly, geom)

MariaDB

ST_Contains(poly, geom)

MySQL

ST_Contains(poly, geom)

SpatiaLite

Contains(poly, geom)

contains_properly`

Disponibilidad: PostGIS, PGRaster (Bilateral)

Devuelve verdadero si la geometría de búsqueda interseca el interior del campo de geometría, pero no la frontera (o exterior).

Ejemplo:

Zipcode.objects.filter(poly__contains_properly=geom)

Backend

Equivalente SQL

PostGIS

ST_ContainsProperly(poly, geom)

coveredby`

Disponibilidad*: PostGIS, Oracle, MySQL, PGRaster (Bilateral), SpatiaLite

Prueba si ningún punto en el campo de geometría está fuera de la geometría de búsqueda. [3]

Ejemplo:

Zipcode.objects.filter(poly__coveredby=geom)

Backend

Equivalente SQL

PostGIS

ST_CoveredBy(poly, geom)

Oracle

SDO_COVEREDBY(poly, geom)

MySQL

MBRCoveredBy(poly, geom)

SpatiaLite

CoveredBy(poly, geom)

Se agregó soporte para MySQL.

covers

Disponibilidad*: PostGIS, Oracle, MySQL, PGRaster (Bilateral), SpatiaLite

Prueba si ningún punto en la geometría de búsqueda está fuera del campo de geometría. [3]

Ejemplo:

Zipcode.objects.filter(poly__covers=geom)

Backend

Equivalente SQL

PostGIS

ST_Cubre(poly, geom)

Oracle

SDO_COBRE(poly, geom)

MySQL

MBRCubre(poly, geom)

SpatiaLite

Cubre(poly, geom)

Se agregó soporte para MySQL.

cruza

Disponibilidad: PostGIS, MariaDB, MySQL, SpatiaLite, PGRaster (Conversion)

Verifica si el campo de geometría cruza la geometría de búsqueda espacialmente.

Ejemplo:

Zipcode.objects.filter(poly__crosses=geom)

Backend

Equivalente SQL

PostGIS

ST_Cruza(poly, geom)

MariaDB

ST_Cruza(poly, geom)

MySQL

ST_Cruza(poly, geom)

SpatiaLite

Cruza(poly, geom)

disjunto

Disponibilidad: PostGIS, Oracle, MariaDB, MySQL, SpatiaLite, PGRaster (Bilateral)

Se prueba si el campo de geometría es espacialmente disjunto con la geometría de búsqueda.

Ejemplo:

Zipcode.objects.filter(poly__disjoint=geom)

Backend

Equivalente SQL

PostGIS

ST_Disjoint(poly, geom)

Oracle

SDO_GEOM.RELATE(poly, 'DISJOINT', geom, 0.05)

MariaDB

ST_Disjoint(poly, geom)

MySQL

ST_Disjoint(poly, geom)

SpatiaLite

Disjoint(poly, geom)

equals

Disponibilidad: PostGIS, Oracle, MariaDB, MySQL, SpatiaLite, PGRaster (Conversion)

Se prueba si el campo de geometría es espacialmente igual a la geometría de búsqueda.

Ejemplo:

Zipcode.objects.filter(poly__equals=geom)

Backend

Equivalente SQL

PostGIS

ST_Equals(poly, geom)

Oracle

SDO_EQUAL(poly, geom)

MariaDB

ST_Equals(poly, geom)

MySQL

ST_Equals(poly, geom)

SpatiaLite

Equals(poly, geom)

exact, same_as

Disponibilidad: PostGIS, Oracle, MariaDB, MySQL, SpatiaLite, PGRaster (Bilateral)

Comprueba si el campo de geometría es «igual» a la geometría de búsqueda. En Oracle, MySQL y SpatiaLite, comprueba la igualdad espacial, mientras que en PostGIS comprueba la igualdad de cajas delimitadoras.

Ejemplo:

Zipcode.objects.filter(poly=geom)

Backend

Equivalente SQL

PostGIS

poly ~= geom

Oracle

SDO_EQUAL(poly, geom)

MariaDB

ST_Equals(poly, geom)

MySQL

ST_Equals(poly, geom)

SpatiaLite

Equals(poly, geom)

intersects

Disponibilidad: PostGIS, Oracle, MariaDB, MySQL, SpatiaLite, PGRaster (Bilateral)

Comprueba si el campo de geometría interseca espacialmente la geometría de búsqueda.

Ejemplo:

Zipcode.objects.filter(poly__intersects=geom)

Backend

Equivalente SQL

PostGIS

ST_Intersects(poly, geom)

Oracle

SDO_OVERLAPBDYINTERSECT(poly, geom)

MariaDB

ST_Intersects(poly, geom)

MySQL

ST_Intersects(poly, geom)

SpatiaLite

Intersects(poly, geom)

isempty

Disponibilidad: PostGIS

Prueba si la geometría está vacía.

Ejemplo:

Zipcode.objects.filter(poly__isempty=True)

isvalid

Disponibilidad: MySQL, PostGIS, Oracle, SpatiaLite

Prueba si la geometría es válida.

Ejemplo:

Zipcode.objects.filter(poly__isvalid=True)

Backend

Equivalente SQL

Bases de datos espaciales

ST_IsValid(poly)

Oracle

SDO_GEOM.VALIDATE_GEOMETRY_WITH_CONTEXT(poly, 0.05) = “TRUE”

overlaps

Dispongo a traducir los textos según las reglas establecidas.

Prueba si el campo de geometría se superpone espacialmente con la geometría de búsqueda.

Backend

Equivalente SQL

PostGIS

ST_Overlaps(poly, geom)

Oracle

SDO_OVERLAPS(poly, geom)

MariaDB

ST_Overlaps(poly, geom)

MySQL

ST_Overlaps(poly, geom)

SpatiaLite

Overlaps(poly, geom)

relate

Availability: PostGIS, MariaDB, Oracle, SpatiaLite, PGRaster (Conversion)

Prueba si el campo de geometría se relaciona espacialmente con la geometría de búsqueda según los valores dados en el patrón dado. Esta búsqueda requiere un parámetro tupla, (geom, pattern); la forma del pattern dependerá del backend espacial:

MariaDB, PostGIS y SpatiaLite

En estos backends espaciales el patrón de intersección es una cadena de nueve caracteres que definen las intersecciones entre el interior, la frontera y el exterior del campo de geometría y la geometría de búsqueda. La matriz de patrones de intersección solo puede utilizar los siguientes caracteres: 1, 2, T, F o *. Este tipo de búsqueda permite a los usuarios «afinar» una relación geométrica específica consistente con el modelo DE-9IM. [1]

Geometry ejemplo:

# 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*"))

Ejemplo SQL equivalente de PostGIS y MariaDB:

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

Ejemplo SQL equivalente de SpatiaLite:

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

Ejemplo de raster:

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

Ejemplo SQL equivalente de 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

Aquí el patrón de relación está compuesto por al menos uno de las nueve cadenas de relación: TOUCH, OVERLAPBDYDISJOINT, OVERLAPBDYINTERSECT, EQUAL, INSIDE, COVEREDBY, CONTAINS, COVERS, ON y ANYINTERACT. Pueden combinarse varias cadenas con el operador lógico Boolean OR, por ejemplo, 'inside+touch'. Las cadenas de relación son insensibles a mayúsculas y minúsculas.

Ejemplo:

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

Ejemplo SQL equivalente de Oracle:

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

touches

Disponibilidad: PostGIS, Oracle, MariaDB, MySQL, SpatiaLite

Comprueba si el campo de geometría espacialmente toca la geometría de búsqueda.

Ejemplo:

Zipcode.objects.filter(poly__touches=geom)

Backend

Equivalente SQL

PostGIS

ST_Touches(poly, geom)

MariaDB

ST_Touches(poly, geom)

MySQL

ST_Touches(poly, geom)

Oracle

SDO_TOUCH(poly, geom)

SpatiaLite

Touches(poly, geom)

dentro

Disponibilidad: PostGIS, Oracle, MariaDB, MySQL, SpatiaLite, PGRaster (Bilateral)

Comprueba si el campo de geometría está espacialmente dentro de la geometría de búsqueda.

Ejemplo:

Zipcode.objects.filter(poly__within=geom)

Backend

Equivalente SQL

PostGIS

ST_Within(poly, geom)

MariaDB

ST_Within(poly, geom)

MySQL

ST_Within(poly, geom)

Oracle

SDO_INSIDE(poly, geom)

SpatiaLite

Within(poly, geom)

izquierda

Disponibilidad*: PostGIS, PGRaster (Conversión)

Se prueba si la caja de enfoque del campo de geometría está estrictamente a la izquierda de la caja de enfoque de geometría de búsqueda.

Ejemplo:

Zipcode.objects.filter(poly__left=geom)

Equivalente de PostGIS:

SELECT ... WHERE poly << geom

sobrepasa_izquierda

Disponibilidad: PostGIS, PGRaster (Bilateral)

Se prueba si la caja de enfoque del campo de geometría sobrepasa o está a la izquierda de la caja de enfoque de geometría de búsqueda.

Ejemplo:

Zipcode.objects.filter(poly__overlaps_left=geom)

Equivalente de PostGIS:

SELECT ... WHERE poly &< geom

sobrepasa_derecha

Disponibilidad: https://postgis.net/docs/ST_Geometry_Overright.html , PGRaster (Bilateral)

Se comprueba si la caja de enfoque del campo de geometría se superpone o está a la derecha de la caja de enfoque de la geometría de búsqueda.

Ejemplo:

Zipcode.objects.filter(poly__overlaps_right=geom)

Equivalente de PostGIS:

SELECT ... WHERE poly &> geom

overlaps_above

Disponibilidad: PostGIS , PGRaster (Conversion)

Se comprueba si la caja de enfoque del campo de geometría se superpone o está por encima de la caja de enfoque de la geometría de búsqueda.

Ejemplo:

Zipcode.objects.filter(poly__overlaps_above=geom)

Equivalente de PostGIS:

SELECT ... WHERE poly |&> geom

overlaps_below

Disponibilidad: PostGIS , PGRaster (Conversion)

Se comprueba si la caja de enfoque del campo de geometría se superpone o está por debajo de la caja de enfoque de la geometría de búsqueda.

Ejemplo:

Zipcode.objects.filter(poly__overlaps_below=geom)

Equivalente de PostGIS:

SELECT ... WHERE poly &<| geom

strictly_above

Disponibilidad: PostGIS , PGRaster (Conversion)

Prueba si la caja de enfoque del campo de geometría está estrictamente por encima de la caja de enfoque de la geometría de búsqueda.

Ejemplo:

Zipcode.objects.filter(poly__strictly_above=geom)

Equivalente de PostGIS:

SELECT ... WHERE poly |>> geom

estrictly_below

Disponibilidad: PostGIS, PGRaster (Conversión)

Prueba si la caja de enfoque del campo de geometría está estrictamente por debajo de la caja de enfoque de la geometría de búsqueda.

Ejemplo:

Zipcode.objects.filter(poly__strictly_below=geom)

Equivalente de PostGIS:

SELECT ... WHERE poly <<| geom

Distancias de búsqueda

Disponibilidad: PostGIS, Oracle, MariaDB, MySQL, SpatiaLite, PGRaster (Nativo)

Para obtener una visión general sobre cómo realizar consultas de distancia, por favor consulte la introducción a las consultas de distancia.

Las consultas de búsqueda de distancia tienen la siguiente forma:

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

El valor pasado en una consulta de distancia es un tupla; los primeros dos valores son obligatorios, y son la geometría para calcular distancias a ella y un valor de distancia (ya sea un número en unidades del campo, un objeto Distance o una expresión de consulta </ref/models/expressions>). Para pasar un índice de banda a la búsqueda, utilice una tupla de 3 donde el segundo elemento es el índice de banda.

En cada consulta de distancia excepto dwithin, se puede incluir un elemento opcional, 'spheroid', para utilizar las funciones de cálculo de distancias más precisas basadas en la esferoide en campos con un sistema de coordenadas geodésico.

En PostgreSQL, la opción 'spheroid' utiliza ST_DistanceSpheroid en lugar de ST_DistanceSphere. La función más simple ST_Distance se utiliza con sistemas de coordenadas proyectados. Las imágenes se convierten a geometrías para consultas basadas en la esferoide.

distance_gt

Devuelve modelos donde la distancia al campo de geometría desde la geometría de búsqueda es mayor que el valor de distancia dado.

Ejemplo:

Zipcode.objects.filter(poly__distance_gt=(geom, D(m=5)))

Backend

Equivalente SQL

PostGIS

ST_Distance/ST_Distance_Sphere(poly, geom) > 5

MariaDB

ST_Distance(poly, geom) > 5

MySQL

ST_Distance(poly, geom) > 5

Oracle

SDO_GEOM.SDO_DISTANCE(poly, geom, 0.05) > 5

SpatiaLite

Distance(poly, geom) > 5

distance_gte

Devuelve modelos donde la distancia al campo de geometría desde la geometría de búsqueda es mayor o igual que el valor de distancia dado.

Ejemplo:

Zipcode.objects.filter(poly__distance_gte=(geom, D(m=5)))

Backend

Equivalente SQL

PostGIS

ST_Distance/ST_Distance_Sphere(poly, geom) >= 5

MariaDB

ST_Distance(poly, geom) >= 5

MySQL

ST_Distance(poly, geom) >= 5

Oracle

SDO_GEOM.SDO_DISTANCE(poly, geom, 0,05) >= 5

SpatiaLite

Distancia(poly, geom) >= 5

distancia_lt

Devuelve modelos donde la distancia al campo de geometría desde la geometría de búsqueda es menor que el valor de distancia dado.

Ejemplo:

Zipcode.objects.filter(poly__distance_lt=(geom, D(m=5)))

Backend

Equivalente SQL

PostGIS

ST_Distance/ST_Distance_Sphere(poly, geom) < 5

MariaDB

ST_Distancia(poly, geom) < 5

MySQL

ST_Distancia(poly, geom) < 5

Oracle

SDO_GEOM.SDO_DISTANCE(poly, geom, 0,05) < 5

SpatiaLite

Distancia(poly, geom) < 5

distancia_lte

Devuelve modelos donde la distancia al campo de geometría desde la geometría de búsqueda es menor o igual que el valor de distancia dado.

Ejemplo:

Zipcode.objects.filter(poly__distance_lte=(geom, D(m=5)))

Backend

Equivalente SQL

PostGIS

ST_Distance/ST_Distance_Sphere(poly, geom) <= 5

MariaDB

ST_Distance(poly, geom) <= 5

MySQL

ST_Distance(poly, geom) <= 5

Oracle

SDO_GEOM.SDO_DISTANCE(poly, geom, 0.05) <= 5

SpatiaLite

Distance(poly, geom) <= 5

dwithin

Devuelve los modelos donde la distancia a el campo de geometría desde la geometría de búsqueda están dentro de la distancia dada entre sí. Ten en cuenta que solo puedes proporcionar objetos Distance si las geometrías objetivo están en un sistema proyectado. Para geometrías geográficas, debes usar unidades del campo de geometría (por ejemplo, grados para WGS84) .

Ejemplo:

Zipcode.objects.filter(poly__dwithin=(geom, D(m=5)))

Backend

Equivalente SQL

PostGIS

ST_DWithin(poly, geom, 5)

Oracle

SDO_WITHIN_DISTANCE(poly, geom, 5)

SpatiaLite

PtDistWithin(poly, geom, 5)

Funciones de agregado

Django proporciona algunas funciones de agregado específicas de GIS. Para detalles sobre cómo utilizar estas funciones de agregado, consulte la guía del tema sobre la agrupación.

Argumento de palabra clave

Descripción

tolerancia

Esta palabra clave es solo para Oracle. Es para el valor de tolerancia utilizado por el procedimiento SDOAGGRTYPE; la documentación de Oracle tiene más detalles.

Ejemplo:

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

Colecta

class Collect(geo_field, filter=None)[fuente]

Disponibilidad: PostGIS, MySQL, SpatiaLite

Devuelve una colección de geometrías o un objeto de geometría MULTI desde la columna de geometría. Esto es análogo a una versión simplificada del agregado Unión, excepto que puede ser varias órdenes de magnitud más rápido que realizar una unión porque combina las geometrías en una colección o objeto multi, sin importar la disolución de límites.

Se agregó soporte para MySQL 8.0.24+.

Extensión

class Extent(geo_field, filter=None)[fuente]

Disponibilidad: PostGIS, Oracle, SpatiaLite

Devuelve la extensión de todos los geo_field en el conjunto de consultas como un 4-tupla, compuesta por la coordenada inferior izquierda y la coordenada superior derecha.

Ejemplo:

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

Extensión3D

class Extent3D(geo_field, filter=None)[fuente]

Disponibilidad*: PostGIS

Devuelve la extensión 3D de todos los geo_field en el conjunto de consultas como un 6-tuple, compuesto por la coordenada inferior izquierda y la coordenada superior derecha (cada una con coordenadas x, y y z).

Ejemplo:

>>> 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, filter=None)[fuente]

Disponibilidad: PostGIS, SpatiaLite

Devuelve un objeto LineString construido a partir de las geometrías de puntos en el campo del conjunto de consultas. Actualmente, ordenar el conjunto de consultas no tiene efecto.

Ejemplo:

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

Unión

class Union(geo_field, filter=None)[fuente]

Disponibilidad: PostGIS, Oracle, SpatiaLite

Este método devuelve un objeto GEOSGeometry que comprende la unión de cada geometría en el conjunto de consultas. Ten en cuenta que el uso de Unión es intensivo para el procesador y puede tardar mucho tiempo en conjuntos de consultas grandes.

Nota

Si el tiempo de cómputo para utilizar este método es demasiado caro, considera usar Collect en su lugar.

Ejemplo:

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

Notas al pie