add rtree Index with wrapper and fallback
This commit is contained in:
parent
6869ae40e4
commit
f7486cdbaf
3 changed files with 74 additions and 3 deletions
70
src/c3nav/mapdata/utils/index.py
Normal file
70
src/c3nav/mapdata/utils/index.py
Normal file
|
@ -0,0 +1,70 @@
|
||||||
|
import operator
|
||||||
|
from functools import reduce
|
||||||
|
|
||||||
|
from django.core import checks
|
||||||
|
from shapely import speedups
|
||||||
|
|
||||||
|
if speedups.available:
|
||||||
|
speedups.enable()
|
||||||
|
|
||||||
|
|
||||||
|
try:
|
||||||
|
import rtree
|
||||||
|
except OSError:
|
||||||
|
rtree_index = False
|
||||||
|
|
||||||
|
class Index:
|
||||||
|
def __init__(self):
|
||||||
|
self.objects = {}
|
||||||
|
|
||||||
|
def insert(self, value, geometry):
|
||||||
|
self.objects[value] = geometry
|
||||||
|
|
||||||
|
def delete(self, value):
|
||||||
|
self.objects.pop(value)
|
||||||
|
|
||||||
|
def intersections(self, geometry):
|
||||||
|
return self.objects.values()
|
||||||
|
else:
|
||||||
|
rtree_index = True
|
||||||
|
|
||||||
|
class Index:
|
||||||
|
def __init__(self):
|
||||||
|
self._index = rtree.index.Index()
|
||||||
|
self._bounds = {}
|
||||||
|
|
||||||
|
def insert(self, value, geometry):
|
||||||
|
try:
|
||||||
|
geoms = geometry.geoms
|
||||||
|
except AttributeError:
|
||||||
|
self._bounds.setdefault(value, []).append(geometry.bounds)
|
||||||
|
self._index.insert(value, geometry.bounds)
|
||||||
|
else:
|
||||||
|
for geom in geoms:
|
||||||
|
self.insert(value, geom)
|
||||||
|
|
||||||
|
def delete(self, value):
|
||||||
|
for bounds in self._bounds.pop(value):
|
||||||
|
self._index.delete(value, bounds)
|
||||||
|
|
||||||
|
def intersections(self, geometry):
|
||||||
|
try:
|
||||||
|
geoms = geometry.geoms
|
||||||
|
except AttributeError:
|
||||||
|
return set(self._index.intersection(geometry.bounds))
|
||||||
|
else:
|
||||||
|
return reduce(operator.__or__, (self.intersections(geom) for geom in geoms), set())
|
||||||
|
|
||||||
|
|
||||||
|
@checks.register()
|
||||||
|
def check_svg_renderer(app_configs, **kwargs):
|
||||||
|
errors = []
|
||||||
|
if not rtree_index:
|
||||||
|
errors.append(
|
||||||
|
checks.Warning(
|
||||||
|
'The libspatialindex_c library is missing. This will drastically slow down c3nav rendering.',
|
||||||
|
obj='rtree.index.Index',
|
||||||
|
id='c3nav.mapdata.W001',
|
||||||
|
)
|
||||||
|
)
|
||||||
|
return errors
|
|
@ -6,7 +6,7 @@ from itertools import chain
|
||||||
|
|
||||||
import numpy as np
|
import numpy as np
|
||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
from django.core.checks import Error, register
|
from django.core import checks
|
||||||
from PIL import Image
|
from PIL import Image
|
||||||
from shapely.affinity import translate
|
from shapely.affinity import translate
|
||||||
from shapely.geometry import LineString, Polygon
|
from shapely.geometry import LineString, Polygon
|
||||||
|
@ -20,12 +20,12 @@ if settings.SVG_RENDERER == 'rsvg':
|
||||||
from pgi.repository import Rsvg
|
from pgi.repository import Rsvg
|
||||||
|
|
||||||
|
|
||||||
@register()
|
@checks.register()
|
||||||
def check_svg_renderer(app_configs, **kwargs):
|
def check_svg_renderer(app_configs, **kwargs):
|
||||||
errors = []
|
errors = []
|
||||||
if settings.SVG_RENDERER not in ('rsvg', 'rsvg-convert', 'inkscape'):
|
if settings.SVG_RENDERER not in ('rsvg', 'rsvg-convert', 'inkscape'):
|
||||||
errors.append(
|
errors.append(
|
||||||
Error(
|
checks.Error(
|
||||||
'Invalid SVG renderer: '+settings.SVG_RENDERER,
|
'Invalid SVG renderer: '+settings.SVG_RENDERER,
|
||||||
obj='settings.SVG_RENDERER',
|
obj='settings.SVG_RENDERER',
|
||||||
id='c3nav.mapdata.E001',
|
id='c3nav.mapdata.E001',
|
||||||
|
|
|
@ -5,6 +5,7 @@ csscompressor
|
||||||
djangorestframework>=3.6,<3.7
|
djangorestframework>=3.6,<3.7
|
||||||
django-filter>=1.0,<1.1
|
django-filter>=1.0,<1.1
|
||||||
shapely>=1.5,<1.6
|
shapely>=1.5,<1.6
|
||||||
|
rtree>=0.8,<0.9
|
||||||
celery>=4.0,<4.1
|
celery>=4.0,<4.1
|
||||||
requests>=2.17,<2.18
|
requests>=2.17,<2.18
|
||||||
Pillow>=4.1,<4.2
|
Pillow>=4.1,<4.2
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue