123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995 |
- ==========================
- GIS QuerySet API Reference
- ==========================
- .. currentmodule:: django.contrib.gis.db.models
- .. _spatial-lookups:
- Spatial Lookups
- ===============
- The spatial lookups in this section are available for :class:`GeometryField`
- and :class:`RasterField`.
- For an introduction, see the :ref:`spatial lookups introduction
- <spatial-lookups-intro>`. For an overview of what lookups are
- compatible with a particular spatial backend, refer to the
- :ref:`spatial lookup compatibility table <spatial-lookup-compatibility>`.
- Lookups with rasters
- --------------------
- All examples in the reference below are given for geometry fields and inputs,
- but the lookups can be used the same way with rasters on both sides. Whenever
- a lookup doesn't support raster input, the input is automatically
- converted to a geometry where necessary using the `ST_Polygon
- <https://postgis.net/docs/RT_ST_Polygon.html>`_ function. See also the
- :ref:`introduction to raster lookups <spatial-lookup-raster>`.
- The database operators used by the lookups can be divided into three categories:
- - Native raster support ``N``: the operator accepts rasters natively on both
- sides of the lookup, and raster input can be mixed with geometry inputs.
- - Bilateral raster support ``B``: the operator supports rasters only if both
- sides of the lookup receive raster inputs. Raster data is automatically
- converted to geometries for mixed lookups.
- - Geometry conversion support ``C``. The lookup does not have native raster
- support, all raster data is automatically converted to geometries.
- The examples below show the SQL equivalent for the lookups in the different
- types of raster support. The same pattern applies to all spatial lookups.
- ==== ============================== =======================================================
- Case Lookup SQL Equivalent
- ==== ============================== =======================================================
- 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))``
- ==== ============================== =======================================================
- Spatial lookups with rasters are only supported for PostGIS backends
- (denominated as PGRaster in this section).
- .. fieldlookup:: bbcontains
- ``bbcontains``
- --------------
- *Availability*: `PostGIS <https://postgis.net/docs/ST_Geometry_Contain.html>`__,
- MariaDB, MySQL, SpatiaLite, PGRaster (Native)
- Tests if the geometry or raster field's bounding box completely contains the
- lookup geometry's bounding box.
- Example::
- Zipcode.objects.filter(poly__bbcontains=geom)
- ========== ==========================
- Backend SQL Equivalent
- ========== ==========================
- PostGIS ``poly ~ geom``
- MariaDB ``MBRContains(poly, geom)``
- MySQL ``MBRContains(poly, geom)``
- SpatiaLite ``MbrContains(poly, geom)``
- ========== ==========================
- .. fieldlookup:: bboverlaps
- ``bboverlaps``
- --------------
- *Availability*: `PostGIS <https://postgis.net/docs/geometry_overlaps.html>`__,
- MariaDB, MySQL, SpatiaLite, PGRaster (Native)
- Tests if the geometry field's bounding box overlaps the lookup geometry's
- bounding box.
- Example::
- Zipcode.objects.filter(poly__bboverlaps=geom)
- ========== ==========================
- Backend SQL Equivalent
- ========== ==========================
- PostGIS ``poly && geom``
- MariaDB ``MBROverlaps(poly, geom)``
- MySQL ``MBROverlaps(poly, geom)``
- SpatiaLite ``MbrOverlaps(poly, geom)``
- ========== ==========================
- .. fieldlookup:: contained
- ``contained``
- -------------
- *Availability*: `PostGIS <https://postgis.net/docs/ST_Geometry_Contained.html>`__,
- MariaDB, MySQL, SpatiaLite, PGRaster (Native)
- Tests if the geometry field's bounding box is completely contained by the
- lookup geometry's bounding box.
- Example::
- Zipcode.objects.filter(poly__contained=geom)
- ========== ==========================
- Backend SQL Equivalent
- ========== ==========================
- PostGIS ``poly @ geom``
- MariaDB ``MBRWithin(poly, geom)``
- MySQL ``MBRWithin(poly, geom)``
- SpatiaLite ``MbrWithin(poly, geom)``
- ========== ==========================
- .. fieldlookup:: gis-contains
- ``contains``
- ------------
- *Availability*: `PostGIS <https://postgis.net/docs/ST_Contains.html>`__,
- Oracle, MariaDB, MySQL, SpatiaLite, PGRaster (Bilateral)
- Tests if the geometry field spatially contains the lookup geometry.
- Example::
- Zipcode.objects.filter(poly__contains=geom)
- ========== ============================
- Backend SQL Equivalent
- ========== ============================
- PostGIS ``ST_Contains(poly, geom)``
- Oracle ``SDO_CONTAINS(poly, geom)``
- MariaDB ``ST_Contains(poly, geom)``
- MySQL ``ST_Contains(poly, geom)``
- SpatiaLite ``Contains(poly, geom)``
- ========== ============================
- .. fieldlookup:: contains_properly
- ``contains_properly``
- ---------------------
- *Availability*: `PostGIS <https://postgis.net/docs/ST_ContainsProperly.html>`__,
- PGRaster (Bilateral)
- Returns true if the lookup geometry intersects the interior of the
- geometry field, but not the boundary (or exterior).
- Example::
- Zipcode.objects.filter(poly__contains_properly=geom)
- ========== ===================================
- Backend SQL Equivalent
- ========== ===================================
- PostGIS ``ST_ContainsProperly(poly, geom)``
- ========== ===================================
- .. fieldlookup:: coveredby
- ``coveredby``
- -------------
- *Availability*: `PostGIS <https://postgis.net/docs/ST_CoveredBy.html>`__,
- Oracle, MariaDB 11.7+, MySQL, PGRaster (Bilateral), SpatiaLite
- Tests if no point in the geometry field is outside the lookup geometry.
- [#fncovers]_
- Example::
- Zipcode.objects.filter(poly__coveredby=geom)
- ========== =============================
- Backend SQL Equivalent
- ========== =============================
- PostGIS ``ST_CoveredBy(poly, geom)``
- Oracle ``SDO_COVEREDBY(poly, geom)``
- MariaDB ``MBRCoveredBy(poly, geom)``
- MySQL ``MBRCoveredBy(poly, geom)``
- SpatiaLite ``CoveredBy(poly, geom)``
- ========== =============================
- .. versionchanged:: 5.2
- MySQL and MariaDB 11.7+ support was added.
- .. fieldlookup:: covers
- ``covers``
- ----------
- *Availability*: `PostGIS <https://postgis.net/docs/ST_Covers.html>`__,
- Oracle, MySQL, PGRaster (Bilateral), SpatiaLite
- Tests if no point in the lookup geometry is outside the geometry field.
- [#fncovers]_
- Example::
- Zipcode.objects.filter(poly__covers=geom)
- ========== ==========================
- Backend SQL Equivalent
- ========== ==========================
- PostGIS ``ST_Covers(poly, geom)``
- Oracle ``SDO_COVERS(poly, geom)``
- MySQL ``MBRCovers(poly, geom)``
- SpatiaLite ``Covers(poly, geom)``
- ========== ==========================
- .. versionchanged:: 5.2
- MySQL support was added.
- .. fieldlookup:: crosses
- ``crosses``
- -----------
- *Availability*: `PostGIS <https://postgis.net/docs/ST_Crosses.html>`__,
- MariaDB, MySQL, SpatiaLite, PGRaster (Conversion)
- Tests if the geometry field spatially crosses the lookup geometry.
- Example::
- Zipcode.objects.filter(poly__crosses=geom)
- ========== ==========================
- Backend SQL Equivalent
- ========== ==========================
- PostGIS ``ST_Crosses(poly, geom)``
- MariaDB ``ST_Crosses(poly, geom)``
- MySQL ``ST_Crosses(poly, geom)``
- SpatiaLite ``Crosses(poly, geom)``
- ========== ==========================
- .. fieldlookup:: disjoint
- ``disjoint``
- ------------
- *Availability*: `PostGIS <https://postgis.net/docs/ST_Disjoint.html>`__,
- Oracle, MariaDB, MySQL, SpatiaLite, PGRaster (Bilateral)
- Tests if the geometry field is spatially disjoint from the lookup geometry.
- Example::
- Zipcode.objects.filter(poly__disjoint=geom)
- ========== =================================================
- Backend SQL Equivalent
- ========== =================================================
- 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)``
- ========== =================================================
- .. fieldlookup:: equals
- ``equals``
- ----------
- *Availability*: `PostGIS <https://postgis.net/docs/ST_Equals.html>`__,
- Oracle, MariaDB, MySQL, SpatiaLite, PGRaster (Conversion)
- Tests if the geometry field is spatially equal to the lookup geometry.
- Example::
- Zipcode.objects.filter(poly__equals=geom)
- ========== =================================================
- Backend SQL Equivalent
- ========== =================================================
- PostGIS ``ST_Equals(poly, geom)``
- Oracle ``SDO_EQUAL(poly, geom)``
- MariaDB ``ST_Equals(poly, geom)``
- MySQL ``ST_Equals(poly, geom)``
- SpatiaLite ``Equals(poly, geom)``
- ========== =================================================
- .. fieldlookup:: exact
- :noindex:
- .. fieldlookup:: same_as
- ``exact``, ``same_as``
- ----------------------
- *Availability*: `PostGIS <https://postgis.net/docs/ST_Geometry_Same.html>`__,
- Oracle, MariaDB, MySQL, SpatiaLite, PGRaster (Bilateral)
- Tests if the geometry field is "equal" to the lookup geometry. On Oracle,
- MySQL, and SpatiaLite, it tests spatial equality, while on PostGIS it tests
- equality of bounding boxes.
- Example::
- Zipcode.objects.filter(poly=geom)
- ========== =================================================
- Backend SQL Equivalent
- ========== =================================================
- PostGIS ``poly ~= geom``
- Oracle ``SDO_EQUAL(poly, geom)``
- MariaDB ``ST_Equals(poly, geom)``
- MySQL ``ST_Equals(poly, geom)``
- SpatiaLite ``Equals(poly, geom)``
- ========== =================================================
- .. fieldlookup:: intersects
- ``intersects``
- --------------
- *Availability*: `PostGIS <https://postgis.net/docs/ST_Intersects.html>`__,
- Oracle, MariaDB, MySQL, SpatiaLite, PGRaster (Bilateral)
- Tests if the geometry field spatially intersects the lookup geometry.
- Example::
- Zipcode.objects.filter(poly__intersects=geom)
- ========== =================================================
- Backend SQL Equivalent
- ========== =================================================
- PostGIS ``ST_Intersects(poly, geom)``
- Oracle ``SDO_OVERLAPBDYINTERSECT(poly, geom)``
- MariaDB ``ST_Intersects(poly, geom)``
- MySQL ``ST_Intersects(poly, geom)``
- SpatiaLite ``Intersects(poly, geom)``
- ========== =================================================
- .. fieldlookup:: isempty
- ``isempty``
- -----------
- *Availability*: `PostGIS <https://postgis.net/docs/ST_IsEmpty.html>`__
- Tests if the geometry is empty.
- Example::
- Zipcode.objects.filter(poly__isempty=True)
- .. fieldlookup:: isvalid
- ``isvalid``
- -----------
- *Availability*: MariaDB, MySQL,
- `PostGIS <https://postgis.net/docs/ST_IsValid.html>`__, Oracle, SpatiaLite
- Tests if the geometry is valid.
- Example::
- Zipcode.objects.filter(poly__isvalid=True)
- =================================== ================================================================
- Backend SQL Equivalent
- =================================== ================================================================
- MariaDB, MySQL, PostGIS, SpatiaLite ``ST_IsValid(poly)``
- Oracle ``SDO_GEOM.VALIDATE_GEOMETRY_WITH_CONTEXT(poly, 0.05) = 'TRUE'``
- =================================== ================================================================
- .. versionchanged:: 5.2
- MariaDB 11.7+ support was added.
- .. fieldlookup:: overlaps
- ``overlaps``
- ------------
- *Availability*: `PostGIS <https://postgis.net/docs/ST_Overlaps.html>`__,
- Oracle, MariaDB, MySQL, SpatiaLite, PGRaster (Bilateral)
- Tests if the geometry field spatially overlaps the lookup geometry.
- ========== ============================
- Backend SQL Equivalent
- ========== ============================
- PostGIS ``ST_Overlaps(poly, geom)``
- Oracle ``SDO_OVERLAPS(poly, geom)``
- MariaDB ``ST_Overlaps(poly, geom)``
- MySQL ``ST_Overlaps(poly, geom)``
- SpatiaLite ``Overlaps(poly, geom)``
- ========== ============================
- .. fieldlookup:: relate
- ``relate``
- ----------
- *Availability*: `PostGIS <https://postgis.net/docs/ST_Relate.html>`__,
- MariaDB, Oracle, SpatiaLite, PGRaster (Conversion)
- Tests if the geometry field is spatially related to the lookup geometry by
- the values given in the given pattern. This lookup requires a tuple parameter,
- ``(geom, pattern)``; the form of ``pattern`` will depend on the spatial backend:
- MariaDB, PostGIS, and SpatiaLite
- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- On these spatial backends the intersection pattern is a string comprising
- nine characters, which define intersections between the interior, boundary,
- and exterior of the geometry field and the lookup geometry.
- The intersection pattern matrix may only use the following characters:
- ``1``, ``2``, ``T``, ``F``, or ``*``. This lookup type allows users to "fine tune"
- a specific geometric relationship consistent with the DE-9IM model. [#fnde9im]_
- Geometry example::
- # 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*"))
- PostGIS and MariaDB SQL equivalent:
- .. code-block:: sql
- SELECT ... WHERE ST_Relate(poly, geom, 'T*T***FF*')
- SpatiaLite SQL equivalent:
- .. code-block:: sql
- SELECT ... WHERE Relate(poly, geom, 'T*T***FF*')
- Raster example::
- Zipcode.objects.filter(poly__relate=(rast, 1, "T*T***FF*"))
- Zipcode.objects.filter(rast__2__relate=(rast, 1, "T*T***FF*"))
- PostGIS SQL equivalent:
- .. code-block:: sql
- 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
- ~~~~~~
- Here the relation pattern is comprised of at least one of the nine relation
- strings: ``TOUCH``, ``OVERLAPBDYDISJOINT``, ``OVERLAPBDYINTERSECT``,
- ``EQUAL``, ``INSIDE``, ``COVEREDBY``, ``CONTAINS``, ``COVERS``, ``ON``, and
- ``ANYINTERACT``. Multiple strings may be combined with the logical Boolean
- operator OR, for example, ``'inside+touch'``. [#fnsdorelate]_ The relation
- strings are case-insensitive.
- Example::
- Zipcode.objects.filter(poly__relate=(geom, "anyinteract"))
- Oracle SQL equivalent:
- .. code-block:: sql
- SELECT ... WHERE SDO_RELATE(poly, geom, 'anyinteract')
- .. fieldlookup:: touches
- ``touches``
- -----------
- *Availability*: `PostGIS <https://postgis.net/docs/ST_Touches.html>`__,
- Oracle, MariaDB, MySQL, SpatiaLite
- Tests if the geometry field spatially touches the lookup geometry.
- Example::
- Zipcode.objects.filter(poly__touches=geom)
- ========== ==========================
- Backend SQL Equivalent
- ========== ==========================
- PostGIS ``ST_Touches(poly, geom)``
- MariaDB ``ST_Touches(poly, geom)``
- MySQL ``ST_Touches(poly, geom)``
- Oracle ``SDO_TOUCH(poly, geom)``
- SpatiaLite ``Touches(poly, geom)``
- ========== ==========================
- .. fieldlookup:: within
- ``within``
- ----------
- *Availability*: `PostGIS <https://postgis.net/docs/ST_Within.html>`__,
- Oracle, MariaDB, MySQL, SpatiaLite, PGRaster (Bilateral)
- Tests if the geometry field is spatially within the lookup geometry.
- Example::
- Zipcode.objects.filter(poly__within=geom)
- ========== ==========================
- Backend SQL Equivalent
- ========== ==========================
- PostGIS ``ST_Within(poly, geom)``
- MariaDB ``ST_Within(poly, geom)``
- MySQL ``ST_Within(poly, geom)``
- Oracle ``SDO_INSIDE(poly, geom)``
- SpatiaLite ``Within(poly, geom)``
- ========== ==========================
- .. fieldlookup:: left
- ``left``
- --------
- *Availability*: `PostGIS <https://postgis.net/docs/ST_Geometry_Left.html>`__,
- PGRaster (Conversion)
- Tests if the geometry field's bounding box is strictly to the left of the
- lookup geometry's bounding box.
- Example::
- Zipcode.objects.filter(poly__left=geom)
- PostGIS equivalent:
- .. code-block:: sql
- SELECT ... WHERE poly << geom
- .. fieldlookup:: right
- ``right``
- ---------
- *Availability*: `PostGIS <https://postgis.net/docs/ST_Geometry_Right.html>`__,
- PGRaster (Conversion)
- Tests if the geometry field's bounding box is strictly to the right of the
- lookup geometry's bounding box.
- Example::
- Zipcode.objects.filter(poly__right=geom)
- PostGIS equivalent:
- .. code-block:: sql
- SELECT ... WHERE poly >> geom
- .. fieldlookup:: overlaps_left
- ``overlaps_left``
- -----------------
- *Availability*: `PostGIS <https://postgis.net/docs/ST_Geometry_Overleft.html>`__,
- PGRaster (Bilateral)
- Tests if the geometry field's bounding box overlaps or is to the left of the lookup
- geometry's bounding box.
- Example::
- Zipcode.objects.filter(poly__overlaps_left=geom)
- PostGIS equivalent:
- .. code-block:: sql
- SELECT ... WHERE poly &< geom
- .. fieldlookup:: overlaps_right
- ``overlaps_right``
- ------------------
- *Availability*: `PostGIS <https://postgis.net/docs/ST_Geometry_Overright.html>`__,
- PGRaster (Bilateral)
- Tests if the geometry field's bounding box overlaps or is to the right of the lookup
- geometry's bounding box.
- Example::
- Zipcode.objects.filter(poly__overlaps_right=geom)
- PostGIS equivalent:
- .. code-block:: sql
- SELECT ... WHERE poly &> geom
- .. fieldlookup:: overlaps_above
- ``overlaps_above``
- ------------------
- *Availability*: `PostGIS <https://postgis.net/docs/ST_Geometry_Overabove.html>`__,
- PGRaster (Conversion)
- Tests if the geometry field's bounding box overlaps or is above the lookup
- geometry's bounding box.
- Example::
- Zipcode.objects.filter(poly__overlaps_above=geom)
- PostGIS equivalent:
- .. code-block:: sql
- SELECT ... WHERE poly |&> geom
- .. fieldlookup:: overlaps_below
- ``overlaps_below``
- ------------------
- *Availability*: `PostGIS <https://postgis.net/docs/ST_Geometry_Overbelow.html>`__,
- PGRaster (Conversion)
- Tests if the geometry field's bounding box overlaps or is below the lookup
- geometry's bounding box.
- Example::
- Zipcode.objects.filter(poly__overlaps_below=geom)
- PostGIS equivalent:
- .. code-block:: sql
- SELECT ... WHERE poly &<| geom
- .. fieldlookup:: strictly_above
- ``strictly_above``
- ------------------
- *Availability*: `PostGIS <https://postgis.net/docs/ST_Geometry_Above.html>`__,
- PGRaster (Conversion)
- Tests if the geometry field's bounding box is strictly above the lookup
- geometry's bounding box.
- Example::
- Zipcode.objects.filter(poly__strictly_above=geom)
- PostGIS equivalent:
- .. code-block:: sql
- SELECT ... WHERE poly |>> geom
- .. fieldlookup:: strictly_below
- ``strictly_below``
- ------------------
- *Availability*: `PostGIS <https://postgis.net/docs/ST_Geometry_Below.html>`__,
- PGRaster (Conversion)
- Tests if the geometry field's bounding box is strictly below the lookup
- geometry's bounding box.
- Example::
- Zipcode.objects.filter(poly__strictly_below=geom)
- PostGIS equivalent:
- .. code-block:: sql
- SELECT ... WHERE poly <<| geom
- .. _distance-lookups:
- Distance Lookups
- ================
- *Availability*: PostGIS, Oracle, MariaDB, MySQL, SpatiaLite, PGRaster (Native)
- For an overview on performing distance queries, please refer to
- the :ref:`distance queries introduction <distance-queries>`.
- Distance lookups take the following form:
- .. code-block:: text
- <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"])
- The value passed into a distance lookup is a tuple; the first two
- values are mandatory, and are the geometry to calculate distances to,
- and a distance value (either a number in units of the field, a
- :class:`~django.contrib.gis.measure.Distance` object, or a :doc:`query
- expression </ref/models/expressions>`). To pass a band index to the lookup, use
- a 3-tuple where the second entry is the band index.
- On every distance lookup except :lookup:`dwithin`, an optional element,
- ``'spheroid'``, may be included to use the more accurate spheroid distance
- calculation functions on fields with a geodetic coordinate system.
- On PostgreSQL, the ``'spheroid'`` option uses `ST_DistanceSpheroid
- <https://postgis.net/docs/ST_Distance_Spheroid.html>`__ instead of
- `ST_DistanceSphere <https://postgis.net/docs/ST_DistanceSphere.html>`__. The
- simpler `ST_Distance <https://postgis.net/docs/ST_Distance.html>`__ function is
- used with projected coordinate systems. Rasters are converted to geometries for
- spheroid based lookups.
- .. fieldlookup:: distance_gt
- ``distance_gt``
- ---------------
- Returns models where the distance to the geometry field from the lookup
- geometry is greater than the given distance value.
- Example::
- Zipcode.objects.filter(poly__distance_gt=(geom, D(m=5)))
- ========== ==================================================
- Backend SQL Equivalent
- ========== ==================================================
- 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``
- ========== ==================================================
- .. fieldlookup:: distance_gte
- ``distance_gte``
- ----------------
- Returns models where the distance to the geometry field from the lookup
- geometry is greater than or equal to the given distance value.
- Example::
- Zipcode.objects.filter(poly__distance_gte=(geom, D(m=5)))
- ========== ===================================================
- Backend SQL Equivalent
- ========== ===================================================
- 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``
- ========== ===================================================
- .. fieldlookup:: distance_lt
- ``distance_lt``
- ---------------
- Returns models where the distance to the geometry field from the lookup
- geometry is less than the given distance value.
- Example::
- Zipcode.objects.filter(poly__distance_lt=(geom, D(m=5)))
- ========== ==================================================
- Backend SQL Equivalent
- ========== ==================================================
- 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``
- ========== ==================================================
- .. fieldlookup:: distance_lte
- ``distance_lte``
- ----------------
- Returns models where the distance to the geometry field from the lookup
- geometry is less than or equal to the given distance value.
- Example::
- Zipcode.objects.filter(poly__distance_lte=(geom, D(m=5)))
- ========== ===================================================
- Backend SQL Equivalent
- ========== ===================================================
- 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``
- ========== ===================================================
- .. fieldlookup:: dwithin
- ``dwithin``
- -----------
- Returns models where the distance to the geometry field from the lookup
- geometry are within the given distance from one another. Note that you can only
- provide :class:`~django.contrib.gis.measure.Distance` objects if the targeted
- geometries are in a projected system. For geographic geometries, you should use
- units of the geometry field (e.g. degrees for ``WGS84``) .
- Example::
- Zipcode.objects.filter(poly__dwithin=(geom, D(m=5)))
- ========== ======================================
- Backend SQL Equivalent
- ========== ======================================
- PostGIS ``ST_DWithin(poly, geom, 5)``
- Oracle ``SDO_WITHIN_DISTANCE(poly, geom, 5)``
- SpatiaLite ``PtDistWithin(poly, geom, 5)``
- ========== ======================================
- .. _gis-aggregation-functions:
- Aggregate Functions
- -------------------
- Django provides some GIS-specific aggregate functions. For details on how to
- use these aggregate functions, see :doc:`the topic guide on aggregation
- </topics/db/aggregation>`.
- ===================== =====================================================
- Keyword Argument Description
- ===================== =====================================================
- ``tolerance`` This keyword is for Oracle only. It is for the
- tolerance value used by the ``SDOAGGRTYPE``
- procedure; the `Oracle documentation`__ has more
- details.
- ===================== =====================================================
- __ https://docs.oracle.com/en/database/oracle/oracle-database/21/spatl/
- spatial-concepts.html#GUID-CE10AB14-D5EA-43BA-A647-DAC9EEF41EE6
- Example:
- .. code-block:: pycon
- >>> from django.contrib.gis.db.models import Extent, Union
- >>> WorldBorder.objects.aggregate(Extent("mpoly"), Union("mpoly"))
- ``Collect``
- ~~~~~~~~~~~
- .. class:: Collect(geo_field, filter=None)
- *Availability*: `PostGIS <https://postgis.net/docs/ST_Collect.html>`__,
- MariaDB, MySQL, SpatiaLite
- Returns a ``GEOMETRYCOLLECTION`` or a ``MULTI`` geometry object from the geometry
- column. This is analogous to a simplified version of the :class:`Union`
- aggregate, except it can be several orders of magnitude faster than performing
- a union because it rolls up geometries into a collection or multi object, not
- caring about dissolving boundaries.
- .. versionchanged:: 5.1
- MySQL 8.0.24+ support was added.
- .. versionchanged:: 5.2
- MariaDB 11.7+ support was added.
- ``Extent``
- ~~~~~~~~~~
- .. class:: Extent(geo_field, filter=None)
- *Availability*: `PostGIS <https://postgis.net/docs/ST_Extent.html>`__,
- Oracle, SpatiaLite
- Returns the extent of all ``geo_field`` in the ``QuerySet`` as a 4-tuple,
- comprising the lower left coordinate and the upper right coordinate.
- Example:
- .. code-block:: pycon
- >>> 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, filter=None)
- *Availability*: `PostGIS <https://postgis.net/docs/ST_3DExtent.html>`__
- Returns the 3D extent of all ``geo_field`` in the ``QuerySet`` as a 6-tuple,
- comprising the lower left coordinate and upper right coordinate (each with x, y,
- and z coordinates).
- Example:
- .. code-block:: pycon
- >>> 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)
- *Availability*: `PostGIS <https://postgis.net/docs/ST_MakeLine.html>`__,
- SpatiaLite
- Returns a ``LineString`` constructed from the point field geometries in the
- ``QuerySet``. Currently, ordering the queryset has no effect.
- Example:
- .. code-block:: pycon
- >>> 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, filter=None)
- *Availability*: `PostGIS <https://postgis.net/docs/ST_Union.html>`__,
- Oracle, SpatiaLite
- This method returns a :class:`~django.contrib.gis.geos.GEOSGeometry` object
- comprising the union of every geometry in the queryset. Please note that use of
- ``Union`` is processor intensive and may take a significant amount of time on
- large querysets.
- .. note::
- If the computation time for using this method is too expensive, consider
- using :class:`Collect` instead.
- Example:
- .. code-block:: pycon
- >>> 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.
- .. rubric:: Footnotes
- .. [#fnde9im] *See* `OpenGIS Simple Feature Specification For SQL <https://portal.ogc.org/files/?artifact_id=829>`_, at Ch. 2.1.13.2, p. 2-13 (The Dimensionally Extended Nine-Intersection Model).
- .. [#fnsdorelate] *See* `SDO_RELATE documentation <https://docs.oracle.com/en/
- database/oracle/oracle-database/18/spatl/spatial-operators-reference.html#
- GUID-97C17C18-F05E-49B4-BE11-E89B972E2A02>`_, from the Oracle Spatial and
- Graph Developer's Guide.
- .. [#fncovers] For an explanation of this routine, read `Quirks of the "Contains" Spatial Predicate <https://lin-ear-th-inking.blogspot.com/2007/06/subtleties-of-ogc-covers-spatial.html>`_ by Martin Davis (a PostGIS developer).
|