make altitudes reusable using GroundAltitude model
This commit is contained in:
parent
c939c81c71
commit
97c9c7ecb7
8 changed files with 48 additions and 5 deletions
|
@ -1,5 +1,6 @@
|
|||
from c3nav.mapdata.models.update import MapUpdate # noqa
|
||||
from c3nav.mapdata.models.access import AccessRestriction # noqa
|
||||
from c3nav.mapdata.models.altitudes import GroundAltitude # noqa
|
||||
from c3nav.mapdata.models.level import Level # noqa
|
||||
from c3nav.mapdata.models.geometry.level import Building, Space, Door, AltitudeArea # noqa
|
||||
from c3nav.mapdata.models.geometry.space import Area, Stair, Obstacle, LineObstacle, Hole, AltitudeMarker # noqa
|
||||
|
|
19
src/c3nav/mapdata/models/altitudes.py
Normal file
19
src/c3nav/mapdata/models/altitudes.py
Normal file
|
@ -0,0 +1,19 @@
|
|||
from django.db import models
|
||||
from django.utils.translation import gettext_lazy as _
|
||||
|
||||
|
||||
class GroundAltitude(models.Model):
|
||||
"""
|
||||
A pre-defined ground altitude
|
||||
"""
|
||||
name = models.CharField(_('Name'), unique=True, max_length=70) # a slugfield would forbid periods
|
||||
altitude = models.DecimalField(_('altitude'), null=False, max_digits=6, decimal_places=2)
|
||||
|
||||
class Meta:
|
||||
verbose_name = _('Ground Altitude')
|
||||
verbose_name_plural = _('Ground altitudes')
|
||||
default_related_name = "groundaltitudes"
|
||||
|
||||
@property
|
||||
def title(self):
|
||||
return f'{self.name} ({self.altitude}m)'
|
|
@ -218,7 +218,8 @@ class AltitudeArea(LevelGeometryMixin, models.Model):
|
|||
spaces = {}
|
||||
levels = Level.objects.prefetch_related('buildings', 'doors', 'spaces', 'spaces__columns',
|
||||
'spaces__obstacles', 'spaces__lineobstacles', 'spaces__holes',
|
||||
'spaces__stairs', 'spaces__ramps', 'spaces__altitudemarkers')
|
||||
'spaces__stairs', 'spaces__ramps',
|
||||
'spaces__altitudemarkers__groundaltitude')
|
||||
logger = logging.getLogger('c3nav')
|
||||
|
||||
for level in levels:
|
||||
|
@ -285,7 +286,7 @@ class AltitudeArea(LevelGeometryMixin, models.Model):
|
|||
|
||||
# give altitudes to areas
|
||||
for space in level.spaces.all():
|
||||
for altitudemarker in space.altitudemarkers.all():
|
||||
for altitudemarker in space.altitudemarkers.select_related('groundaltitude').all():
|
||||
for area in space_areas[space.pk]:
|
||||
if area.geometry_prep.contains(unwrap_geom(altitudemarker.geometry)):
|
||||
area.altitude = altitudemarker.altitude
|
||||
|
|
|
@ -298,16 +298,21 @@ class AltitudeMarker(SpaceGeometryMixin, models.Model):
|
|||
An altitude marker
|
||||
"""
|
||||
geometry = GeometryField('point')
|
||||
altitude = models.DecimalField(_('altitude'), null=False, max_digits=6, decimal_places=2)
|
||||
groundaltitude = models.ForeignKey('mapdata.GroundAltitude', on_delete=models.CASCADE,
|
||||
verbose_name=_('altitude'))
|
||||
|
||||
class Meta:
|
||||
verbose_name = _('Altitude Marker')
|
||||
verbose_name_plural = _('Altitude Markers')
|
||||
default_related_name = 'altitudemarkers'
|
||||
|
||||
@property
|
||||
def altitude(self) -> Decimal:
|
||||
return self.groundaltitude.altitude
|
||||
|
||||
@property
|
||||
def title(self):
|
||||
return '%s (%sm)' % (super().title, self.altitude)
|
||||
return f'#{self.pk}: {self.groundaltitude.title}'
|
||||
|
||||
|
||||
class LeaveDescription(SerializableMixin):
|
||||
|
|
0
src/c3nav/mapdata/utils/dataformats.py
Normal file
0
src/c3nav/mapdata/utils/dataformats.py
Normal file
Loading…
Add table
Add a link
Reference in a new issue