Fixed #27573 -- Made Distance on geodetic coordinates return a raw value on MySQL.
This commit is contained in:
parent
35c0025151
commit
898e623db0
|
@ -253,15 +253,13 @@ class DistanceResultMixin:
|
||||||
def convert_value(self, value, expression, connection, context):
|
def convert_value(self, value, expression, connection, context):
|
||||||
if value is None:
|
if value is None:
|
||||||
return None
|
return None
|
||||||
|
dist_att = None
|
||||||
geo_field = self.geo_field
|
geo_field = self.geo_field
|
||||||
if geo_field.geodetic(connection):
|
if geo_field.geodetic(connection):
|
||||||
|
if connection.features.supports_distance_geodetic:
|
||||||
dist_att = 'm'
|
dist_att = 'm'
|
||||||
else:
|
else:
|
||||||
units = geo_field.units_name(connection)
|
dist_att = geo_field.units_name(connection)
|
||||||
if units:
|
|
||||||
dist_att = DistanceMeasure.unit_attname(units)
|
|
||||||
else:
|
|
||||||
dist_att = None
|
|
||||||
if dist_att:
|
if dist_att:
|
||||||
return DistanceMeasure(**{dist_att: value})
|
return DistanceMeasure(**{dist_att: value})
|
||||||
return value
|
return value
|
||||||
|
|
|
@ -5,7 +5,7 @@ from django.contrib.gis.geos import GEOSGeometry, LineString, Point
|
||||||
from django.contrib.gis.measure import D # alias for Distance
|
from django.contrib.gis.measure import D # alias for Distance
|
||||||
from django.db import connection
|
from django.db import connection
|
||||||
from django.db.models import F, Q
|
from django.db.models import F, Q
|
||||||
from django.test import TestCase, skipUnlessDBFeature
|
from django.test import TestCase, skipIfDBFeature, skipUnlessDBFeature
|
||||||
|
|
||||||
from ..utils import no_oracle, oracle, postgis, spatialite
|
from ..utils import no_oracle, oracle, postgis, spatialite
|
||||||
from .models import (
|
from .models import (
|
||||||
|
@ -360,6 +360,14 @@ class DistanceFunctionsTests(TestCase):
|
||||||
for i, c in enumerate(qs):
|
for i, c in enumerate(qs):
|
||||||
self.assertAlmostEqual(sphere_distances[i], c.distance.m, tol)
|
self.assertAlmostEqual(sphere_distances[i], c.distance.m, tol)
|
||||||
|
|
||||||
|
@skipIfDBFeature("supports_distance_geodetic")
|
||||||
|
@skipUnlessDBFeature("has_Distance_function")
|
||||||
|
def test_distance_function_raw_result(self):
|
||||||
|
distance = Interstate.objects.annotate(
|
||||||
|
d=Distance(Point(0, 0, srid=4326), Point(0, 1, srid=4326)),
|
||||||
|
).first().d
|
||||||
|
self.assertEqual(distance, 1)
|
||||||
|
|
||||||
@no_oracle # Oracle already handles geographic distance calculation.
|
@no_oracle # Oracle already handles geographic distance calculation.
|
||||||
@skipUnlessDBFeature("has_Distance_function", 'has_Transform_function')
|
@skipUnlessDBFeature("has_Distance_function", 'has_Transform_function')
|
||||||
def test_distance_transform(self):
|
def test_distance_transform(self):
|
||||||
|
|
Loading…
Reference in New Issue