summaryrefslogtreecommitdiff
path: root/django
diff options
context:
space:
mode:
authorMariusz Felisiak <felisiak.mariusz@gmail.com>2023-01-10 11:51:09 +0100
committerGitHub <noreply@github.com>2023-01-10 11:51:09 +0100
commit552384fa977901dcbc33cc999cd38dddcdc0eef1 (patch)
treea3324faee94ed843f55621a30490a2c33bd3d478 /django
parent72efd840a8cb6ee35a3732d8bb434e7361970b3c (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')
-rw-r--r--django/contrib/gis/db/backends/base/operations.py2
-rw-r--r--django/contrib/gis/db/backends/mysql/operations.py5
-rw-r--r--django/contrib/gis/db/backends/oracle/operations.py2
-rw-r--r--django/contrib/gis/db/backends/postgis/operations.py2
-rw-r--r--django/contrib/gis/db/backends/spatialite/operations.py2
-rw-r--r--django/contrib/gis/db/models/functions.py14
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()