remove bounds from GeometryMixin
This commit is contained in:
parent
e7e2006aa0
commit
eb4a93084e
2 changed files with 242 additions and 22 deletions
239
src/c3nav/mapdata/migrations/0050_remove_geometry_bounds.py
Normal file
239
src/c3nav/mapdata/migrations/0050_remove_geometry_bounds.py
Normal file
|
@ -0,0 +1,239 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
# Generated by Django 1.11.6 on 2017-11-22 21:13
|
||||
from __future__ import unicode_literals
|
||||
|
||||
from django.db import migrations
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('mapdata', '0049_altitude_area_ramp'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.RemoveField(
|
||||
model_name='altitudearea',
|
||||
name='maxx',
|
||||
),
|
||||
migrations.RemoveField(
|
||||
model_name='altitudearea',
|
||||
name='maxy',
|
||||
),
|
||||
migrations.RemoveField(
|
||||
model_name='altitudearea',
|
||||
name='minx',
|
||||
),
|
||||
migrations.RemoveField(
|
||||
model_name='altitudearea',
|
||||
name='miny',
|
||||
),
|
||||
migrations.RemoveField(
|
||||
model_name='altitudemarker',
|
||||
name='maxx',
|
||||
),
|
||||
migrations.RemoveField(
|
||||
model_name='altitudemarker',
|
||||
name='maxy',
|
||||
),
|
||||
migrations.RemoveField(
|
||||
model_name='altitudemarker',
|
||||
name='minx',
|
||||
),
|
||||
migrations.RemoveField(
|
||||
model_name='altitudemarker',
|
||||
name='miny',
|
||||
),
|
||||
migrations.RemoveField(
|
||||
model_name='area',
|
||||
name='maxx',
|
||||
),
|
||||
migrations.RemoveField(
|
||||
model_name='area',
|
||||
name='maxy',
|
||||
),
|
||||
migrations.RemoveField(
|
||||
model_name='area',
|
||||
name='minx',
|
||||
),
|
||||
migrations.RemoveField(
|
||||
model_name='area',
|
||||
name='miny',
|
||||
),
|
||||
migrations.RemoveField(
|
||||
model_name='building',
|
||||
name='maxx',
|
||||
),
|
||||
migrations.RemoveField(
|
||||
model_name='building',
|
||||
name='maxy',
|
||||
),
|
||||
migrations.RemoveField(
|
||||
model_name='building',
|
||||
name='minx',
|
||||
),
|
||||
migrations.RemoveField(
|
||||
model_name='building',
|
||||
name='miny',
|
||||
),
|
||||
migrations.RemoveField(
|
||||
model_name='column',
|
||||
name='maxx',
|
||||
),
|
||||
migrations.RemoveField(
|
||||
model_name='column',
|
||||
name='maxy',
|
||||
),
|
||||
migrations.RemoveField(
|
||||
model_name='column',
|
||||
name='minx',
|
||||
),
|
||||
migrations.RemoveField(
|
||||
model_name='column',
|
||||
name='miny',
|
||||
),
|
||||
migrations.RemoveField(
|
||||
model_name='door',
|
||||
name='maxx',
|
||||
),
|
||||
migrations.RemoveField(
|
||||
model_name='door',
|
||||
name='maxy',
|
||||
),
|
||||
migrations.RemoveField(
|
||||
model_name='door',
|
||||
name='minx',
|
||||
),
|
||||
migrations.RemoveField(
|
||||
model_name='door',
|
||||
name='miny',
|
||||
),
|
||||
migrations.RemoveField(
|
||||
model_name='graphnode',
|
||||
name='maxx',
|
||||
),
|
||||
migrations.RemoveField(
|
||||
model_name='graphnode',
|
||||
name='maxy',
|
||||
),
|
||||
migrations.RemoveField(
|
||||
model_name='graphnode',
|
||||
name='minx',
|
||||
),
|
||||
migrations.RemoveField(
|
||||
model_name='graphnode',
|
||||
name='miny',
|
||||
),
|
||||
migrations.RemoveField(
|
||||
model_name='hole',
|
||||
name='maxx',
|
||||
),
|
||||
migrations.RemoveField(
|
||||
model_name='hole',
|
||||
name='maxy',
|
||||
),
|
||||
migrations.RemoveField(
|
||||
model_name='hole',
|
||||
name='minx',
|
||||
),
|
||||
migrations.RemoveField(
|
||||
model_name='hole',
|
||||
name='miny',
|
||||
),
|
||||
migrations.RemoveField(
|
||||
model_name='lineobstacle',
|
||||
name='maxx',
|
||||
),
|
||||
migrations.RemoveField(
|
||||
model_name='lineobstacle',
|
||||
name='maxy',
|
||||
),
|
||||
migrations.RemoveField(
|
||||
model_name='lineobstacle',
|
||||
name='minx',
|
||||
),
|
||||
migrations.RemoveField(
|
||||
model_name='lineobstacle',
|
||||
name='miny',
|
||||
),
|
||||
migrations.RemoveField(
|
||||
model_name='obstacle',
|
||||
name='maxx',
|
||||
),
|
||||
migrations.RemoveField(
|
||||
model_name='obstacle',
|
||||
name='maxy',
|
||||
),
|
||||
migrations.RemoveField(
|
||||
model_name='obstacle',
|
||||
name='minx',
|
||||
),
|
||||
migrations.RemoveField(
|
||||
model_name='obstacle',
|
||||
name='miny',
|
||||
),
|
||||
migrations.RemoveField(
|
||||
model_name='poi',
|
||||
name='maxx',
|
||||
),
|
||||
migrations.RemoveField(
|
||||
model_name='poi',
|
||||
name='maxy',
|
||||
),
|
||||
migrations.RemoveField(
|
||||
model_name='poi',
|
||||
name='minx',
|
||||
),
|
||||
migrations.RemoveField(
|
||||
model_name='poi',
|
||||
name='miny',
|
||||
),
|
||||
migrations.RemoveField(
|
||||
model_name='ramp',
|
||||
name='maxx',
|
||||
),
|
||||
migrations.RemoveField(
|
||||
model_name='ramp',
|
||||
name='maxy',
|
||||
),
|
||||
migrations.RemoveField(
|
||||
model_name='ramp',
|
||||
name='minx',
|
||||
),
|
||||
migrations.RemoveField(
|
||||
model_name='ramp',
|
||||
name='miny',
|
||||
),
|
||||
migrations.RemoveField(
|
||||
model_name='space',
|
||||
name='maxx',
|
||||
),
|
||||
migrations.RemoveField(
|
||||
model_name='space',
|
||||
name='maxy',
|
||||
),
|
||||
migrations.RemoveField(
|
||||
model_name='space',
|
||||
name='minx',
|
||||
),
|
||||
migrations.RemoveField(
|
||||
model_name='space',
|
||||
name='miny',
|
||||
),
|
||||
migrations.RemoveField(
|
||||
model_name='stair',
|
||||
name='maxx',
|
||||
),
|
||||
migrations.RemoveField(
|
||||
model_name='stair',
|
||||
name='maxy',
|
||||
),
|
||||
migrations.RemoveField(
|
||||
model_name='stair',
|
||||
name='minx',
|
||||
),
|
||||
migrations.RemoveField(
|
||||
model_name='stair',
|
||||
name='miny',
|
||||
),
|
||||
]
|
|
@ -1,9 +1,7 @@
|
|||
import math
|
||||
from collections import OrderedDict
|
||||
|
||||
from django.db import models
|
||||
from django.utils.functional import cached_property
|
||||
from django.utils.translation import ugettext_lazy as _
|
||||
from shapely.geometry import LineString, Point, mapping
|
||||
from shapely.ops import unary_union
|
||||
|
||||
|
@ -12,25 +10,14 @@ from c3nav.mapdata.utils.geometry import assert_multilinestring, assert_multipol
|
|||
from c3nav.mapdata.utils.json import format_geojson
|
||||
|
||||
|
||||
class GeometryManager(models.Manager):
|
||||
def within(self, minx, miny, maxx, maxy):
|
||||
return self.get_queryset().filter(minx__lte=maxx, maxx__gte=minx, miny__lte=maxy, maxy__gte=miny)
|
||||
|
||||
|
||||
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)
|
||||
objects = GeometryManager()
|
||||
|
||||
class Meta:
|
||||
abstract = True
|
||||
base_manager_name = 'objects'
|
||||
|
||||
def __init__(self, *args, **kwargs):
|
||||
super().__init__(*args, **kwargs)
|
||||
|
@ -85,8 +72,9 @@ class GeometryMixin(SerializableMixin):
|
|||
if simple_geometry:
|
||||
result['point'] = (self.level_id, ) + tuple(round(i, 2) for i in self.point.coords[0])
|
||||
if not isinstance(self.geometry, Point):
|
||||
result['bounds'] = ((int(math.floor(self.minx)), int(math.floor(self.miny))),
|
||||
(int(math.ceil(self.maxx)), int(math.ceil(self.maxy))))
|
||||
minx, miny, maxx, maxy = self.geometry.bounds
|
||||
result['bounds'] = ((int(math.floor(minx)), int(math.floor(miny))),
|
||||
(int(math.ceil(maxx)), int(math.ceil(maxy))))
|
||||
return result
|
||||
|
||||
def details_display(self):
|
||||
|
@ -100,9 +88,6 @@ 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
|
||||
|
||||
@property
|
||||
def geometry_changed(self):
|
||||
if self.orig_geometry is None:
|
||||
|
@ -126,7 +111,3 @@ class GeometryMixin(SerializableMixin):
|
|||
if self._meta.get_field('geometry').geomtype in ('polygon', 'multipolygon'):
|
||||
difference = unary_union(assert_multipolygon(difference))
|
||||
return difference
|
||||
|
||||
def save(self, *args, **kwargs):
|
||||
self.recalculate_bounds()
|
||||
super().save(*args, **kwargs)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue