round geometry to centimeter precision

This commit is contained in:
Laura Klünder 2016-10-09 16:21:05 +02:00
parent 9bfa37271c
commit 1316f6e481
4 changed files with 15 additions and 8 deletions

View file

@ -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):

View file

@ -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)))
))

View file

@ -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):

View file

@ -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)