def test_geography_value(self):
     p = Polygon(((1, 1), (1, 2), (2, 2), (2, 1), (1, 1)))
     area = (
         City.objects.annotate(
             a=functions.Area(Value(p, GeometryField(srid=4326, geography=True)))
         )
         .first()
         .a
     )
     self.assertAlmostEqual(area.sq_km, 12305.1, 0)
Exemple #2
0
    def test_area_lookups(self):
        # Create projected countries so the test works on all backends.
        CountryWebMercator.objects.bulk_create(
            CountryWebMercator(name=c.name, mpoly=c.mpoly.transform(3857, clone=True))
            for c in Country.objects.all()
        )
        qs = CountryWebMercator.objects.annotate(area=functions.Area('mpoly'))
        self.assertEqual(qs.get(area__lt=Area(sq_km=500000)), CountryWebMercator.objects.get(name='New Zealand'))

        with self.assertRaisesMessage(ValueError, 'AreaField only accepts Area measurement objects.'):
            qs.get(area__lt=500000)
Exemple #3
0
 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)
Exemple #4
0
 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.transform(3857, clone=True))
     # Test in projected coordinate system
     qs = CountryWebMercator.objects.annotate(area_sum=Sum(functions.Area('mpoly')))
     # Some backends (e.g. Oracle) cannot group by multipolygon values, so
     # defer such fields in the aggregation query.
     for c in qs.defer('mpoly'):
         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)