=============================Geographic Database Functions=============================.. module:: django.contrib.gis.db.models.functions:synopsis: Geographic Database FunctionsThe functions documented on this page allow users to access geographic databasefunctions 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 eachfunction 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'llget a ``NotImplementedError`` exception.Function's summary:========================= ======================== ====================== ======================= ================== =====================Measurement Relationships Operations Editors Output format Miscellaneous========================= ======================== ====================== ======================= ================== =====================:class:`Area` :class:`Azimuth` :class:`Difference` :class:`ForcePolygonCW` :class:`AsGeoJSON` :class:`IsValid`:class:`Distance` :class:`BoundingCircle` :class:`Intersection` :class:`MakeValid` :class:`AsGML` :class:`MemSize`:class:`GeometryDistance` :class:`Centroid` :class:`SymDifference` :class:`Reverse` :class:`AsKML` :class:`NumGeometries`:class:`Length` :class:`Envelope` :class:`Union` :class:`Scale` :class:`AsSVG` :class:`NumPoints`:class:`Perimeter` :class:`LineLocatePoint` :class:`SnapToGrid` :class:`AsWKB`.. :class:`PointOnSurface` :class:`Transform` :class:`AsWKT`.. :class:`Translate` :class:`GeoHash`========================= ======================== ====================== ======================= ================== =====================``Area``========.. class:: Area(expression, **extra)*Availability*: MariaDB, `MySQL<https://dev.mysql.com/doc/refman/en/gis-polygon-property-functions.html#function_st-area>`_,Oracle, `PostGIS <https://postgis.net/docs/ST_Area.html>`__, SpatiaLiteAccepts a single geographic field or expression and returns the area of thefield as an :class:`~django.contrib.gis.measure.Area` measure.MySQL and SpatiaLite without LWGEOM/RTTOPO don't support area calculations ongeographic SRSes.``AsGeoJSON``=============.. class:: AsGeoJSON(expression, bbox=False, crs=False, precision=8, **extra)*Availability*: MariaDB, `MySQL<https://dev.mysql.com/doc/refman/en/spatial-geojson-functions.html#function_st-asgeojson>`__ (≥ 5.7.5),Oracle, `PostGIS <https://postgis.net/docs/ST_AsGeoJSON.html>`__, SpatiaLiteAccepts a single geographic field or expression and returns a `GeoJSON<https://geojson.org/>`_ representation of the geometry. Note that the resultis not a complete GeoJSON structure but only the ``geometry`` key content of aGeoJSON structure. See also :doc:`/ref/contrib/gis/serializers`.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 boxto be included in the returned GeoJSON. Ignored onOracle.``crs`` Set this to ``True`` if you want the coordinatereference system to be included in the returnedGeoJSON. Ignored on MySQL and Oracle.``precision`` It may be used to specify the number of significantdigits for the coordinates in the GeoJSONrepresentation -- the default value is 8. Ignored onOracle.===================== =====================================================``AsGML``=========.. class:: AsGML(expression, version=2, precision=8, **extra)*Availability*: Oracle, `PostGIS <https://postgis.net/docs/ST_AsGML.html>`__,SpatiaLiteAccepts a single geographic field or expression and returns a `Geographic MarkupLanguage (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`` Specifies the number of significant digits for thecoordinates in the GML representation -- the defaultvalue is 8. Ignored on Oracle.``version`` Specifies the GML version to use: 2 (default) or 3.===================== =====================================================__ https://en.wikipedia.org/wiki/Geography_Markup_Language``AsKML``=========.. class:: AsKML(expression, precision=8, **extra)*Availability*: `PostGIS <https://postgis.net/docs/ST_AsKML.html>`__, SpatiaLiteAccepts a single geographic field or expression and returns a `Keyhole MarkupLanguage (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 ofsignificant digits for the coordinates in the KMLrepresentation -- the default value is 8.===================== =====================================================__ https://developers.google.com/kml/documentation/``AsSVG``=========.. class:: AsSVG(expression, relative=False, precision=8, **extra)*Availability*: `PostGIS <https://postgis.net/docs/ST_AsSVG.html>`__, SpatiaLiteAccepts a single geographic field or expression and returns a `Scalable VectorGraphics (SVG)`__ representation of the geometry.===================== =====================================================Keyword Argument Description===================== =====================================================``relative`` If set to ``True``, the path data will be implementedin terms of relative moves. Defaults to ``False``,meaning that absolute moves are used instead.``precision`` This keyword may be used to specify the number ofsignificant digits for the coordinates in the SVGrepresentation -- the default value is 8.===================== =====================================================__ https://www.w3.org/Graphics/SVG/``AsWKB``=========.. class:: AsWKB(expression, **extra)*Availability*: MariaDB, `MySQL<https://dev.mysql.com/doc/refman/en/gis-format-conversion-functions.html#function_st-asbinary>`__,Oracle, `PostGIS <https://postgis.net/docs/ST_AsBinary.html>`__, SpatiaLiteAccepts a single geographic field or expression and returns a `Well-knownbinary (WKB)`__ representation of the geometry.Example::>>> bytes(City.objects.annotate(wkb=AsWKB('point')).get(name='Chelyabinsk').wkb)b'\x01\x01\x00\x00\x00]3\xf9f\x9b\x91K@\x00X\x1d9\xd2\xb9N@'__ https://en.wikipedia.org/wiki/Well-known_text_representation_of_geometry#Well-known_binary``AsWKT``=========.. class:: AsWKT(expression, **extra)*Availability*: MariaDB, `MySQL<https://dev.mysql.com/doc/refman/en/gis-format-conversion-functions.html#function_st-astext>`__,Oracle, `PostGIS <https://postgis.net/docs/ST_AsText.html>`__, SpatiaLiteAccepts a single geographic field or expression and returns a `Well-known text(WKT)`__ representation of the geometry.Example::>>> City.objects.annotate(wkt=AsWKT('point')).get(name='Chelyabinsk').wkt'POINT (55.137555 61.451728)'__ https://en.wikipedia.org/wiki/Well-known_text_representation_of_geometry``Azimuth``===========.. class:: Azimuth(point_a, point_b, **extra)*Availability*: `PostGIS <https://postgis.net/docs/ST_Azimuth.html>`__,SpatiaLite (LWGEOM/RTTOPO)Returns the azimuth in radians of the segment defined by the given pointgeometries, or ``None`` if the two points are coincident. The azimuth is anglereferenced from north and is positive clockwise: north = ``0``; east = ``π/2``;south = ``π``; west = ``3π/2``.``BoundingCircle``==================.. class:: BoundingCircle(expression, num_seg=48, **extra)*Availability*: `PostGIS <https://postgis.net/docs/ST_MinimumBoundingCircle.html>`__,`Oracle <https://docs.oracle.com/en/database/oracle/oracle-database/21/spatl/SDO_GEOM-reference.html#GUID-82A61626-BB64-4793-B53D-A0DBEC91831A>`_Accepts a single geographic field or expression and returns the smallest circlepolygon that can fully contain the geometry.The ``num_seg`` parameter is used only on PostGIS.``Centroid``============.. class:: Centroid(expression, **extra)*Availability*: MariaDB, `MySQL<https://dev.mysql.com/doc/refman/en/gis-polygon-property-functions.html#function_st-centroid>`__,`PostGIS <https://postgis.net/docs/ST_Centroid.html>`__, Oracle, SpatiaLiteAccepts a single geographic field or expression and returns the ``centroid``value of the geometry.``Difference``==============.. class:: Difference(expr1, expr2, **extra)*Availability*: MariaDB, `MySQL<https://dev.mysql.com/doc/refman/en/spatial-operator-functions.html#function_st-difference>`__,`PostGIS <https://postgis.net/docs/ST_Difference.html>`__, Oracle, SpatiaLiteAccepts two geographic fields or expressions and returns the geometricdifference, that is the part of geometry A that does not intersect withgeometry B.``Distance``============.. class:: Distance(expr1, expr2, spheroid=None, **extra)*Availability*: MariaDB, `MySQL<https://dev.mysql.com/doc/refman/en/spatial-relation-functions-object-shapes.html#function_st-distance>`__,`PostGIS <https://postgis.net/docs/ST_Distance.html>`__, Oracle, SpatiaLiteAccepts two geographic fields or expressions and returns the distance betweenthem, as a :class:`~django.contrib.gis.measure.Distance` object. On MySQL, a rawfloat value is returned when the coordinates are geodetic.On backends that support distance calculation on geodetic coordinates, theproper backend function is automatically chosen depending on the SRID value ofthe geometries (e.g. `ST_DistanceSphere<https://postgis.net/docs/ST_DistanceSphere.html>`__ on PostGIS).When distances are calculated with geodetic (angular) coordinates, as is thecase with the default WGS84 (4326) SRID, you can set the ``spheroid`` keywordargument to decide if the calculation should be based on a simple sphere (lessaccurate, less resource-intensive) or on a spheroid (more accurate, moreresource-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 mShellharbour 972804.613941 mThirroul 1002334.36351 m..... note::Because the ``distance`` attribute is a:class:`~django.contrib.gis.measure.Distance` object, you can easily expressthe value in the units of your choice. For example, ``city.distance.mi`` isthe distance value in miles and ``city.distance.km`` is the distance valuein kilometers. See :doc:`measure` for usage details and the list of:ref:`supported_units`.``Envelope``============.. class:: Envelope(expression, **extra)*Availability*: MariaDB, `MySQL<https://dev.mysql.com/doc/refman/en/gis-general-property-functions.html#function_st-envelope>`__,`Oracle <https://docs.oracle.com/en/database/oracle/oracle-database/21/spatl/spatial-operators-reference.html#GUID-ACED800F-3435-44AA-9606-D40934A23ED0>`__,`PostGIS <https://postgis.net/docs/ST_Envelope.html>`__, SpatiaLiteAccepts a single geographic field or expression and returns the geometryrepresenting the bounding box of the geometry.``ForcePolygonCW``==================.. class:: ForcePolygonCW(expression, **extra)*Availability*: `PostGIS <https://postgis.net/docs/ST_ForcePolygonCW.html>`__,SpatiaLiteAccepts a single geographic field or expression and returns a modified versionof the polygon/multipolygon in which all exterior rings are oriented clockwiseand all interior rings are oriented counterclockwise. Non-polygonal geometriesare returned unchanged.``GeoHash``===========.. class:: GeoHash(expression, precision=None, **extra)*Availability*: `MySQL<https://dev.mysql.com/doc/refman/en/spatial-geohash-functions.html#function_st-geohash>`__ (≥ 5.7.5),`PostGIS <https://postgis.net/docs/ST_GeoHash.html>`__, SpatiaLite(LWGEOM/RTTOPO)Accepts a single geographic field or expression and returns a `GeoHash`__representation of the geometry.The ``precision`` keyword argument controls the number of characters in theresult.__ https://en.wikipedia.org/wiki/Geohash``GeometryDistance``====================.. class:: GeometryDistance(expr1, expr2, **extra)*Availability*: `PostGIS <https://postgis.net/docs/geometry_distance_knn.html>`__Accepts two geographic fields or expressions and returns the distance betweenthem. When used in an :meth:`~django.db.models.query.QuerySet.order_by` clause,it provides index-assisted nearest-neighbor result sets.``Intersection``================.. class:: Intersection(expr1, expr2, **extra)*Availability*: MariaDB, `MySQL<https://dev.mysql.com/doc/refman/en/spatial-operator-functions.html#function_st-intersection>`__,`PostGIS <https://postgis.net/docs/ST_Intersection.html>`__, Oracle, SpatiaLiteAccepts two geographic fields or expressions and returns the geometricintersection between them.``IsValid``===========.. class:: IsValid(expr)*Availability*: `MySQL<https://dev.mysql.com/doc/refman/en/spatial-convenience-functions.html#function_st-isvalid>`__ (≥ 5.7.5),`PostGIS <https://postgis.net/docs/ST_IsValid.html>`__, Oracle, SpatiaLiteAccepts a geographic field or expression and tests if the value is well formed.Returns ``True`` if its value is a valid geometry and ``False`` otherwise.``Length``==========.. class:: Length(expression, spheroid=True, **extra)*Availability*: MariaDB, `MySQL<https://dev.mysql.com/doc/refman/en/gis-linestring-property-functions.html#function_st-length>`__,Oracle, `PostGIS <https://postgis.net/docs/ST_Length.html>`__, SpatiaLiteAccepts a single geographic linestring or multilinestring field or expressionand returns its length as a :class:`~django.contrib.gis.measure.Distance`measure.On PostGIS and SpatiaLite, when the coordinates are geodetic (angular), you canspecify if the calculation should be based on a simple sphere (lessaccurate, less resource-intensive) or on a spheroid (more accurate, moreresource-intensive) with the ``spheroid`` keyword argument.MySQL doesn't support length calculations on geographic SRSes.``LineLocatePoint``===================.. class:: LineLocatePoint(linestring, point, **extra)*Availability*: `PostGIS <https://postgis.net/docs/ST_LineLocatePoint.html>`__,SpatiaLiteReturns a float between 0 and 1 representing the location of the closest point on``linestring`` to the given ``point``, as a fraction of the 2D line length.``MakeValid``=============.. class:: MakeValid(expr)*Availability*: `PostGIS <https://postgis.net/docs/ST_MakeValid.html>`__,SpatiaLite (LWGEOM/RTTOPO)Accepts a geographic field or expression and attempts to convert the value intoa valid geometry without losing any of the input vertices. Geometries that arealready valid are returned without changes. Simple polygons might become amultipolygon and the result might be of lower dimension than the input.``MemSize``===========.. class:: MemSize(expression, **extra)*Availability*: `PostGIS <https://postgis.net/docs/ST_MemSize.html>`__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*: MariaDB, `MySQL<https://dev.mysql.com/doc/refman/en/gis-geometrycollection-property-functions.html#function_st-numgeometries>`__,`PostGIS <https://postgis.net/docs/ST_NumGeometries.html>`__, Oracle,SpatiaLiteAccepts a single geographic field or expression and returns the number ofgeometries if the geometry field is a collection (e.g., a ``GEOMETRYCOLLECTION``or ``MULTI*`` field). Returns 1 for single geometries.On MySQL, returns ``None`` for single geometries.``NumPoints``=============.. class:: NumPoints(expression, **extra)*Availability*: MariaDB, `MySQL<https://dev.mysql.com/doc/refman/en/gis-linestring-property-functions.html#function_st-numpoints>`__,`PostGIS <https://postgis.net/docs/ST_NPoints.html>`__, Oracle, SpatiaLiteAccepts a single geographic field or expression and returns the number of pointsin a geometry.On MySQL, returns ``None`` for any non-``LINESTRING`` geometry.``Perimeter``=============.. class:: Perimeter(expression, **extra)*Availability*: `PostGIS <https://postgis.net/docs/ST_Perimeter.html>`__,Oracle, SpatiaLiteAccepts a single geographic field or expression and returns the perimeter of thegeometry field as a :class:`~django.contrib.gis.measure.Distance` object.``PointOnSurface``==================.. class:: PointOnSurface(expression, **extra)*Availability*: `PostGIS <https://postgis.net/docs/ST_PointOnSurface.html>`__,MariaDB, Oracle, SpatiaLiteAccepts a single geographic field or expression and returns a ``Point`` geometryguaranteed to lie on the surface of the field; otherwise returns ``None``.``Reverse``===========.. class:: Reverse(expression, **extra)*Availability*: `PostGIS <https://postgis.net/docs/ST_Reverse.html>`__, Oracle,SpatiaLiteAccepts a single geographic field or expression and returns a geometry withreversed coordinates.``Scale``=========.. class:: Scale(expression, x, y, z=0.0, **extra)*Availability*: `PostGIS <https://postgis.net/docs/ST_Scale.html>`__, SpatiaLiteAccepts a single geographic field or expression and returns a geometry withscaled coordinates by multiplying them with the ``x``, ``y``, and optionally``z`` parameters.``SnapToGrid``==============.. class:: SnapToGrid(expression, *args, **extra)*Availability*: `PostGIS <https://postgis.net/docs/ST_SnapToGrid.html>`__,SpatiaLiteAccepts a single geographic field or expression and returns a geometry with allpoints snapped to the given grid. How the geometry is snapped to the griddepends on how many numeric (either float, integer, or long) arguments aregiven.=================== =====================================================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*: MariaDB, `MySQL<https://dev.mysql.com/doc/refman/en/spatial-operator-functions.html#function_st-symdifference>`__,`PostGIS <https://postgis.net/docs/ST_SymDifference.html>`__, Oracle,SpatiaLiteAccepts two geographic fields or expressions and returns the geometricsymmetric difference (union without the intersection) between the givenparameters.``Transform``=============.. class:: Transform(expression, srid, **extra)*Availability*: `PostGIS <https://postgis.net/docs/ST_Transform.html>`__,Oracle, SpatiaLiteAccepts a geographic field or expression and a SRID integer code, and returnsthe transformed geometry to the spatial reference system specified by the``srid`` parameter... note::What spatial reference system an integer SRID corresponds to may depend onthe spatial database used. In other words, the SRID numbers used for Oracleare not necessarily the same as those used by PostGIS.``Translate``=============.. class:: Translate(expression, x, y, z=0.0, **extra)*Availability*: `PostGIS <https://postgis.net/docs/ST_Translate.html>`__,SpatiaLiteAccepts a single geographic field or expression and returns a geometry withits coordinates offset by the ``x``, ``y``, and optionally ``z`` numericparameters.``Union``=========.. class:: Union(expr1, expr2, **extra)*Availability*: MariaDB, `MySQL<https://dev.mysql.com/doc/refman/en/spatial-operator-functions.html#function_st-union>`__,`PostGIS <https://postgis.net/docs/ST_Union.html>`__, Oracle, SpatiaLiteAccepts two geographic fields or expressions and returns the union of bothgeometries.