123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438 |
- =============================
- Geographic Database Functions
- =============================
- .. module:: django.contrib.gis.db.models.functions
- :synopsis: Geographic Database Functions
- .. versionadded:: 1.9
- The functions documented on this page allow users to access geographic database
- functions to be used in annotations, aggregations, or filters in Django.
- Example::
- >>> from django.contrib.gis.db.models.functions import Length
- >>> Track.objects.annotate(length=Length('line')).filter(length__gt=100)
- Not all backends support all functions, so refer to the documentation of each
- function to see if your database backend supports the function you want to use.
- If you call a geographic function on a backend that doesn't support it, you'll
- get a ``NotImplementedError`` exception.
- Function's summary:
- ================== ======================= ====================== =================== ================== =====================
- Measurement Relationships Operations Editors Output format Miscellaneous
- ================== ======================= ====================== =================== ================== =====================
- :class:`Area` :class:`BoundingCircle` :class:`Difference` :class:`ForceRHR` :class:`AsGeoJSON` :class:`MemSize`
- :class:`Distance` :class:`Centroid` :class:`Intersection` :class:`Reverse` :class:`AsGML` :class:`NumGeometries`
- :class:`Length` :class:`Envelope` :class:`SymDifference` :class:`Scale` :class:`AsKML` :class:`NumPoints`
- :class:`Perimeter` :class:`PointOnSurface` :class:`Union` :class:`SnapToGrid` :class:`AsSVG`
- :class:`Transform` :class:`GeoHash`
- :class:`Translate`
- ================== ======================= ====================== =================== ================== =====================
- Area
- ----
- .. class:: Area(expression, **extra)
- *Availability*: MySQL, Oracle, PostGIS, SpatiaLite
- Accepts a single geographic field or expression and returns the area of the
- field as an :class:`~django.contrib.gis.measure.Area` measure. On MySQL, a raw
- float value is returned, as it's not possible to automatically determine the
- unit of the field.
- AsGeoJSON
- ---------
- .. class:: AsGeoJSON(expression, bbox=False, crs=False, precision=8, **extra)
- *Availability*: PostGIS, SpatiaLite
- Accepts a single geographic field or expression and returns a `GeoJSON
- <http://geojson.org/>`_ representation of the geometry.
- Example::
- >>> City.objects.annotate(json=AsGeoJSON('point')).get(name='Chicago').json
- {"type":"Point","coordinates":[-87.65018,41.85039]}
- ===================== =====================================================
- Keyword Argument Description
- ===================== =====================================================
- ``bbox`` Set this to ``True`` if you want the bounding box
- to be included in the returned GeoJSON.
- ``crs`` Set this to ``True`` if you want the coordinate
- reference system to be included in the returned
- GeoJSON.
- ``precision`` It may be used to specify the number of significant
- digits for the coordinates in the GeoJSON
- representation -- the default value is 8.
- ===================== =====================================================
- AsGML
- -----
- .. class:: AsGML(expression, version=2, precision=8, **extra)
- *Availability*: Oracle, PostGIS, SpatiaLite
- Accepts a single geographic field or expression and returns a `Geographic Markup
- Language (GML)`__ representation of the geometry.
- Example::
- >>> qs = Zipcode.objects.annotate(gml=AsGML('poly'))
- >>> 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`` Not used on Oracle. It may be used to specify the number
- of significant digits for the coordinates in the GML
- representation -- the default value is 8.
- ``version`` Not used on Oracle. It may be used to specify the GML
- version used, and may only be values of 2 or 3. The
- default value is 2.
- ===================== =====================================================
- __ https://en.wikipedia.org/wiki/Geography_Markup_Language
- AsKML
- -----
- .. class:: AsKML(expression, precision=8, **extra)
- *Availability*: PostGIS, SpatiaLite
- Accepts a single geographic field or expression and returns a `Keyhole Markup
- Language (KML)`__ representation of the geometry.
- Example::
- >>> qs = Zipcode.objects.annotate(kml=AsKML('poly'))
- >>> print(qs[0].kml)
- <Polygon><outerBoundaryIs><LinearRing><coordinates>-103.04135,36.217596,0 ...
- -103.04135,36.217596,0</coordinates></LinearRing></outerBoundaryIs></Polygon>
- ===================== =====================================================
- Keyword Argument Description
- ===================== =====================================================
- ``precision`` This keyword may be used to specify the number of
- significant digits for the coordinates in the KML
- representation -- the default value is 8.
- ===================== =====================================================
- __ https://developers.google.com/kml/documentation/
- AsSVG
- -----
- .. class:: AsSVG(expression, relative=False, precision=8, **extra)
- *Availability*: PostGIS, SpatiaLite
- Accepts a single geographic field or expression and returns a `Scalable Vector
- Graphics (SVG)`__ representation of the geometry.
- ===================== =====================================================
- Keyword Argument Description
- ===================== =====================================================
- ``relative`` If set to ``True``, the path data will be implemented
- in terms of relative moves. Defaults to ``False``,
- meaning that absolute moves are used instead.
- ``precision`` This keyword may be used to specify the number of
- significant digits for the coordinates in the SVG
- representation -- the default value is 8.
- ===================== =====================================================
- __ http://www.w3.org/Graphics/SVG/
- BoundingCircle
- --------------
- .. class:: BoundingCircle(expression, num_seg=48, **extra)
- *Availability*: `PostGIS <http://postgis.net/docs/ST_MinimumBoundingCircle.html>`__
- Accepts a single geographic field or expression and returns the smallest circle
- polygon that can fully contain the geometry.
- Centroid
- --------
- .. class:: Centroid(expression, **extra)
- *Availability*: PostGIS, Oracle, SpatiaLite
- Accepts a single geographic field or expression and returns the ``centroid``
- value of the geometry.
- Difference
- ----------
- .. class:: Difference(expr1, expr2, **extra)
- *Availability*: PostGIS, Oracle, SpatiaLite
- Accepts two geographic fields or expressions and returns the geometric
- difference, that is the part of geometry A that does not intersect with
- geometry B.
- Distance
- --------
- .. class:: Distance(expr1, expr2, spheroid=None, **extra)
- *Availability*: MySQL, PostGIS, Oracle, SpatiaLite
- Accepts two geographic fields or expressions and returns the distance between
- them, as a :class:`~django.contrib.gis.measure.Distance` object. On MySQL, a raw
- float value is returned, as it's not possible to automatically determine the
- unit of the field.
- On backends that support distance calculation on geodetic coordinates, the
- proper backend function is automatically chosen depending on the SRID value of
- the geometries (e.g. ``ST_Distance_Sphere`` on PostGIS).
- When distances are calculated with geodetic (angular) coordinates, as is the
- case with the default WGS84 (4326) SRID, you can set the ``spheroid`` keyword
- argument to decide if the calculation should be based on a simple sphere (less
- accurate, less resource-intensive) or on a spheroid (more accurate, more
- resource-intensive).
- In the following example, the distance from the city of Hobart to every other
- :class:`~django.contrib.gis.db.models.PointField` in the ``AustraliaCity``
- queryset is calculated::
- >>> from django.contrib.gis.db.models.functions import Distance
- >>> pnt = AustraliaCity.objects.get(name='Hobart').point
- >>> for city in AustraliaCity.objects.annotate(distance=Distance('point', pnt)):
- ... print(city.name, city.distance)
- Wollongong 990071.220408 m
- Shellharbour 972804.613941 m
- Thirroul 1002334.36351 m
- ...
- .. note::
- Because the ``distance`` attribute is a
- :class:`~django.contrib.gis.measure.Distance` object, you can easily express
- the value in the units of your choice. For example, ``city.distance.mi`` is
- the distance value in miles and ``city.distance.km`` is the distance value
- in kilometers. See :doc:`measure` for usage details and the list of
- :ref:`supported_units`.
- Envelope
- --------
- .. class:: Envelope(expression, **extra)
- *Availability*: PostGIS, SpatiaLite
- Accepts a single geographic field or expression and returns the geometry
- representing the bounding box of the geometry.
- ForceRHR
- --------
- .. class:: ForceRHR(expression, **extra)
- *Availability*: `PostGIS <http://postgis.net/docs/ST_ForceRHR.html>`__
- Accepts a single geographic field or expression and returns a modified version
- of the polygon/multipolygon in which all of the vertices follow the
- right-hand rule.
- GeoHash
- -------
- .. class:: GeoHash(expression, **extra)
- *Availability*: PostGIS
- Accepts a single geographic field or expression and returns a `GeoHash`__
- representation of the geometry.
- __ https://en.wikipedia.org/wiki/Geohash
- Intersection
- ------------
- .. class:: Intersection(expr1, expr2, **extra)
- *Availability*: PostGIS, Oracle, SpatiaLite
- Accepts two geographic fields or expressions and returns the geometric
- intersection between them.
- Length
- ------
- .. class:: Length(expression, spheroid=True, **extra)
- *Availability*: MySQL, Oracle, PostGIS, SpatiaLite
- Accepts a single geographic linestring or multilinestring field or expression
- and returns its length as an :class:`~django.contrib.gis.measure.Distance`
- measure. On MySQL, a raw float value is returned, as it's not possible to
- automatically determine the unit of the field.
- On PostGIS and SpatiaLite, when the coordinates are geodetic (angular), you can
- specify if the calculation should be based on a simple sphere (less
- accurate, less resource-intensive) or on a spheroid (more accurate, more
- resource-intensive) with the ``spheroid`` keyword argument.
- MemSize
- -------
- .. class:: MemSize(expression, **extra)
- *Availability*: PostGIS
- Accepts a single geographic field or expression and returns the memory size
- (number of bytes) that the geometry field takes.
- NumGeometries
- -------------
- .. class:: NumGeometries(expression, **extra)
- *Availability*: PostGIS, Oracle, SpatiaLite
- Accepts a single geographic field or expression and returns the number of
- geometries if the geometry field is a collection (e.g., a ``GEOMETRYCOLLECTION``
- or ``MULTI*`` field); otherwise returns ``None``.
- NumPoints
- ---------
- .. class:: NumPoints(expression, **extra)
- *Availability*: PostGIS, Oracle, SpatiaLite
- Accepts a single geographic field or expression and returns the number of points
- in the first linestring in the geometry field; otherwise returns ``None``.
- Perimeter
- ---------
- .. class:: Perimeter(expression, **extra)
- *Availability*: PostGIS, Oracle, SpatiaLite
- Accepts a single geographic field or expression and returns the perimeter of the
- geometry field as a :class:`~django.contrib.gis.measure.Distance` object. On
- MySQL, a raw float value is returned, as it's not possible to automatically
- determine the unit of the field.
- PointOnSurface
- --------------
- .. class:: PointOnSurface(expression, **extra)
- *Availability*: PostGIS, Oracle, SpatiaLite
- Accepts a single geographic field or expression and returns a ``Point`` geometry
- guaranteed to lie on the surface of the field; otherwise returns ``None``.
- Reverse
- -------
- .. class:: Reverse(expression, **extra)
- *Availability*: PostGIS, Oracle, SpatiaLite (≥ 4.0)
- Accepts a single geographic field or expression and returns a geometry with
- reversed coordinates.
- Scale
- -----
- .. class:: Scale(expression, x, y, z=0.0, **extra)
- *Availability*: PostGIS, SpatiaLite
- Accepts a single geographic field or expression and returns a geometry with
- scaled coordinates by multiplying them with the ``x``, ``y``, and optionally
- ``z`` parameters.
- SnapToGrid
- ----------
- .. class:: SnapToGrid(expression, *args, **extra)
- *Availability*: PostGIS, SpatiaLite
- Accepts a single geographic field or expression and returns a geometry with all
- points snapped to the given 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.
- =================== =====================================================
- SymDifference
- -------------
- .. class:: SymDifference(expr1, expr2, **extra)
- *Availability*: PostGIS, Oracle, SpatiaLite
- Accepts two geographic fields or expressions and returns the geometric
- symmetric difference (union without the intersection) between the given
- parameters.
- Transform
- ---------
- .. class:: Transform(expression, srid, **extra)
- *Availability*: PostGIS, Oracle, SpatiaLite
- Accepts a geographic field or expression and a SRID integer code, and returns
- the transformed geometry to the spatial reference system specified by the
- ``srid`` parameter.
- .. note::
- What spatial reference system an integer SRID corresponds to may depend on
- the spatial database used. In other words, the SRID numbers used for Oracle
- are not necessarily the same as those used by PostGIS.
- Translate
- ---------
- .. class:: Translate(expression, x, y, z=0.0, **extra)
- *Availability*: PostGIS, SpatiaLite
- Accepts a single geographic field or expression and returns a geometry with
- its coordinates offset by the ``x``, ``y``, and optionally ``z`` numeric
- parameters.
- Union
- -----
- .. class:: Union(expr1, expr2, **extra)
- *Availability*: PostGIS, Oracle, SpatiaLite
- Accepts two geographic fields or expressions and returns the union of both
- geometries.
|