mirror of
https://github.com/django/django.git
synced 2025-09-26 12:09:19 +00:00
Fixed #26112 -- Error when computing aggregate of GIS areas.
Thanks Simon Charette and Claude Paroz for the reviews.
This commit is contained in:
parent
16baec5c8a
commit
a08d2463d2
4 changed files with 36 additions and 16 deletions
|
@ -22,6 +22,10 @@ class Country(NamedModel):
|
|||
mpoly = models.MultiPolygonField() # SRID, by default, is 4326
|
||||
|
||||
|
||||
class CountryWebMercator(NamedModel):
|
||||
mpoly = models.MultiPolygonField(srid=3857)
|
||||
|
||||
|
||||
class City(NamedModel):
|
||||
point = models.PointField()
|
||||
|
||||
|
|
|
@ -5,12 +5,14 @@ from decimal import Decimal
|
|||
|
||||
from django.contrib.gis.db.models import functions
|
||||
from django.contrib.gis.geos import LineString, Point, Polygon, fromstr
|
||||
from django.contrib.gis.measure import Area
|
||||
from django.db import connection
|
||||
from django.db.models import Sum
|
||||
from django.test import TestCase, skipUnlessDBFeature
|
||||
from django.utils import six
|
||||
|
||||
from ..utils import mysql, oracle, postgis, spatialite
|
||||
from .models import City, Country, State, Track
|
||||
from .models import City, Country, CountryWebMercator, State, Track
|
||||
|
||||
|
||||
@skipUnlessDBFeature("gis_enabled")
|
||||
|
@ -231,6 +233,20 @@ class GISFunctionsTests(TestCase):
|
|||
expected = c.mpoly.intersection(geom)
|
||||
self.assertEqual(c.inter, expected)
|
||||
|
||||
@skipUnlessDBFeature("has_Area_function")
|
||||
def test_area_with_regular_aggregate(self):
|
||||
# Create projected country objects, for this test to work on all backends.
|
||||
for c in Country.objects.all():
|
||||
CountryWebMercator.objects.create(name=c.name, mpoly=c.mpoly)
|
||||
# Test in projected coordinate system
|
||||
qs = CountryWebMercator.objects.annotate(area_sum=Sum(functions.Area('mpoly')))
|
||||
for c in qs:
|
||||
result = c.area_sum
|
||||
# If the result is a measure object, get value.
|
||||
if isinstance(result, Area):
|
||||
result = result.sq_m
|
||||
self.assertAlmostEqual((result - c.mpoly.area) / c.mpoly.area, 0)
|
||||
|
||||
@skipUnlessDBFeature("has_MemSize_function")
|
||||
def test_memsize(self):
|
||||
ptown = City.objects.annotate(size=functions.MemSize('point')).get(name='Pueblo')
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue