team-3/src/c3nav/mapdata/models/graph.py

73 lines
2.4 KiB
Python
Raw Normal View History

2017-07-27 16:07:00 +02:00
from collections import OrderedDict
2017-07-14 15:20:22 +02:00
from django.db import models
from django.utils.translation import ugettext_lazy as _
from c3nav.mapdata.fields import GeometryField
from c3nav.mapdata.models.access import AccessRestrictionMixin
from c3nav.mapdata.models.base import TitledMixin
from c3nav.mapdata.models.geometry.space import SpaceGeometryMixin
class GraphNode(SpaceGeometryMixin, models.Model):
"""
A graph node
"""
geometry = GeometryField('point')
class Meta:
verbose_name = _('Graph Node')
verbose_name_plural = _('Graph Nodes')
default_related_name = 'graphnodes'
def get_geojson_properties(self, *args, **kwargs) -> dict:
result = super().get_geojson_properties(*args, **kwargs)
return result
2017-07-14 15:20:22 +02:00
class WayType(TitledMixin, models.Model):
"""
A special way type
"""
color = models.CharField(max_length=32, verbose_name=_('edge color'))
class Meta:
verbose_name = _('Way Type')
verbose_name_plural = _('Way Types')
default_related_name = 'waytypes'
class GraphEdge(AccessRestrictionMixin, models.Model):
"""
A directed edge connecting two graph nodes
"""
from_node = models.ForeignKey(GraphNode, on_delete=models.PROTECT, related_name='edges_from_here',
verbose_name=_('from node'))
to_node = models.ForeignKey(GraphNode, on_delete=models.PROTECT, related_name='edges_to_here',
verbose_name=_('to node'))
waytype = models.ForeignKey(WayType, null=True, blank=True, on_delete=models.PROTECT, verbose_name=_('Way Type'))
class Meta:
verbose_name = _('Graph Edge')
verbose_name_plural = _('Graph Edges')
default_related_name = 'graphedges'
unique_together = (('from_node', 'to_node'), )
2017-07-27 16:07:00 +02:00
def to_geojson(self, instance=None) -> dict:
result = OrderedDict((
('type', 'Feature'),
('properties', OrderedDict((
('id', self.pk),
('type', 'graphedge'),
('from_node', self.from_node_id),
('to_node', self.to_node_id),
))),
2017-11-25 18:04:26 +01:00
('geometry', {
'type': 'LineString',
'coordinates': (self.from_node.geometry.coords[0], self.to_node.geometry.coords[0]),
}),
2017-07-27 16:07:00 +02:00
))
if self.waytype_id is not None:
result['properties']['color'] = self.waytype.color
return result