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 django.db import models
|
||||||
from shapely.geometry import mapping, shape
|
from shapely.geometry import mapping, shape
|
||||||
|
|
||||||
from c3nav.mapdata.utils import sort_geojson
|
from c3nav.mapdata.utils import format_geojson
|
||||||
|
|
||||||
|
|
||||||
class GeometryField(models.TextField):
|
class GeometryField(models.TextField):
|
||||||
|
@ -16,7 +16,7 @@ class GeometryField(models.TextField):
|
||||||
return shape(json.loads(value))
|
return shape(json.loads(value))
|
||||||
|
|
||||||
def get_prep_value(self, 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):
|
class JSONField(models.TextField):
|
||||||
|
|
|
@ -7,7 +7,7 @@ from django.utils.translation import activate, get_language
|
||||||
from shapely.geometry import mapping, shape
|
from shapely.geometry import mapping, shape
|
||||||
|
|
||||||
from c3nav.mapdata.fields import GeometryField, JSONField
|
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'))):
|
class FeatureType(namedtuple('FeatureType', ('name', 'title', 'title_plural', 'geomtype', 'color'))):
|
||||||
|
@ -105,5 +105,5 @@ class Feature(models.Model):
|
||||||
return OrderedDict((
|
return OrderedDict((
|
||||||
('titles', OrderedDict(sorted(self.titles.items()))),
|
('titles', OrderedDict(sorted(self.titles.items()))),
|
||||||
('level', self.level.name),
|
('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.editor.hosters import get_hoster_for_package
|
||||||
from c3nav.mapdata.models import Feature, Level, Package, Source
|
from c3nav.mapdata.models import Feature, Level, Package, Source
|
||||||
from c3nav.mapdata.models.feature import FEATURE_TYPES
|
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):
|
class GeometryField(serializers.DictField):
|
||||||
|
@ -20,7 +20,7 @@ class GeometryField(serializers.DictField):
|
||||||
}
|
}
|
||||||
|
|
||||||
def to_representation(self, obj):
|
def to_representation(self, obj):
|
||||||
geojson = sort_geojson(mapping(obj))
|
geojson = format_geojson(mapping(obj), round=False)
|
||||||
return super().to_representation(geojson)
|
return super().to_representation(geojson)
|
||||||
|
|
||||||
def to_internal_value(self, data):
|
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'')
|
return result.replace(b'"'+magic_marker, b'').replace(magic_marker+b'"', b'')
|
||||||
|
|
||||||
|
|
||||||
def sort_geojson(data):
|
def format_geojson(data, round=True):
|
||||||
return OrderedDict((
|
return OrderedDict((
|
||||||
('type', data['type']),
|
('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