summaryrefslogtreecommitdiff
path: root/chimere
diff options
context:
space:
mode:
authorÉtienne Loks <etienne.loks@iggdrasil.net>2016-08-01 18:56:55 +0200
committerÉtienne Loks <etienne.loks@iggdrasil.net>2016-08-01 18:56:55 +0200
commit862f795c2a2067510d10fdabdaec7c2e491a78ed (patch)
tree4ff776593245faf3352bfcf4af35477344093e73 /chimere
parent7ddf224de3f1f751f00ebc883404f1424f018c3e (diff)
downloadChimère-862f795c2a2067510d10fdabdaec7c2e491a78ed.tar.bz2
Chimère-862f795c2a2067510d10fdabdaec7c2e491a78ed.zip
Manage agregation on higher zoom
* json give the needed zoom to have full access on objects * js reload items when the needed zoom is reach * on click on aggregated item zoom to the needed zoom to have access to items
Diffstat (limited to 'chimere')
-rw-r--r--chimere/models.py8
-rw-r--r--chimere/static/chimere/js/jquery.chimere.js18
-rw-r--r--chimere/views.py56
3 files changed, 63 insertions, 19 deletions
diff --git a/chimere/models.py b/chimere/models.py
index 9f3734d..2f6999e 100644
--- a/chimere/models.py
+++ b/chimere/models.py
@@ -291,7 +291,8 @@ class SubCategory(models.Model):
return u"%s / %s" % (self.category.name, self.name)
@classmethod
- def getAvailable(cls, item_types=None, area_name=None, public=False):
+ def getAvailable(cls, item_types=None, area_name=None, public=False,
+ instance=False):
'''Get list of tuples with first the category and second the associated
subcategories
'''
@@ -312,6 +313,10 @@ class SubCategory(models.Model):
subcategories = subcategories.filter(id__in=sub_ids)
selected_cats = [subcat.pk
for subcat in area.default_subcategories.all()]
+
+ if instance:
+ return subcategories.order_by('order')
+
for sub_category in subcategories.order_by('order'):
if sub_category.category not in sub_categories:
sub_categories[sub_category.category] = []
@@ -319,7 +324,6 @@ class SubCategory(models.Model):
sub_category.selected = True
sub_category.category.selected = True
sub_categories[sub_category.category].append(sub_category)
-
subcategories = [(cat, subcats)
for cat, subcats in sub_categories.items()]
get_cat_order = lambda cat_tuple: cat_tuple[0].order
diff --git a/chimere/static/chimere/js/jquery.chimere.js b/chimere/static/chimere/js/jquery.chimere.js
index 2fd94a4..a1490ef 100644
--- a/chimere/static/chimere/js/jquery.chimere.js
+++ b/chimere/static/chimere/js/jquery.chimere.js
@@ -839,13 +839,17 @@ function transform(obj) {
map.getView().calculateExtent(map.getSize()),
EPSG_PROJECTION, EPSG_DISPLAY_PROJECTION
);
+ var current_zoom = settings.map.getView().getZoom();
var init;
if (!settings._cache_boundingbox) init = true;
if (init ||
!ol.extent.containsCoordinate(settings._cache_boundingbox,
- current_extent)){
+ current_extent) ||
+ (settings._zoom_need_reload &&
+ current_zoom >= settings._zoom_need_reload)
+ ){
// enlarge current extent to cache values
x_extent = Math.abs(current_extent[2] - current_extent[0]);
y_extent = Math.abs(current_extent[3] - current_extent[1]);
@@ -854,6 +858,7 @@ function transform(obj) {
current_extent[2] = current_extent[2] + x_extent;
current_extent[3] = current_extent[3] + y_extent;
settings._cache_boundingbox = current_extent;
+ settings._cache_zoom = current_zoom;
if(!init) methods.loadGeoObjects();
}
@@ -1048,6 +1053,7 @@ function transform(obj) {
'min_lat': settings._cache_boundingbox[1],
'max_lon': settings._cache_boundingbox[2],
'max_lat': settings._cache_boundingbox[3],
+ 'zoom_level': settings._cache_zoom
};
}
$.ajax({url: uri,
@@ -1064,6 +1070,9 @@ function transform(obj) {
settings.layerCluster.removeAllFeatures();
}
if (!data.features) return;
+ if (data.zoom_need_reload){
+ settings._zoom_need_reload = data.zoom_need_reload;
+ }
for (var i = 0; i < data.features.length; i++) {
var feature = data.features[i];
if (feature.geometry.type == 'Point'){
@@ -2087,6 +2096,13 @@ function transform(obj) {
* update current detail panel with an AJAX request
*/
var uri = extra_url
+ if (key.length > 3 && key.substring(0, 3) == 'agg' && settings._zoom_need_reload){
+ var current_zoom = settings.map.getView().getZoom();
+ if (current_zoom < settings._zoom_need_reload){
+ settings.map.getView().setZoom(settings._zoom_need_reload);
+ }
+ return
+ }
if (settings.area_id) uri += settings.area_id + "/"
uri += "getDetail/" + key;
var params = {}
diff --git a/chimere/views.py b/chimere/views.py
index 6e0eb40..8eaa83a 100644
--- a/chimere/views.py
+++ b/chimere/views.py
@@ -749,14 +749,35 @@ def checkDate(q):
def _getGeoObjects(area_name, category_ids, status='A', getjson=True,
- aggregated=False, item_types=('Marker', 'Route',
- 'Polygon'),
- bounding_box=None):
+ item_types=('Marker', 'Route', 'Polygon'),
+ bounding_box=None, zoom_level=None):
'''
Get geo objects
'''
+ zoom_need_reload = None
items = []
empty = [] if not getjson else {}
+ subcategories = list(
+ SubCategory.getAvailable(None, area_name, public=True,
+ instance=True).all())
+ aggregated_category_ids = []
+ try:
+ zoom_level = int(zoom_level)
+ except ValueError:
+ zoom_level = None
+ if zoom_level:
+ # pop from main category list
+ len_subcats = len(subcategories)
+ for idx, subcat in enumerate(reversed(subcategories)):
+ if not subcat.min_zoom:
+ continue
+ if zoom_level < subcat.min_zoom:
+ if not zoom_need_reload or zoom_need_reload > subcat.min_zoom:
+ zoom_need_reload = subcat.min_zoom
+ aggregated_category_ids.append(
+ subcategories.pop(len_subcats - 1 - idx).pk)
+
+ category_ids = [subcat.pk for subcat in subcategories]
# marker
if 'Marker' in item_types:
@@ -767,9 +788,8 @@ def _getGeoObjects(area_name, category_ids, status='A', getjson=True,
query = query.filter(point__contained=bounding_box)
query = query.distinct('pk').order_by('-pk')
except:
- return empty
+ return empty, zoom_need_reload
- category_ids = [int(cat_id) for cat_id in category_ids]
if getjson:
for geo_object in list(query):
items += json.loads(geo_object.getGeoJSON(category_ids))
@@ -785,12 +805,12 @@ def _getGeoObjects(area_name, category_ids, status='A', getjson=True,
query = query.filter(polygon__contained=bounding_box)
query = query.distinct('pk').order_by('-pk')
except:
- return empty
+ return empty, zoom_need_reload
- category_ids = [int(cat_id) for cat_id in category_ids]
- if aggregated:
+ if aggregated_category_ids:
query = AggregatedPolygon.objects.filter(
- status__in=status, subcategory__in=category_ids).order_by(
+ status__in=status,
+ subcategory__in=aggregated_category_ids).order_by(
'subcategory', '-pk')
# no bounding box filter
if getjson:
@@ -840,8 +860,8 @@ def _getGeoObjects(area_name, category_ids, status='A', getjson=True,
items += list(query)
if not items:
- return empty
- return items
+ return empty, zoom_need_reload
+ return items, zoom_need_reload
def getGeoObjects(request, area_name, category_ids, status):
@@ -862,12 +882,15 @@ def getGeoObjects(request, area_name, category_ids, status):
bounding_box.append(value)
if bounding_box:
bounding_box = GEOSPolygon.from_bbox(bounding_box)
+ zoom_level = request.GET.get('zoom_level', None)
- jsons = _getGeoObjects(area_name, category_ids, status,
- bounding_box=bounding_box)
+ jsons, zoom_need_reload = _getGeoObjects(
+ area_name, category_ids, status, bounding_box=bounding_box,
+ zoom_level=zoom_level)
if not jsons:
return HttpResponse("[]", content_type="application/json")
- data = json.dumps({"type": "FeatureCollection", "features": jsons})
+ data = json.dumps({"type": "FeatureCollection", "features": jsons,
+ "zoom_need_reload": zoom_need_reload or ''})
return HttpResponse(data, content_type="application/json")
@@ -1058,8 +1081,9 @@ class CategoryView(TemplateView):
if not self.category:
raise Http404(_("Category does not exist"))
- items = _getGeoObjects(self.area_name, [unicode(self.category.pk)],
- getjson=False, item_types=('Marker',))
+ items, zoom_need_reload = _getGeoObjects(
+ self.area_name, [unicode(self.category.pk)], getjson=False,
+ item_types=('Marker',))
return items
def get_context_data(self, *args, **kwargs):