support for point geometries in GeometryField

This commit is contained in:
Laura Klünder 2017-05-10 15:24:52 +02:00
parent 47d2616469
commit b7f5f359a5
2 changed files with 10 additions and 6 deletions

View file

@ -5,7 +5,7 @@ from django.core.validators import RegexValidator
from django.db import models from django.db import models
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
from shapely import validation from shapely import validation
from shapely.geometry import LineString, Polygon, mapping, shape from shapely.geometry import LineString, Point, Polygon, mapping, shape
from shapely.geometry.base import BaseGeometry from shapely.geometry.base import BaseGeometry
from c3nav.mapdata.utils.geometry import clean_geometry from c3nav.mapdata.utils.geometry import clean_geometry
@ -27,9 +27,11 @@ class GeometryField(models.TextField):
default_validators = [validate_geometry] default_validators = [validate_geometry]
def __init__(self, geomtype=None, *args, **kwargs): def __init__(self, geomtype=None, *args, **kwargs):
if geomtype == 'polyline':
geomtype = 'linestring'
if geomtype not in (None, 'polygon', 'linestring', 'point'):
raise ValueError(_('GeometryField.geomtype has to be None, "polygon", "linestring", "point"'))
self.geomtype = geomtype self.geomtype = geomtype
if geomtype not in (None, 'polygon', 'polyline'):
raise ValueError(_('GeometryField.geomtype has to be None, "polygon" or "polyline"'))
super().__init__(*args, **kwargs) super().__init__(*args, **kwargs)
def deconstruct(self): def deconstruct(self):
@ -49,8 +51,10 @@ class GeometryField(models.TextField):
def get_prep_value(self, value): def get_prep_value(self, value):
if self.geomtype == 'polygon' and not isinstance(value, Polygon): if self.geomtype == 'polygon' and not isinstance(value, Polygon):
raise TypeError(_('Expected Polygon instance, got %s instead.') % repr(value)) raise TypeError(_('Expected Polygon instance, got %s instead.') % repr(value))
elif self.geomtype == 'polyline' and not isinstance(value, LineString): elif self.geomtype == 'linestring' and not isinstance(value, LineString):
raise TypeError(_('Expected LineString instance, got %s instead.') % repr(value)) raise TypeError(_('Expected LineString instance, got %s instead.') % repr(value))
elif self.geomtype == 'point' and not isinstance(value, Point):
raise TypeError(_('Expected Point instance, got %s instead.') % repr(value))
return json.dumps(format_geojson(mapping(value))) return json.dumps(format_geojson(mapping(value)))

View file

@ -40,7 +40,7 @@ class Stair(SpaceGeometryMixin, models.Model):
""" """
A stair A stair
""" """
geometry = GeometryField('polyline') geometry = GeometryField('linestring')
class Meta: class Meta:
verbose_name = _('Stair') verbose_name = _('Stair')
@ -86,7 +86,7 @@ class LineObstacle(SpaceGeometryMixin, models.Model):
""" """
An obstacle that is a line with a specific width An obstacle that is a line with a specific width
""" """
geometry = GeometryField('polyline') geometry = GeometryField('linestring')
width = models.DecimalField(_('obstacle width'), max_digits=4, decimal_places=2, default=0.15) width = models.DecimalField(_('obstacle width'), max_digits=4, decimal_places=2, default=0.15)
class Meta: class Meta: