mirror of
https://github.com/django/django.git
synced 2025-06-27 22:39:12 +00:00
Fixed #36471 -- Added support for __coveredby GIS lookup and Collect, GeoHash, IsValid on MariaDB 12.0.1+.
This commit is contained in:
parent
b2407e4d7d
commit
7091801e04
@ -45,6 +45,7 @@ class MySQLOperations(BaseSpatialOperations, DatabaseOperations):
|
|||||||
"bboverlaps": SpatialOperator(func="MBROverlaps"), # ...
|
"bboverlaps": SpatialOperator(func="MBROverlaps"), # ...
|
||||||
"contained": SpatialOperator(func="MBRWithin"), # ...
|
"contained": SpatialOperator(func="MBRWithin"), # ...
|
||||||
"contains": SpatialOperator(func="ST_Contains"),
|
"contains": SpatialOperator(func="ST_Contains"),
|
||||||
|
"coveredby": SpatialOperator(func="MBRCoveredBy"),
|
||||||
"crosses": SpatialOperator(func="ST_Crosses"),
|
"crosses": SpatialOperator(func="ST_Crosses"),
|
||||||
"disjoint": SpatialOperator(func="ST_Disjoint"),
|
"disjoint": SpatialOperator(func="ST_Disjoint"),
|
||||||
"equals": SpatialOperator(func="ST_Equals"),
|
"equals": SpatialOperator(func="ST_Equals"),
|
||||||
@ -57,9 +58,10 @@ class MySQLOperations(BaseSpatialOperations, DatabaseOperations):
|
|||||||
}
|
}
|
||||||
if self.connection.mysql_is_mariadb:
|
if self.connection.mysql_is_mariadb:
|
||||||
operators["relate"] = SpatialOperator(func="ST_Relate")
|
operators["relate"] = SpatialOperator(func="ST_Relate")
|
||||||
|
if self.connection.mysql_version < (12, 0, 1):
|
||||||
|
del operators["coveredby"]
|
||||||
else:
|
else:
|
||||||
operators["covers"] = SpatialOperator(func="MBRCovers")
|
operators["covers"] = SpatialOperator(func="MBRCovers")
|
||||||
operators["coveredby"] = SpatialOperator(func="MBRCoveredBy")
|
|
||||||
return operators
|
return operators
|
||||||
|
|
||||||
@cached_property
|
@cached_property
|
||||||
@ -71,7 +73,10 @@ class MySQLOperations(BaseSpatialOperations, DatabaseOperations):
|
|||||||
models.Union,
|
models.Union,
|
||||||
]
|
]
|
||||||
is_mariadb = self.connection.mysql_is_mariadb
|
is_mariadb = self.connection.mysql_is_mariadb
|
||||||
if is_mariadb or self.connection.mysql_version < (8, 0, 24):
|
if is_mariadb:
|
||||||
|
if self.connection.mysql_version < (12, 0, 1):
|
||||||
|
disallowed_aggregates.insert(0, models.Collect)
|
||||||
|
elif self.connection.mysql_version < (8, 0, 24):
|
||||||
disallowed_aggregates.insert(0, models.Collect)
|
disallowed_aggregates.insert(0, models.Collect)
|
||||||
return tuple(disallowed_aggregates)
|
return tuple(disallowed_aggregates)
|
||||||
|
|
||||||
@ -106,6 +111,7 @@ class MySQLOperations(BaseSpatialOperations, DatabaseOperations):
|
|||||||
}
|
}
|
||||||
if self.connection.mysql_is_mariadb:
|
if self.connection.mysql_is_mariadb:
|
||||||
unsupported.remove("PointOnSurface")
|
unsupported.remove("PointOnSurface")
|
||||||
|
if self.connection.mysql_version < (12, 0, 1):
|
||||||
unsupported.update({"GeoHash", "IsValid"})
|
unsupported.update({"GeoHash", "IsValid"})
|
||||||
return unsupported
|
return unsupported
|
||||||
|
|
||||||
|
@ -339,15 +339,15 @@ divided into the three categories described in the :ref:`raster lookup details
|
|||||||
<spatial-lookup-raster>`: native support ``N``, bilateral native support ``B``,
|
<spatial-lookup-raster>`: native support ``N``, bilateral native support ``B``,
|
||||||
and geometry conversion support ``C``.
|
and geometry conversion support ``C``.
|
||||||
|
|
||||||
================================= ========= ======== ========== ============ ========== ========
|
================================= ========= ======== ============ ============ ========== ========
|
||||||
Lookup Type PostGIS Oracle MariaDB MySQL [#]_ SpatiaLite PGRaster
|
Lookup Type PostGIS Oracle MariaDB MySQL [#]_ SpatiaLite PGRaster
|
||||||
================================= ========= ======== ========== ============ ========== ========
|
================================= ========= ======== ============ ============ ========== ========
|
||||||
:lookup:`bbcontains` X X X X N
|
:lookup:`bbcontains` X X X X N
|
||||||
:lookup:`bboverlaps` X X X X N
|
:lookup:`bboverlaps` X X X X N
|
||||||
:lookup:`contained` X X X X N
|
:lookup:`contained` X X X X N
|
||||||
:lookup:`contains <gis-contains>` X X X X X B
|
:lookup:`contains <gis-contains>` X X X X X B
|
||||||
:lookup:`contains_properly` X B
|
:lookup:`contains_properly` X B
|
||||||
:lookup:`coveredby` X X X X B
|
:lookup:`coveredby` X X X (≥ 12.0.1) X X B
|
||||||
:lookup:`covers` X X X X B
|
:lookup:`covers` X X X X B
|
||||||
:lookup:`crosses` X X X X C
|
:lookup:`crosses` X X X X C
|
||||||
:lookup:`disjoint` X X X X X B
|
:lookup:`disjoint` X X X X X B
|
||||||
@ -360,7 +360,7 @@ Lookup Type PostGIS Oracle MariaDB MySQL [#]_ S
|
|||||||
:lookup:`exact <same_as>` X X X X X B
|
:lookup:`exact <same_as>` X X X X X B
|
||||||
:lookup:`intersects` X X X X X B
|
:lookup:`intersects` X X X X X B
|
||||||
:lookup:`isempty` X
|
:lookup:`isempty` X
|
||||||
:lookup:`isvalid` X X X X
|
:lookup:`isvalid` X X X (≥ 12.0.1) X X
|
||||||
:lookup:`overlaps` X X X X X B
|
:lookup:`overlaps` X X X X X B
|
||||||
:lookup:`relate` X X X X C
|
:lookup:`relate` X X X X C
|
||||||
:lookup:`same_as` X X X X X B
|
:lookup:`same_as` X X X X X B
|
||||||
@ -374,7 +374,7 @@ Lookup Type PostGIS Oracle MariaDB MySQL [#]_ S
|
|||||||
:lookup:`overlaps_below` X C
|
:lookup:`overlaps_below` X C
|
||||||
:lookup:`strictly_above` X C
|
:lookup:`strictly_above` X C
|
||||||
:lookup:`strictly_below` X C
|
:lookup:`strictly_below` X C
|
||||||
================================= ========= ======== ========== ============ ========== ========
|
================================= ========= ======== ============ ============ ========== ========
|
||||||
|
|
||||||
.. _database-functions-compatibility:
|
.. _database-functions-compatibility:
|
||||||
|
|
||||||
@ -406,11 +406,11 @@ Function PostGIS Oracle MariaDB MySQL
|
|||||||
:class:`ForcePolygonCW` X X
|
:class:`ForcePolygonCW` X X
|
||||||
:class:`FromWKB` X X X X X
|
:class:`FromWKB` X X X X X
|
||||||
:class:`FromWKT` X X X X X
|
:class:`FromWKT` X X X X X
|
||||||
:class:`GeoHash` X X X (LWGEOM/RTTOPO)
|
:class:`GeoHash` X X (≥ 12.0.1) X X (LWGEOM/RTTOPO)
|
||||||
:class:`GeometryDistance` X
|
:class:`GeometryDistance` X
|
||||||
:class:`Intersection` X X X X X
|
:class:`Intersection` X X X X X
|
||||||
:class:`IsEmpty` X
|
:class:`IsEmpty` X
|
||||||
:class:`IsValid` X X X X
|
:class:`IsValid` X X X (≥ 12.0.1) X X
|
||||||
:class:`Length` X X X X X
|
:class:`Length` X X X X X
|
||||||
:class:`LineLocatePoint` X X
|
:class:`LineLocatePoint` X X
|
||||||
:class:`MakeValid` X X (LWGEOM/RTTOPO)
|
:class:`MakeValid` X X (LWGEOM/RTTOPO)
|
||||||
@ -433,20 +433,19 @@ Aggregate Functions
|
|||||||
-------------------
|
-------------------
|
||||||
|
|
||||||
The following table provides a summary of what GIS-specific aggregate functions
|
The following table provides a summary of what GIS-specific aggregate functions
|
||||||
are available on each spatial backend. Please note that MariaDB does not
|
are available on each spatial backend.
|
||||||
support any of these aggregates, and is thus excluded from the table.
|
|
||||||
|
|
||||||
.. currentmodule:: django.contrib.gis.db.models
|
.. currentmodule:: django.contrib.gis.db.models
|
||||||
|
|
||||||
======================= ======= ====== ============ ==========
|
======================= ======= ====== ============ ============ ==========
|
||||||
Aggregate PostGIS Oracle MySQL SpatiaLite
|
Aggregate PostGIS Oracle MariaDB MySQL SpatiaLite
|
||||||
======================= ======= ====== ============ ==========
|
======================= ======= ====== ============ ============ ==========
|
||||||
:class:`Collect` X X (≥ 8.0.24) X
|
:class:`Collect` X X (≥ 12.0.1) X (≥ 8.0.24) X
|
||||||
:class:`Extent` X X X
|
:class:`Extent` X X X
|
||||||
:class:`Extent3D` X
|
:class:`Extent3D` X
|
||||||
:class:`MakeLine` X X
|
:class:`MakeLine` X X
|
||||||
:class:`Union` X X X
|
:class:`Union` X X X
|
||||||
======================= ======= ====== ============ ==========
|
======================= ======= ====== ============ ============ ==========
|
||||||
|
|
||||||
.. rubric:: Footnotes
|
.. rubric:: Footnotes
|
||||||
.. [#fnwkt] *See* Open Geospatial Consortium, Inc., `OpenGIS Simple Feature Specification For SQL <https://portal.ogc.org/files/?artifact_id=829>`_, Document 99-049 (May 5, 1999), at Ch. 3.2.5, p. 3-11 (SQL Textual Representation of Geometry).
|
.. [#fnwkt] *See* Open Geospatial Consortium, Inc., `OpenGIS Simple Feature Specification For SQL <https://portal.ogc.org/files/?artifact_id=829>`_, Document 99-049 (May 5, 1999), at Ch. 3.2.5, p. 3-11 (SQL Textual Representation of Geometry).
|
||||||
|
@ -589,7 +589,7 @@ Example:
|
|||||||
|
|
||||||
.. class:: GeoHash(expression, precision=None, **extra)
|
.. class:: GeoHash(expression, precision=None, **extra)
|
||||||
|
|
||||||
*Availability*: `MySQL
|
*Availability*: MariaDB, `MySQL
|
||||||
<https://dev.mysql.com/doc/refman/en/spatial-geohash-functions.html#function_st-geohash>`__,
|
<https://dev.mysql.com/doc/refman/en/spatial-geohash-functions.html#function_st-geohash>`__,
|
||||||
`PostGIS <https://postgis.net/docs/ST_GeoHash.html>`__, SpatiaLite
|
`PostGIS <https://postgis.net/docs/ST_GeoHash.html>`__, SpatiaLite
|
||||||
(LWGEOM/RTTOPO)
|
(LWGEOM/RTTOPO)
|
||||||
@ -602,6 +602,10 @@ result.
|
|||||||
|
|
||||||
__ https://en.wikipedia.org/wiki/Geohash
|
__ https://en.wikipedia.org/wiki/Geohash
|
||||||
|
|
||||||
|
.. versionchanged:: 6.0
|
||||||
|
|
||||||
|
MariaDB 12.0.1+ support was added.
|
||||||
|
|
||||||
Miscellaneous
|
Miscellaneous
|
||||||
=============
|
=============
|
||||||
|
|
||||||
@ -620,13 +624,17 @@ geometry. Returns ``True`` if its value is empty and ``False`` otherwise.
|
|||||||
|
|
||||||
.. class:: IsValid(expr)
|
.. class:: IsValid(expr)
|
||||||
|
|
||||||
*Availability*: `MySQL
|
*Availability*: MariaDB, `MySQL
|
||||||
<https://dev.mysql.com/doc/refman/en/spatial-convenience-functions.html#function_st-isvalid>`__,
|
<https://dev.mysql.com/doc/refman/en/spatial-convenience-functions.html#function_st-isvalid>`__,
|
||||||
`PostGIS <https://postgis.net/docs/ST_IsValid.html>`__, Oracle, SpatiaLite
|
`PostGIS <https://postgis.net/docs/ST_IsValid.html>`__, Oracle, SpatiaLite
|
||||||
|
|
||||||
Accepts a geographic field or expression and tests if the value is well formed.
|
Accepts 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.
|
Returns ``True`` if its value is a valid geometry and ``False`` otherwise.
|
||||||
|
|
||||||
|
.. versionchanged:: 6.0
|
||||||
|
|
||||||
|
MariaDB 12.0.1+ support was added.
|
||||||
|
|
||||||
``MemSize``
|
``MemSize``
|
||||||
-----------
|
-----------
|
||||||
|
|
||||||
|
@ -183,7 +183,7 @@ PostGIS ``ST_ContainsProperly(poly, geom)``
|
|||||||
-------------
|
-------------
|
||||||
|
|
||||||
*Availability*: `PostGIS <https://postgis.net/docs/ST_CoveredBy.html>`__,
|
*Availability*: `PostGIS <https://postgis.net/docs/ST_CoveredBy.html>`__,
|
||||||
Oracle, MySQL, PGRaster (Bilateral), SpatiaLite
|
Oracle, MariaDB, MySQL, PGRaster (Bilateral), SpatiaLite
|
||||||
|
|
||||||
Tests if no point in the geometry field is outside the lookup geometry.
|
Tests if no point in the geometry field is outside the lookup geometry.
|
||||||
[#fncovers]_
|
[#fncovers]_
|
||||||
@ -197,6 +197,7 @@ Backend SQL Equivalent
|
|||||||
========== =============================
|
========== =============================
|
||||||
PostGIS ``ST_CoveredBy(poly, geom)``
|
PostGIS ``ST_CoveredBy(poly, geom)``
|
||||||
Oracle ``SDO_COVEREDBY(poly, geom)``
|
Oracle ``SDO_COVEREDBY(poly, geom)``
|
||||||
|
MariaDB ``MBRCoveredBy(poly, geom)``
|
||||||
MySQL ``MBRCoveredBy(poly, geom)``
|
MySQL ``MBRCoveredBy(poly, geom)``
|
||||||
SpatiaLite ``CoveredBy(poly, geom)``
|
SpatiaLite ``CoveredBy(poly, geom)``
|
||||||
========== =============================
|
========== =============================
|
||||||
@ -205,6 +206,10 @@ SpatiaLite ``CoveredBy(poly, geom)``
|
|||||||
|
|
||||||
MySQL support was added.
|
MySQL support was added.
|
||||||
|
|
||||||
|
.. versionchanged:: 6.0
|
||||||
|
|
||||||
|
MariaDB 12.0.1+ support was added.
|
||||||
|
|
||||||
.. fieldlookup:: covers
|
.. fieldlookup:: covers
|
||||||
|
|
||||||
``covers``
|
``covers``
|
||||||
@ -374,8 +379,8 @@ Example::
|
|||||||
``isvalid``
|
``isvalid``
|
||||||
-----------
|
-----------
|
||||||
|
|
||||||
*Availability*: MySQL, `PostGIS <https://postgis.net/docs/ST_IsValid.html>`__,
|
*Availability*: MariaDB, MySQL,
|
||||||
Oracle, SpatiaLite
|
`PostGIS <https://postgis.net/docs/ST_IsValid.html>`__, Oracle, SpatiaLite
|
||||||
|
|
||||||
Tests if the geometry is valid.
|
Tests if the geometry is valid.
|
||||||
|
|
||||||
@ -383,12 +388,16 @@ Example::
|
|||||||
|
|
||||||
Zipcode.objects.filter(poly__isvalid=True)
|
Zipcode.objects.filter(poly__isvalid=True)
|
||||||
|
|
||||||
========================== ================================================================
|
=================================== ================================================================
|
||||||
Backend SQL Equivalent
|
Backend SQL Equivalent
|
||||||
========================== ================================================================
|
=================================== ================================================================
|
||||||
MySQL, PostGIS, SpatiaLite ``ST_IsValid(poly)``
|
MariaDB, MySQL, PostGIS, SpatiaLite ``ST_IsValid(poly)``
|
||||||
Oracle ``SDO_GEOM.VALIDATE_GEOMETRY_WITH_CONTEXT(poly, 0.05) = 'TRUE'``
|
Oracle ``SDO_GEOM.VALIDATE_GEOMETRY_WITH_CONTEXT(poly, 0.05) = 'TRUE'``
|
||||||
========================== ================================================================
|
=================================== ================================================================
|
||||||
|
|
||||||
|
.. versionchanged:: 6.0
|
||||||
|
|
||||||
|
MariaDB 12.0.1+ support was added.
|
||||||
|
|
||||||
.. fieldlookup:: overlaps
|
.. fieldlookup:: overlaps
|
||||||
|
|
||||||
@ -880,8 +889,8 @@ Example:
|
|||||||
|
|
||||||
.. class:: Collect(geo_field, filter=None)
|
.. class:: Collect(geo_field, filter=None)
|
||||||
|
|
||||||
*Availability*: `PostGIS <https://postgis.net/docs/ST_Collect.html>`__, MySQL,
|
*Availability*: `PostGIS <https://postgis.net/docs/ST_Collect.html>`__,
|
||||||
SpatiaLite
|
MariaDB, MySQL, SpatiaLite
|
||||||
|
|
||||||
Returns a ``GEOMETRYCOLLECTION`` or a ``MULTI`` geometry object from the geometry
|
Returns a ``GEOMETRYCOLLECTION`` or a ``MULTI`` geometry object from the geometry
|
||||||
column. This is analogous to a simplified version of the :class:`Union`
|
column. This is analogous to a simplified version of the :class:`Union`
|
||||||
@ -889,6 +898,10 @@ 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
|
a union because it rolls up geometries into a collection or multi object, not
|
||||||
caring about dissolving boundaries.
|
caring about dissolving boundaries.
|
||||||
|
|
||||||
|
.. versionchanged:: 6.0
|
||||||
|
|
||||||
|
MariaDB 12.0.1+ support was added.
|
||||||
|
|
||||||
``Extent``
|
``Extent``
|
||||||
~~~~~~~~~~
|
~~~~~~~~~~
|
||||||
|
|
||||||
|
@ -76,6 +76,12 @@ Minor features
|
|||||||
* The new :attr:`.BaseGeometryWidget.base_layer` attribute allows specifying a
|
* The new :attr:`.BaseGeometryWidget.base_layer` attribute allows specifying a
|
||||||
JavaScript map base layer, enabling customization of map tile providers.
|
JavaScript map base layer, enabling customization of map tile providers.
|
||||||
|
|
||||||
|
* :lookup:`coveredby` and :lookup:`isvalid` lookups,
|
||||||
|
:class:`~django.contrib.gis.db.models.Collect` aggregation, and
|
||||||
|
:class:`~django.contrib.gis.db.models.functions.GeoHash` and
|
||||||
|
:class:`~django.contrib.gis.db.models.functions.IsValid` database functions
|
||||||
|
are now supported on MariaDB 12.0.1+.
|
||||||
|
|
||||||
:mod:`django.contrib.messages`
|
:mod:`django.contrib.messages`
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
@ -346,6 +346,9 @@ class RelatedGeoModelTest(TestCase):
|
|||||||
)
|
)
|
||||||
)
|
)
|
||||||
city = qs.get(name="Aurora")
|
city = qs.get(name="Aurora")
|
||||||
|
if connection.ops.mariadb:
|
||||||
|
self.assertIsNone(city.parcel_centroid)
|
||||||
|
else:
|
||||||
self.assertIsInstance(city.parcel_centroid, Point)
|
self.assertIsInstance(city.parcel_centroid, Point)
|
||||||
self.assertAlmostEqual(city.parcel_centroid[0], 3.2128, 4)
|
self.assertAlmostEqual(city.parcel_centroid[0], 3.2128, 4)
|
||||||
self.assertAlmostEqual(city.parcel_centroid[1], 1.5, 4)
|
self.assertAlmostEqual(city.parcel_centroid[1], 1.5, 4)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user