diff --git a/djgeojson/tests.py b/djgeojson/tests.py index 4dfe55e..e32189f 100644 --- a/djgeojson/tests.py +++ b/djgeojson/tests.py @@ -507,6 +507,24 @@ def test_some_tiles_have_empty_queryset(self): self.view.args = [4, 6, 8] self.assertEqual(0, len(self.view.get_queryset())) + def test_simplification_depends_on_zoom_level(self): + self.view.simplifications = {6: 100} + self.view.args = [6, 8, 4] + self.view.get_queryset() + self.assertEqual(self.view.simplify, 100) + + def test_simplification_is_default_if_not_specified(self): + self.view.simplifications = {} + self.view.args = [0, 8, 4] + self.view.get_queryset() + self.assertEqual(self.view.simplify, None) + + def test_simplification_takes_the_closest_upper_level(self): + self.view.simplifications = {3: 100, 6: 200} + self.view.args = [4, 8, 4] + self.view.get_queryset() + self.assertEqual(self.view.simplify, 200) + class Address(models.Model): geom = GeoJSONField() diff --git a/djgeojson/views.py b/djgeojson/views.py index 1681858..8d8ffc0 100644 --- a/djgeojson/views.py +++ b/djgeojson/views.py @@ -67,6 +67,8 @@ class TiledGeoJSONLayerView(GeoJSONLayerView): height = 256 tile_srid = 3857 trim_to_boundary = True + """Simplify geometries by zoom level (dict )""" + simplifications = None def tile_coord(self, xtile, ytile, zoom): """ @@ -95,6 +97,15 @@ def get_queryset(self): qs = qs.filter(**{ '%s__intersects' % self.geometry_field: bbox }) + + # Simplification dict by zoom level + simplifications = self.simplifications or {} + z = self.z + self.simplify = simplifications.get(z) + while self.simplify is None and z < 32: + z += 1 + self.simplify = simplifications.get(z) + # Won't trim point geometries to a boundary model_field = qs.model._meta.get_field(self.geometry_field) self.trim_to_boundary = (self.trim_to_boundary and @@ -102,4 +113,5 @@ def get_queryset(self): if self.trim_to_boundary: qs = qs.intersection(bbox) self.geometry_field = 'intersection' + return qs