diff --git a/src/c3nav/mapdata/migrations/0036_geometry_bounds.py b/src/c3nav/mapdata/migrations/0036_geometry_bounds.py new file mode 100644 index 00000000..70fd5089 --- /dev/null +++ b/src/c3nav/mapdata/migrations/0036_geometry_bounds.py @@ -0,0 +1,343 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.6 on 2017-10-10 11:20 +from __future__ import unicode_literals + +from django.db import migrations, models + + +def add_geometry_bounds(apps, schema_editor): + from c3nav.mapdata.models.geometry.base import GeometryMixin + + models = ('AltitudeArea', 'AltitudeMarker', 'Area', 'Building', 'Column', 'Door', 'GraphNode', 'Hole', + 'LineObstacle', 'Obstacle', 'POI', 'Space', 'Stair') + for model in models: + model_cls = apps.get_model('mapdata', model) + for obj in model_cls.objects.all(): + GeometryMixin.recalculate_bounds(obj) + obj.save() + +def remove_geometry_bounds(apps, schema_editor): + pass + + +class Migration(migrations.Migration): + + dependencies = [ + ('mapdata', '0035_auto_20170916_1216'), + ] + + operations = [ + migrations.AddField( + model_name='altitudearea', + name='maxx', + field=models.DecimalField(db_index=True, decimal_places=2, default=0, max_digits=6, verbose_name='max x coordinate'), + preserve_default=False, + ), + migrations.AddField( + model_name='altitudearea', + name='maxy', + field=models.DecimalField(db_index=True, decimal_places=2, default=0, max_digits=6, verbose_name='max y coordinate'), + preserve_default=False, + ), + migrations.AddField( + model_name='altitudearea', + name='minx', + field=models.DecimalField(db_index=True, decimal_places=2, default=0, max_digits=6, verbose_name='min x coordinate'), + preserve_default=False, + ), + migrations.AddField( + model_name='altitudearea', + name='miny', + field=models.DecimalField(db_index=True, decimal_places=2, default=0, max_digits=6, verbose_name='min y coordinate'), + preserve_default=False, + ), + migrations.AddField( + model_name='altitudemarker', + name='maxx', + field=models.DecimalField(db_index=True, decimal_places=2, default=0, max_digits=6, verbose_name='max x coordinate'), + preserve_default=False, + ), + migrations.AddField( + model_name='altitudemarker', + name='maxy', + field=models.DecimalField(db_index=True, decimal_places=2, default=0, max_digits=6, verbose_name='max y coordinate'), + preserve_default=False, + ), + migrations.AddField( + model_name='altitudemarker', + name='minx', + field=models.DecimalField(db_index=True, decimal_places=2, default=0, max_digits=6, verbose_name='min x coordinate'), + preserve_default=False, + ), + migrations.AddField( + model_name='altitudemarker', + name='miny', + field=models.DecimalField(db_index=True, decimal_places=2, default=0, max_digits=6, verbose_name='min y coordinate'), + preserve_default=False, + ), + migrations.AddField( + model_name='area', + name='maxx', + field=models.DecimalField(db_index=True, decimal_places=2, default=0, max_digits=6, verbose_name='max x coordinate'), + preserve_default=False, + ), + migrations.AddField( + model_name='area', + name='maxy', + field=models.DecimalField(db_index=True, decimal_places=2, default=0, max_digits=6, verbose_name='max y coordinate'), + preserve_default=False, + ), + migrations.AddField( + model_name='area', + name='minx', + field=models.DecimalField(db_index=True, decimal_places=2, default=0, max_digits=6, verbose_name='min x coordinate'), + preserve_default=False, + ), + migrations.AddField( + model_name='area', + name='miny', + field=models.DecimalField(db_index=True, decimal_places=2, default=0, max_digits=6, verbose_name='min y coordinate'), + preserve_default=False, + ), + migrations.AddField( + model_name='building', + name='maxx', + field=models.DecimalField(db_index=True, decimal_places=2, default=0, max_digits=6, verbose_name='max x coordinate'), + preserve_default=False, + ), + migrations.AddField( + model_name='building', + name='maxy', + field=models.DecimalField(db_index=True, decimal_places=2, default=0, max_digits=6, verbose_name='max y coordinate'), + preserve_default=False, + ), + migrations.AddField( + model_name='building', + name='minx', + field=models.DecimalField(db_index=True, decimal_places=2, default=0, max_digits=6, verbose_name='min x coordinate'), + preserve_default=False, + ), + migrations.AddField( + model_name='building', + name='miny', + field=models.DecimalField(db_index=True, decimal_places=2, default=0, max_digits=6, verbose_name='min y coordinate'), + preserve_default=False, + ), + migrations.AddField( + model_name='column', + name='maxx', + field=models.DecimalField(db_index=True, decimal_places=2, default=0, max_digits=6, verbose_name='max x coordinate'), + preserve_default=False, + ), + migrations.AddField( + model_name='column', + name='maxy', + field=models.DecimalField(db_index=True, decimal_places=2, default=0, max_digits=6, verbose_name='max y coordinate'), + preserve_default=False, + ), + migrations.AddField( + model_name='column', + name='minx', + field=models.DecimalField(db_index=True, decimal_places=2, default=0, max_digits=6, verbose_name='min x coordinate'), + preserve_default=False, + ), + migrations.AddField( + model_name='column', + name='miny', + field=models.DecimalField(db_index=True, decimal_places=2, default=0, max_digits=6, verbose_name='min y coordinate'), + preserve_default=False, + ), + migrations.AddField( + model_name='door', + name='maxx', + field=models.DecimalField(db_index=True, decimal_places=2, default=0, max_digits=6, verbose_name='max x coordinate'), + preserve_default=False, + ), + migrations.AddField( + model_name='door', + name='maxy', + field=models.DecimalField(db_index=True, decimal_places=2, default=0, max_digits=6, verbose_name='max y coordinate'), + preserve_default=False, + ), + migrations.AddField( + model_name='door', + name='minx', + field=models.DecimalField(db_index=True, decimal_places=2, default=0, max_digits=6, verbose_name='min x coordinate'), + preserve_default=False, + ), + migrations.AddField( + model_name='door', + name='miny', + field=models.DecimalField(db_index=True, decimal_places=2, default=0, max_digits=6, verbose_name='min y coordinate'), + preserve_default=False, + ), + migrations.AddField( + model_name='graphnode', + name='maxx', + field=models.DecimalField(db_index=True, decimal_places=2, default=0, max_digits=6, verbose_name='max x coordinate'), + preserve_default=False, + ), + migrations.AddField( + model_name='graphnode', + name='maxy', + field=models.DecimalField(db_index=True, decimal_places=2, default=0, max_digits=6, verbose_name='max y coordinate'), + preserve_default=False, + ), + migrations.AddField( + model_name='graphnode', + name='minx', + field=models.DecimalField(db_index=True, decimal_places=2, default=0, max_digits=6, verbose_name='min x coordinate'), + preserve_default=False, + ), + migrations.AddField( + model_name='graphnode', + name='miny', + field=models.DecimalField(db_index=True, decimal_places=2, default=0, max_digits=6, verbose_name='min y coordinate'), + preserve_default=False, + ), + migrations.AddField( + model_name='hole', + name='maxx', + field=models.DecimalField(db_index=True, decimal_places=2, default=0, max_digits=6, verbose_name='max x coordinate'), + preserve_default=False, + ), + migrations.AddField( + model_name='hole', + name='maxy', + field=models.DecimalField(db_index=True, decimal_places=2, default=0, max_digits=6, verbose_name='max y coordinate'), + preserve_default=False, + ), + migrations.AddField( + model_name='hole', + name='minx', + field=models.DecimalField(db_index=True, decimal_places=2, default=0, max_digits=6, verbose_name='min x coordinate'), + preserve_default=False, + ), + migrations.AddField( + model_name='hole', + name='miny', + field=models.DecimalField(db_index=True, decimal_places=2, default=0, max_digits=6, verbose_name='min y coordinate'), + preserve_default=False, + ), + migrations.AddField( + model_name='lineobstacle', + name='maxx', + field=models.DecimalField(db_index=True, decimal_places=2, default=0, max_digits=6, verbose_name='max x coordinate'), + preserve_default=False, + ), + migrations.AddField( + model_name='lineobstacle', + name='maxy', + field=models.DecimalField(db_index=True, decimal_places=2, default=0, max_digits=6, verbose_name='max y coordinate'), + preserve_default=False, + ), + migrations.AddField( + model_name='lineobstacle', + name='minx', + field=models.DecimalField(db_index=True, decimal_places=2, default=0, max_digits=6, verbose_name='min x coordinate'), + preserve_default=False, + ), + migrations.AddField( + model_name='lineobstacle', + name='miny', + field=models.DecimalField(db_index=True, decimal_places=2, default=0, max_digits=6, verbose_name='min y coordinate'), + preserve_default=False, + ), + migrations.AddField( + model_name='obstacle', + name='maxx', + field=models.DecimalField(db_index=True, decimal_places=2, default=0, max_digits=6, verbose_name='max x coordinate'), + preserve_default=False, + ), + migrations.AddField( + model_name='obstacle', + name='maxy', + field=models.DecimalField(db_index=True, decimal_places=2, default=0, max_digits=6, verbose_name='max y coordinate'), + preserve_default=False, + ), + migrations.AddField( + model_name='obstacle', + name='minx', + field=models.DecimalField(db_index=True, decimal_places=2, default=0, max_digits=6, verbose_name='min x coordinate'), + preserve_default=False, + ), + migrations.AddField( + model_name='obstacle', + name='miny', + field=models.DecimalField(db_index=True, decimal_places=2, default=0, max_digits=6, verbose_name='min y coordinate'), + preserve_default=False, + ), + migrations.AddField( + model_name='poi', + name='maxx', + field=models.DecimalField(db_index=True, decimal_places=2, default=0, max_digits=6, verbose_name='max x coordinate'), + preserve_default=False, + ), + migrations.AddField( + model_name='poi', + name='maxy', + field=models.DecimalField(db_index=True, decimal_places=2, default=0, max_digits=6, verbose_name='max y coordinate'), + preserve_default=False, + ), + migrations.AddField( + model_name='poi', + name='minx', + field=models.DecimalField(db_index=True, decimal_places=2, default=0, max_digits=6, verbose_name='min x coordinate'), + preserve_default=False, + ), + migrations.AddField( + model_name='poi', + name='miny', + field=models.DecimalField(db_index=True, decimal_places=2, default=0, max_digits=6, verbose_name='min y coordinate'), + preserve_default=False, + ), + migrations.AddField( + model_name='space', + name='maxx', + field=models.DecimalField(db_index=True, decimal_places=2, default=0, max_digits=6, verbose_name='max x coordinate'), + preserve_default=False, + ), + migrations.AddField( + model_name='space', + name='maxy', + field=models.DecimalField(db_index=True, decimal_places=2, default=0, max_digits=6, verbose_name='max y coordinate'), + preserve_default=False, + ), + migrations.AddField( + model_name='space', + name='minx', + field=models.DecimalField(db_index=True, decimal_places=2, default=0, max_digits=6, verbose_name='min x coordinate'), + preserve_default=False, + ), + migrations.AddField( + model_name='space', + name='miny', + field=models.DecimalField(db_index=True, decimal_places=2, default=0, max_digits=6, verbose_name='min y coordinate'), + preserve_default=False, + ), + migrations.AddField( + model_name='stair', + name='maxx', + field=models.DecimalField(db_index=True, decimal_places=2, default=0, max_digits=6, verbose_name='max x coordinate'), + preserve_default=False, + ), + migrations.AddField( + model_name='stair', + name='maxy', + field=models.DecimalField(db_index=True, decimal_places=2, default=0, max_digits=6, verbose_name='max y coordinate'), + preserve_default=False, + ), + migrations.AddField( + model_name='stair', + name='minx', + field=models.DecimalField(db_index=True, decimal_places=2, default=0, max_digits=6, verbose_name='min x coordinate'), + preserve_default=False, + ), + migrations.AddField( + model_name='stair', + name='miny', + field=models.DecimalField(db_index=True, decimal_places=2, default=0, max_digits=6, verbose_name='min y coordinate'), + preserve_default=False, + ), + migrations.RunPython(add_geometry_bounds, remove_geometry_bounds), + ] diff --git a/src/c3nav/mapdata/models/geometry/base.py b/src/c3nav/mapdata/models/geometry/base.py index a0cf8955..42b4b265 100644 --- a/src/c3nav/mapdata/models/geometry/base.py +++ b/src/c3nav/mapdata/models/geometry/base.py @@ -1,5 +1,7 @@ from collections import OrderedDict +from django.db import models +from django.utils.translation import ugettext_lazy as _ from shapely.geometry import Point, mapping from c3nav.mapdata.models.base import SerializableMixin @@ -11,6 +13,10 @@ class GeometryMixin(SerializableMixin): A map feature with a geometry """ geometry = None + minx = models.DecimalField(_('min x coordinate'), max_digits=6, decimal_places=2, db_index=True) + miny = models.DecimalField(_('min y coordinate'), max_digits=6, decimal_places=2, db_index=True) + maxx = models.DecimalField(_('max x coordinate'), max_digits=6, decimal_places=2, db_index=True) + maxy = models.DecimalField(_('max y coordinate'), max_digits=6, decimal_places=2, db_index=True) class Meta: abstract = True @@ -59,3 +65,10 @@ class GeometryMixin(SerializableMixin): def contains(self, x, y) -> bool: return self.geometry.contains(Point(x, y)) + + def recalculate_bounds(self): + self.minx, self.miny, self.maxx, self.maxy = self.geometry.bounds + + def save(self, *args, **kwargs): + self.recalculate_bounds() + super().save(*args, **kwargs)