round geometry to centimeter precision
This commit is contained in:
parent
9bfa37271c
commit
1316f6e481
4 changed files with 15 additions and 8 deletions
|
@ -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):
|
||||
|
|
|
@ -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)))
|
||||
))
|
||||
|
|
|
@ -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):
|
||||
|
|
|
@ -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)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue