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.
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: |
|
A, C |
|
|
A, C |
|
|
A, C |
|
|
A, C |
|
|
C |
|
|
C |
|
|
C |
|
|
C |
|
|
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 |
|
MariaDB |
|
MySQL |
|
SpatiaLite |
|
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 |
|
MariaDB |
|
MySQL |
|
SpatiaLite |
|
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 |
|
MariaDB |
|
MySQL |
|
SpatiaLite |
|
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 |
|
Oracle |
|
MariaDB |
|
MySQL |
|
SpatiaLite |
|
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 |
|
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 |
|
Oracle |
|
MySQL |
|
SpatiaLite |
|
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 |
|
Oracle |
|
MySQL |
|
SpatiaLite |
|
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 |
|
MariaDB |
|
MySQL |
|
SpatiaLite |
|
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 |
|
Oracle |
|
MariaDB |
|
MySQL |
|
SpatiaLite |
|
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 |
|
Oracle |
|
MariaDB |
|
MySQL |
|
SpatiaLite |
|
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 |
|
Oracle |
|
MariaDB |
|
MySQL |
|
SpatiaLite |
|
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 |
|
Oracle |
|
MariaDB |
|
MySQL |
|
SpatiaLite |
Intersects(poly, geom) |
Disponibilidad: PostGIS
Prueba si la geometría está vacía.
Ejemplo:
Zipcode.objects.filter(poly__isempty=True)
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” |
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 |
|
Oracle |
|
MariaDB |
|
MySQL |
|
SpatiaLite |
|
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:
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*')
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 |
|
MariaDB |
|
MySQL |
|
Oracle |
|
SpatiaLite |
|
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 |
|
MariaDB |
|
MySQL |
|
Oracle |
|
SpatiaLite |
|
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
derecha¶Disponibilidad*: PostGIS, PGRaster (Conversión)
Se prueba si la caja de enfoque del campo de geometría está estrictamente a la derecha de la caja de enfoque de geometría de búsqueda.
Ejemplo:
Zipcode.objects.filter(poly__right=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
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
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 |
|
MariaDB |
|
MySQL |
|
Oracle |
|
SpatiaLite |
|
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 |
|
MariaDB |
|
MySQL |
|
Oracle |
SDO_GEOM.SDO_DISTANCE(poly, geom, 0,05) >= 5 |
SpatiaLite |
Distancia(poly, geom) >= 5 |
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 |
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 |
|
MariaDB |
|
MySQL |
|
Oracle |
|
SpatiaLite |
|
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 |
|
Oracle |
|
SpatiaLite |
|
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 |
Ejemplo:
>>> from django.contrib.gis.db.models import Extent, Union
>>> WorldBorder.objects.aggregate(Extent("mpoly"), Union("mpoly"))
Colecta¶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¶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¶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)
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¶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
may 31, 2026