mirror of https://github.com/django/django.git
parent
6bc4ff36db
commit
1bf5e79394
|
@ -16,30 +16,6 @@ class BaseSpatialOperations:
|
|||
geography = False
|
||||
geometry = False
|
||||
|
||||
area = False
|
||||
bounding_circle = False
|
||||
centroid = False
|
||||
difference = False
|
||||
distance = False
|
||||
distance_sphere = False
|
||||
distance_spheroid = False
|
||||
envelope = False
|
||||
force_rhr = False
|
||||
mem_size = False
|
||||
num_geom = False
|
||||
num_points = False
|
||||
perimeter = False
|
||||
perimeter3d = False
|
||||
point_on_surface = False
|
||||
polygonize = False
|
||||
reverse = False
|
||||
scale = False
|
||||
snap_to_grid = False
|
||||
sym_difference = False
|
||||
transform = False
|
||||
translate = False
|
||||
union = False
|
||||
|
||||
# Aggregates
|
||||
disallowed_aggregates = ()
|
||||
|
||||
|
@ -59,13 +35,6 @@ class BaseSpatialOperations:
|
|||
'Translate', 'Union',
|
||||
}
|
||||
|
||||
# Serialization
|
||||
geohash = False
|
||||
geojson = False
|
||||
gml = False
|
||||
kml = False
|
||||
svg = False
|
||||
|
||||
# Constructors
|
||||
from_text = False
|
||||
from_wkb = False
|
||||
|
|
|
@ -63,21 +63,7 @@ class OracleOperations(BaseSpatialOperations, DatabaseOperations):
|
|||
|
||||
Adapter = OracleSpatialAdapter
|
||||
|
||||
area = 'SDO_GEOM.SDO_AREA'
|
||||
gml = 'SDO_UTIL.TO_GMLGEOMETRY'
|
||||
centroid = 'SDO_GEOM.SDO_CENTROID'
|
||||
difference = 'SDO_GEOM.SDO_DIFFERENCE'
|
||||
distance = 'SDO_GEOM.SDO_DISTANCE'
|
||||
extent = 'SDO_AGGR_MBR'
|
||||
intersection = 'SDO_GEOM.SDO_INTERSECTION'
|
||||
length = 'SDO_GEOM.SDO_LENGTH'
|
||||
num_points = 'SDO_UTIL.GETNUMVERTICES'
|
||||
perimeter = length
|
||||
point_on_surface = 'SDO_GEOM.SDO_POINTONSURFACE'
|
||||
reverse = 'SDO_UTIL.REVERSE_LINESTRING'
|
||||
sym_difference = 'SDO_GEOM.SDO_XOR'
|
||||
transform = 'SDO_CS.TRANSFORM'
|
||||
union = 'SDO_GEOM.SDO_UNION'
|
||||
unionagg = 'SDO_AGGR_UNION'
|
||||
|
||||
from_text = 'SDO_GEOMETRY'
|
||||
|
@ -222,6 +208,8 @@ class OracleOperations(BaseSpatialOperations, DatabaseOperations):
|
|||
SRID of the field. Specifically, this routine will substitute in the
|
||||
SDO_CS.TRANSFORM() function call.
|
||||
"""
|
||||
tranform_func = self.spatial_function_name('Transform')
|
||||
|
||||
if value is None:
|
||||
return 'NULL'
|
||||
|
||||
|
@ -230,7 +218,7 @@ class OracleOperations(BaseSpatialOperations, DatabaseOperations):
|
|||
|
||||
if hasattr(value, 'as_sql'):
|
||||
if transform_value(value, f.srid):
|
||||
placeholder = '%s(%%s, %s)' % (self.transform, f.srid)
|
||||
placeholder = '%s(%%s, %s)' % (tranform_func, f.srid)
|
||||
else:
|
||||
placeholder = '%s'
|
||||
# No geometry value used for F expression, substitute in
|
||||
|
@ -239,7 +227,7 @@ class OracleOperations(BaseSpatialOperations, DatabaseOperations):
|
|||
return placeholder % sql
|
||||
else:
|
||||
if transform_value(value, f.srid):
|
||||
return '%s(SDO_GEOMETRY(%%s, %s), %s)' % (self.transform, value.srid, f.srid)
|
||||
return '%s(SDO_GEOMETRY(%%s, %s), %s)' % (tranform_func, value.srid, f.srid)
|
||||
else:
|
||||
return 'SDO_GEOMETRY(%%s, %s)' % f.srid
|
||||
|
||||
|
|
|
@ -153,44 +153,12 @@ class PostGISOperations(BaseSpatialOperations, DatabaseOperations):
|
|||
|
||||
prefix = self.geom_func_prefix
|
||||
|
||||
self.area = prefix + 'Area'
|
||||
self.bounding_circle = prefix + 'MinimumBoundingCircle'
|
||||
self.centroid = prefix + 'Centroid'
|
||||
self.collect = prefix + 'Collect'
|
||||
self.difference = prefix + 'Difference'
|
||||
self.distance = prefix + 'Distance'
|
||||
self.distance_sphere = prefix + 'distance_sphere'
|
||||
self.distance_spheroid = prefix + 'distance_spheroid'
|
||||
self.envelope = prefix + 'Envelope'
|
||||
self.extent = prefix + 'Extent'
|
||||
self.extent3d = prefix + '3DExtent'
|
||||
self.force_rhr = prefix + 'ForceRHR'
|
||||
self.geohash = prefix + 'GeoHash'
|
||||
self.geojson = prefix + 'AsGeoJson'
|
||||
self.gml = prefix + 'AsGML'
|
||||
self.intersection = prefix + 'Intersection'
|
||||
self.isvalid = prefix + 'IsValid'
|
||||
self.kml = prefix + 'AsKML'
|
||||
self.length = prefix + 'Length'
|
||||
self.length3d = prefix + '3DLength'
|
||||
self.length_spheroid = prefix + 'length_spheroid'
|
||||
self.makeline = prefix + 'MakeLine'
|
||||
self.makevalid = prefix + 'MakeValid'
|
||||
self.mem_size = prefix + 'mem_size'
|
||||
self.num_geom = prefix + 'NumGeometries'
|
||||
self.num_points = prefix + 'npoints'
|
||||
self.perimeter = prefix + 'Perimeter'
|
||||
self.perimeter3d = prefix + '3DPerimeter'
|
||||
self.point_on_surface = prefix + 'PointOnSurface'
|
||||
self.polygonize = prefix + 'Polygonize'
|
||||
self.reverse = prefix + 'Reverse'
|
||||
self.scale = prefix + 'Scale'
|
||||
self.snap_to_grid = prefix + 'SnapToGrid'
|
||||
self.svg = prefix + 'AsSVG'
|
||||
self.sym_difference = prefix + 'SymDifference'
|
||||
self.transform = prefix + 'Transform'
|
||||
self.translate = prefix + 'Translate'
|
||||
self.union = prefix + 'Union'
|
||||
self.unionagg = prefix + 'Union'
|
||||
|
||||
@cached_property
|
||||
|
@ -324,6 +292,8 @@ class PostGISOperations(BaseSpatialOperations, DatabaseOperations):
|
|||
not in the SRID of the field. Specifically, this routine will
|
||||
substitute in the ST_Transform() function call.
|
||||
"""
|
||||
tranform_func = self.spatial_function_name('Transform')
|
||||
|
||||
# Get the srid for this object
|
||||
if value is None:
|
||||
value_srid = None
|
||||
|
@ -337,9 +307,9 @@ class PostGISOperations(BaseSpatialOperations, DatabaseOperations):
|
|||
if value_srid is None or value_srid == f.srid:
|
||||
placeholder = '%s'
|
||||
elif f.geom_type == 'RASTER' and isinstance(value, str):
|
||||
placeholder = '%s((%%s)::raster, %s)' % (self.transform, f.srid)
|
||||
placeholder = '%s((%%s)::raster, %s)' % (tranform_func, f.srid)
|
||||
else:
|
||||
placeholder = '%s(%%s, %s)' % (self.transform, f.srid)
|
||||
placeholder = '%s(%%s, %s)' % (tranform_func, f.srid)
|
||||
|
||||
if hasattr(value, 'as_sql'):
|
||||
# If this is an F expression, then we don't really want
|
||||
|
|
|
@ -38,29 +38,9 @@ class SpatiaLiteOperations(BaseSpatialOperations, DatabaseOperations):
|
|||
|
||||
Adapter = SpatiaLiteAdapter
|
||||
|
||||
area = 'Area'
|
||||
centroid = 'Centroid'
|
||||
collect = 'Collect'
|
||||
contained = 'MbrWithin'
|
||||
difference = 'Difference'
|
||||
distance = 'Distance'
|
||||
envelope = 'Envelope'
|
||||
extent = 'Extent'
|
||||
geojson = 'AsGeoJSON'
|
||||
gml = 'AsGML'
|
||||
intersection = 'Intersection'
|
||||
kml = 'AsKML'
|
||||
length = 'GLength' # OpenGis defines Length, but this conflicts with an SQLite reserved keyword
|
||||
makeline = 'MakeLine'
|
||||
num_geom = 'NumGeometries'
|
||||
num_points = 'NumPoints'
|
||||
point_on_surface = 'PointOnSurface'
|
||||
scale = 'ScaleCoords'
|
||||
svg = 'AsSVG'
|
||||
sym_difference = 'SymDifference'
|
||||
transform = 'Transform'
|
||||
translate = 'ShiftCoords'
|
||||
union = 'GUnion' # OpenGis defines Union, but this conflicts with an SQLite reserved keyword
|
||||
unionagg = 'GUnion'
|
||||
|
||||
from_text = 'GeomFromText'
|
||||
|
@ -178,11 +158,13 @@ class SpatiaLiteOperations(BaseSpatialOperations, DatabaseOperations):
|
|||
SRID of the field. Specifically, this routine will substitute in the
|
||||
Transform() and GeomFromText() function call(s).
|
||||
"""
|
||||
tranform_func = self.spatial_function_name('Transform')
|
||||
|
||||
def transform_value(value, srid):
|
||||
return not (value is None or value.srid == srid)
|
||||
if hasattr(value, 'as_sql'):
|
||||
if transform_value(value, f.srid):
|
||||
placeholder = '%s(%%s, %s)' % (self.transform, f.srid)
|
||||
placeholder = '%s(%%s, %s)' % (tranform_func, f.srid)
|
||||
else:
|
||||
placeholder = '%s'
|
||||
# No geometry value used for F expression, substitute in
|
||||
|
@ -192,7 +174,7 @@ class SpatiaLiteOperations(BaseSpatialOperations, DatabaseOperations):
|
|||
else:
|
||||
if transform_value(value, f.srid):
|
||||
# Adding Transform() to the SQL placeholder.
|
||||
return '%s(%s(%%s,%s), %s)' % (self.transform, self.from_text, value.srid, f.srid)
|
||||
return '%s(%s(%%s,%s), %s)' % (tranform_func, self.from_text, value.srid, f.srid)
|
||||
else:
|
||||
return '%s(%%s,%s)' % (self.from_text, f.srid)
|
||||
|
||||
|
|
|
@ -24,7 +24,7 @@ class GISFunctionsTests(TestCase):
|
|||
|
||||
def test_asgeojson(self):
|
||||
# Only PostGIS and SpatiaLite support GeoJSON.
|
||||
if not connection.ops.geojson:
|
||||
if not connection.features.has_AsGeoJSON_function:
|
||||
with self.assertRaises(NotImplementedError):
|
||||
list(Country.objects.annotate(json=functions.AsGeoJSON('mpoly')))
|
||||
return
|
||||
|
|
Loading…
Reference in New Issue