2017-05-06 17:24:09 +02:00
|
|
|
from collections import OrderedDict
|
2017-05-08 21:55:45 +02:00
|
|
|
|
2017-05-07 12:06:13 +02:00
|
|
|
from shapely.geometry import Point, mapping
|
2017-05-06 17:24:09 +02:00
|
|
|
|
2017-05-08 16:40:22 +02:00
|
|
|
from c3nav.mapdata.models.base import EditorFormMixin
|
2017-05-06 17:24:09 +02:00
|
|
|
from c3nav.mapdata.utils.json import format_geojson
|
|
|
|
|
2017-05-09 09:36:08 +02:00
|
|
|
GEOMETRY_MODELS = OrderedDict()
|
2017-05-06 17:24:09 +02:00
|
|
|
|
|
|
|
|
2017-05-08 16:40:22 +02:00
|
|
|
class GeometryMixin(EditorFormMixin):
|
2017-05-06 17:24:09 +02:00
|
|
|
"""
|
|
|
|
A map feature with a geometry
|
|
|
|
"""
|
2017-05-09 12:50:32 +02:00
|
|
|
geometry = None
|
|
|
|
|
2017-05-06 17:24:09 +02:00
|
|
|
class Meta:
|
|
|
|
abstract = True
|
|
|
|
|
2017-05-09 13:16:36 +02:00
|
|
|
def get_geojson_properties(self) -> dict:
|
2017-05-06 17:24:09 +02:00
|
|
|
return OrderedDict((
|
|
|
|
('type', self.__class__.__name__.lower()),
|
|
|
|
('id', self.id),
|
|
|
|
))
|
|
|
|
|
2017-05-09 13:16:36 +02:00
|
|
|
def to_geojson(self) -> dict:
|
2017-05-06 17:24:09 +02:00
|
|
|
return OrderedDict((
|
|
|
|
('type', 'Feature'),
|
|
|
|
('properties', self.get_geojson_properties()),
|
|
|
|
('geometry', format_geojson(mapping(self.geometry), round=False)),
|
|
|
|
))
|
|
|
|
|
2017-05-11 21:30:29 +02:00
|
|
|
@classmethod
|
|
|
|
def serialize_type(cls, geomtype=True, **kwargs):
|
|
|
|
result = super().serialize_type()
|
|
|
|
if geomtype:
|
|
|
|
result['geomtype'] = cls._meta.get_field('geometry').geomtype
|
|
|
|
return result
|
|
|
|
|
2017-05-11 19:36:49 +02:00
|
|
|
def serialize(self, geometry=True, **kwargs):
|
|
|
|
result = super().serialize(geometry=geometry, **kwargs)
|
|
|
|
if geometry:
|
|
|
|
result.move_to_end('geometry')
|
|
|
|
return result
|
|
|
|
|
|
|
|
def _serialize(self, geometry=True, **kwargs):
|
|
|
|
result = super()._serialize(**kwargs)
|
|
|
|
if geometry:
|
|
|
|
result['geometry'] = format_geojson(mapping(self.geometry), round=False)
|
|
|
|
return result
|
|
|
|
|
2017-05-06 17:24:09 +02:00
|
|
|
def get_shadow_geojson(self):
|
2017-05-09 09:36:08 +02:00
|
|
|
pass
|
2017-05-06 17:24:09 +02:00
|
|
|
|
2017-05-09 13:16:36 +02:00
|
|
|
def contains(self, x, y) -> bool:
|
2017-05-06 17:24:09 +02:00
|
|
|
return self.geometry.contains(Point(x, y))
|