Fixed failures with older Spatialite versions
This commit is contained in:
parent
dd99f57710
commit
6d685b1674
|
@ -80,19 +80,23 @@ class SpatiaLiteOperations(BaseSpatialOperations, DatabaseOperations):
|
||||||
'distance_lte': SpatialOperator(func='Distance', op='<='),
|
'distance_lte': SpatialOperator(func='Distance', op='<='),
|
||||||
}
|
}
|
||||||
|
|
||||||
function_names = {
|
@cached_property
|
||||||
|
def function_names(self):
|
||||||
|
return {
|
||||||
'Length': 'ST_Length',
|
'Length': 'ST_Length',
|
||||||
'Reverse': 'ST_Reverse',
|
'Reverse': 'ST_Reverse',
|
||||||
'Scale': 'ScaleCoords',
|
'Scale': 'ScaleCoords',
|
||||||
'Translate': 'ST_Translate',
|
'Translate': 'ST_Translate' if self.spatial_version >= (3, 1, 0) else 'ShiftCoords',
|
||||||
'Union': 'ST_Union',
|
'Union': 'ST_Union',
|
||||||
}
|
}
|
||||||
|
|
||||||
@cached_property
|
@cached_property
|
||||||
def unsupported_functions(self):
|
def unsupported_functions(self):
|
||||||
unsupported = {'BoundingCircle', 'ForceRHR', 'GeoHash', 'MemSize'}
|
unsupported = {'BoundingCircle', 'ForceRHR', 'GeoHash', 'MemSize'}
|
||||||
|
if self.spatial_version < (3, 1, 0):
|
||||||
|
unsupported.add('SnapToGrid')
|
||||||
if self.spatial_version < (4, 0, 0):
|
if self.spatial_version < (4, 0, 0):
|
||||||
unsupported.add('Reverse')
|
unsupported.update({'Perimeter', 'Reverse'})
|
||||||
return unsupported
|
return unsupported
|
||||||
|
|
||||||
@cached_property
|
@cached_property
|
||||||
|
|
|
@ -403,9 +403,12 @@ class Transform(GeoFunc):
|
||||||
|
|
||||||
class Translate(Scale):
|
class Translate(Scale):
|
||||||
def as_sqlite(self, compiler, connection):
|
def as_sqlite(self, compiler, connection):
|
||||||
# Always provide the z parameter
|
func_name = connection.ops.spatial_function_name(self.name)
|
||||||
if len(self.source_expressions) < 4:
|
if func_name == 'ST_Translate' and len(self.source_expressions) < 4:
|
||||||
|
# Always provide the z parameter for ST_Translate (Spatialite >= 3.1)
|
||||||
self.source_expressions.append(Value(0))
|
self.source_expressions.append(Value(0))
|
||||||
|
elif func_name == 'ShiftCoords' and len(self.source_expressions) > 3:
|
||||||
|
raise ValueError("This version of Spatialite doesn't support 3D")
|
||||||
return super(Translate, self).as_sqlite(compiler, connection)
|
return super(Translate, self).as_sqlite(compiler, connection)
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -2,6 +2,7 @@ from __future__ import unicode_literals
|
||||||
|
|
||||||
import re
|
import re
|
||||||
from decimal import Decimal
|
from decimal import Decimal
|
||||||
|
from unittest import skipUnless
|
||||||
|
|
||||||
from django.contrib.gis.db.models import functions
|
from django.contrib.gis.db.models import functions
|
||||||
from django.contrib.gis.geos import HAS_GEOS
|
from django.contrib.gis.geos import HAS_GEOS
|
||||||
|
@ -12,7 +13,9 @@ from django.utils import six
|
||||||
from ..utils import mysql, oracle, postgis, spatialite
|
from ..utils import mysql, oracle, postgis, spatialite
|
||||||
|
|
||||||
if HAS_GEOS:
|
if HAS_GEOS:
|
||||||
from django.contrib.gis.geos import LineString, Point, Polygon, fromstr
|
from django.contrib.gis.geos import (
|
||||||
|
LineString, Point, Polygon, fromstr, geos_version_info,
|
||||||
|
)
|
||||||
from .models import Country, City, State, Track
|
from .models import Country, City, State, Track
|
||||||
|
|
||||||
|
|
||||||
|
@ -382,6 +385,7 @@ class GISFunctionsTests(TestCase):
|
||||||
)
|
)
|
||||||
|
|
||||||
@skipUnlessDBFeature("has_SymDifference_function")
|
@skipUnlessDBFeature("has_SymDifference_function")
|
||||||
|
@skipUnless(HAS_GEOS and geos_version_info()['version'] >= '3.3.0', "GEOS >= 3.3 required")
|
||||||
def test_sym_difference(self):
|
def test_sym_difference(self):
|
||||||
geom = Point(5, 23, srid=4326)
|
geom = Point(5, 23, srid=4326)
|
||||||
qs = Country.objects.annotate(sym_difference=functions.SymDifference('mpoly', geom))
|
qs = Country.objects.annotate(sym_difference=functions.SymDifference('mpoly', geom))
|
||||||
|
|
Loading…
Reference in New Issue