diff options
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() |
