diff --git a/src/c3nav/mapdata/fields.py b/src/c3nav/mapdata/fields.py index eb260720..096c079c 100644 --- a/src/c3nav/mapdata/fields.py +++ b/src/c3nav/mapdata/fields.py @@ -3,7 +3,7 @@ import json from django.db import models from shapely.geometry import mapping, shape -from c3nav.mapdata.utils import sort_geojson +from c3nav.mapdata.utils import format_geojson class GeometryField(models.TextField): @@ -16,7 +16,7 @@ class GeometryField(models.TextField): return shape(json.loads(value)) def get_prep_value(self, value): - return json.dumps(sort_geojson(mapping(value))) + return json.dumps(format_geojson(mapping(value))) class JSONField(models.TextField): diff --git a/src/c3nav/mapdata/models/feature.py b/src/c3nav/mapdata/models/feature.py index 9e3a8a7c..7ca87bb7 100644 --- a/src/c3nav/mapdata/models/feature.py +++ b/src/c3nav/mapdata/models/feature.py @@ -7,7 +7,7 @@ from django.utils.translation import activate, get_language from shapely.geometry import mapping, shape from c3nav.mapdata.fields import GeometryField, JSONField -from c3nav.mapdata.utils import sort_geojson +from c3nav.mapdata.utils import format_geojson class FeatureType(namedtuple('FeatureType', ('name', 'title', 'title_plural', 'geomtype', 'color'))): @@ -105,5 +105,5 @@ class Feature(models.Model): return OrderedDict(( ('titles', OrderedDict(sorted(self.titles.items()))), ('level', self.level.name), - ('geometry', sort_geojson(mapping(self.geometry))) + ('geometry', format_geojson(mapping(self.geometry))) )) diff --git a/src/c3nav/mapdata/serializers.py b/src/c3nav/mapdata/serializers.py index 1dddaef6..1c3e8edf 100644 --- a/src/c3nav/mapdata/serializers.py +++ b/src/c3nav/mapdata/serializers.py @@ -8,7 +8,7 @@ from c3nav.api.serializers import RecursiveSerializerMixin from c3nav.editor.hosters import get_hoster_for_package from c3nav.mapdata.models import Feature, Level, Package, Source from c3nav.mapdata.models.feature import FEATURE_TYPES -from c3nav.mapdata.utils import sort_geojson +from c3nav.mapdata.utils import format_geojson class GeometryField(serializers.DictField): @@ -20,7 +20,7 @@ class GeometryField(serializers.DictField): } def to_representation(self, obj): - geojson = sort_geojson(mapping(obj)) + geojson = format_geojson(mapping(obj), round=False) return super().to_representation(geojson) def to_internal_value(self, data): diff --git a/src/c3nav/mapdata/utils.py b/src/c3nav/mapdata/utils.py index b4746222..518d6a4e 100644 --- a/src/c3nav/mapdata/utils.py +++ b/src/c3nav/mapdata/utils.py @@ -33,8 +33,15 @@ def json_encoder_reindent(method, data, *args, **kwargs): return result.replace(b'"'+magic_marker, b'').replace(magic_marker+b'"', b'') -def sort_geojson(data): +def format_geojson(data, round=True): return OrderedDict(( ('type', data['type']), - ('coordinates', data['coordinates']), + ('coordinates', round_coordinates(data['coordinates']) if round else data['coordinates']), )) + + +def round_coordinates(data): + if isinstance(data, (list, tuple)): + return tuple(round_coordinates(item) for item in data) + else: + return round(data, 2)