diff options
| author | Mariusz Felisiak <felisiak.mariusz@gmail.com> | 2023-01-10 11:51:09 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2023-01-10 11:51:09 +0100 |
| commit | 552384fa977901dcbc33cc999cd38dddcdc0eef1 (patch) | |
| tree | a3324faee94ed843f55621a30490a2c33bd3d478 /django | |
| parent | 72efd840a8cb6ee35a3732d8bb434e7361970b3c (diff) | |
Refs #31014 -- Added FromWKB and FromWKT GIS database functions.
Co-authored-by: Ondřej Böhm <ondrej.bohm@firma.seznam.cz>
Co-authored-by: Mariusz Felisiak <felisiak.mariusz@gmail.com>
Co-authored-by: Sergey Fedoseev <fedoseev.sergey@gmail.com>
Diffstat (limited to 'django')
6 files changed, 27 insertions, 0 deletions
diff --git a/django/contrib/gis/db/backends/base/operations.py b/django/contrib/gis/db/backends/base/operations.py index f6eaf8f503..287841b29e 100644 --- a/django/contrib/gis/db/backends/base/operations.py +++ b/django/contrib/gis/db/backends/base/operations.py @@ -45,6 +45,8 @@ class BaseSpatialOperations: "Difference", "Distance", "Envelope", + "FromWKB", + "FromWKT", "GeoHash", "GeometryDistance", "Intersection", diff --git a/django/contrib/gis/db/backends/mysql/operations.py b/django/contrib/gis/db/backends/mysql/operations.py index 46d8fc5d6a..0799a6b28f 100644 --- a/django/contrib/gis/db/backends/mysql/operations.py +++ b/django/contrib/gis/db/backends/mysql/operations.py @@ -62,6 +62,11 @@ class MySQLOperations(BaseSpatialOperations, DatabaseOperations): models.Union, ) + function_names = { + "FromWKB": "ST_GeomFromWKB", + "FromWKT": "ST_GeomFromText", + } + @cached_property def unsupported_functions(self): unsupported = { diff --git a/django/contrib/gis/db/backends/oracle/operations.py b/django/contrib/gis/db/backends/oracle/operations.py index aefb2f74e2..c191d0b1f7 100644 --- a/django/contrib/gis/db/backends/oracle/operations.py +++ b/django/contrib/gis/db/backends/oracle/operations.py @@ -76,6 +76,8 @@ class OracleOperations(BaseSpatialOperations, DatabaseOperations): "Difference": "SDO_GEOM.SDO_DIFFERENCE", "Distance": "SDO_GEOM.SDO_DISTANCE", "Envelope": "SDO_GEOM_MBR", + "FromWKB": "SDO_UTIL.FROM_WKBGEOMETRY", + "FromWKT": "SDO_UTIL.FROM_WKTGEOMETRY", "Intersection": "SDO_GEOM.SDO_INTERSECTION", "IsValid": "SDO_GEOM.VALIDATE_GEOMETRY_WITH_CONTEXT", "Length": "SDO_GEOM.SDO_LENGTH", diff --git a/django/contrib/gis/db/backends/postgis/operations.py b/django/contrib/gis/db/backends/postgis/operations.py index 070f670a0b..efa1d0f204 100644 --- a/django/contrib/gis/db/backends/postgis/operations.py +++ b/django/contrib/gis/db/backends/postgis/operations.py @@ -172,6 +172,8 @@ class PostGISOperations(BaseSpatialOperations, DatabaseOperations): "AsWKB": "ST_AsBinary", "AsWKT": "ST_AsText", "BoundingCircle": "ST_MinimumBoundingCircle", + "FromWKB": "ST_GeomFromWKB", + "FromWKT": "ST_GeomFromText", "NumPoints": "ST_NPoints", } return function_names diff --git a/django/contrib/gis/db/backends/spatialite/operations.py b/django/contrib/gis/db/backends/spatialite/operations.py index 47f3d4ca75..0b8b26ab6f 100644 --- a/django/contrib/gis/db/backends/spatialite/operations.py +++ b/django/contrib/gis/db/backends/spatialite/operations.py @@ -67,6 +67,8 @@ class SpatiaLiteOperations(BaseSpatialOperations, DatabaseOperations): function_names = { "AsWKB": "St_AsBinary", "ForcePolygonCW": "ST_ForceLHR", + "FromWKB": "ST_GeomFromWKB", + "FromWKT": "ST_GeomFromText", "Length": "ST_Length", "LineLocatePoint": "ST_Line_Locate_Point", "NumPoints": "ST_NPoints", diff --git a/django/contrib/gis/db/models/functions.py b/django/contrib/gis/db/models/functions.py index f97c540a1a..d886f8916e 100644 --- a/django/contrib/gis/db/models/functions.py +++ b/django/contrib/gis/db/models/functions.py @@ -69,6 +69,8 @@ class GeoFuncMixin: def resolve_expression(self, *args, **kwargs): res = super().resolve_expression(*args, **kwargs) + if not self.geom_param_pos: + return res # Ensure that expressions are geometric. source_fields = res.get_source_fields() @@ -351,6 +353,18 @@ class ForcePolygonCW(GeomOutputGeoFunc): arity = 1 +class FromWKB(GeoFunc): + output_field = GeometryField(srid=0) + arity = 1 + geom_param_pos = () + + +class FromWKT(GeoFunc): + output_field = GeometryField(srid=0) + arity = 1 + geom_param_pos = () + + class GeoHash(GeoFunc): output_field = TextField() |
