From 63b8599d5cf5940d3d4063dccc914a84c88c1926 Mon Sep 17 00:00:00 2001 From: Étienne Loks Date: Thu, 7 Feb 2019 13:05:39 +0100 Subject: Sheet - Map : manage many map on a page - fix vector source display --- ishtar_common/static/js/ishtar-map.js | 253 ++++++++++++++++++---------------- ishtar_common/static/js/ishtar.js | 16 +++ 2 files changed, 148 insertions(+), 121 deletions(-) (limited to 'ishtar_common/static') diff --git a/ishtar_common/static/js/ishtar-map.js b/ishtar_common/static/js/ishtar-map.js index ceef3a59e..0613ec285 100644 --- a/ishtar_common/static/js/ishtar-map.js +++ b/ishtar_common/static/js/ishtar-map.js @@ -9,6 +9,11 @@ var animation_duration = 250; var cluster_threshold_1 = 8; var cluster_threshold_2 = 25; +var base_color_R = 111; +var base_color_V = 66; +var base_color_B = 193; +var base_color_rvb; + var map_default_center = 'SRID=4326;POINT (2.4397 46.5528)'; var map_default_zoom = '7'; var min_auto_zoom_on_cluster = 13; @@ -55,11 +60,11 @@ var get_icon_style = function(feature){ var get_vector_style = function(feature){ return new ol.style.Style({ stroke: new ol.style.Stroke({ - color: 'red', + color: 'rgba(' + base_color_rvb + ', 1)', width: 2 }), fill: new ol.style.Fill({ - color: 'rgba(255,0,0,0.2)' + color: 'rgba(' + base_color_rvb + ', 0.2)' }) }); }; @@ -106,31 +111,30 @@ var cluster_get_style = function(feature, resolution){ /* clustering */ var _styleCache; -var cluster_source; -var cluster_layer; +var cluster_source = {}; +var cluster_layer = {}; -var enable_clustering = function(){ +var enable_clustering = function(map_id){ // cache for styles _styleCache = {}; - // cluster Source - cluster_source = new ol.source.Cluster({ + cluster_source[map_id] = new ol.source.Cluster({ distance: 40, source: new ol.source.Vector() }); // animated cluster layer - cluster_layer = new ol.layer.Vector({ + cluster_layer[map_id] = new ol.layer.Vector({ name: 'Cluster', - source: cluster_source, + source: cluster_source[map_id], // cluster style style: cluster_get_style }); - map.addLayer(cluster_layer); + map[map_id].addLayer(cluster_layer[map_id]); }; -var reinit_clustering = function(){ - cluster_source.getSource().clear(); +var reinit_clustering = function(map_id){ + cluster_source[map_id].getSource().clear(); _styleCache = {}; }; @@ -153,21 +157,23 @@ var wait_animation_end = function(callback, retry){ }, 100); }; -var manage_click_on_map = function(e) { - var feature = map.forEachFeatureAtPixel( - e.pixel, - function(feature, layer) { - return feature; - } - ); - click_on_feature(feature, e); +var manage_click_on_map = function(map_id){ + return function(e) { + var feature = map[map_id].forEachFeatureAtPixel( + e.pixel, + function(feature, layer) { + return feature; + } + ); + click_on_feature(map_id, feature, e); + }; }; -var click_on_feature = function(feature, e){ +var click_on_feature = function(map_id, feature, e){ - if (!$(e.target).is($(popup_item)) - && !$.contains($(popup_item)[0],e.target) ) { - $(popup_item).hide(); + if (!$(e.target).is($(popup_item[map_id])) + && !$.contains($(popup_item[map_id])[0], e.target) ) { + $(popup_item[map_id]).hide(); } if (typeof feature == 'undefined'){ @@ -182,14 +188,14 @@ var click_on_feature = function(feature, e){ // zoom on aggregated var key = feature.get('key'); if (key && key.length > 6 && key.substring(0, 7) == 'cluster'){ - feature = click_on_cluster(feature); + feature = click_on_cluster(map_id, feature); } }, timeout); }; var auto_zoom = false; -var click_on_cluster = function(feature, zoom_level, duration, nb_zoom, +var click_on_cluster = function(map_id, feature, zoom_level, duration, nb_zoom, current_nb_items){ if (!duration){ // zoom animation must be slower @@ -202,7 +208,7 @@ var click_on_cluster = function(feature, zoom_level, duration, nb_zoom, if (!'features' in props) return feature; if (!auto_zoom || props['features'].length == 1){ - return display_cluster_detail(feature); + return display_cluster_detail(map_id, feature); } if (!current_nb_items){ @@ -212,7 +218,7 @@ var click_on_cluster = function(feature, zoom_level, duration, nb_zoom, return feature; } - var v = map.getView(); + var v = map[map_id].getView(); if (!zoom_level) zoom_level = v.getZoom() + 1; // center @@ -221,7 +227,7 @@ var click_on_cluster = function(feature, zoom_level, duration, nb_zoom, if (zoom_level >= min_auto_zoom_on_cluster){ animate_in_progress = true; v.animate({center: new_center, duration: duration}, animate_end); - return display_cluster_detail(feature); + return display_cluster_detail(map_id, feature); } // zoom @@ -237,11 +243,11 @@ var click_on_cluster = function(feature, zoom_level, duration, nb_zoom, return setTimeout( function(){ // our cluster must be at the center (if it exists after zoom) - var pixel = map.getPixelFromCoordinate(v.getCenter()); + var pixel = map[map_id].getPixelFromCoordinate(v.getCenter()); var new_feature; map.forEachFeatureAtPixel( pixel, function(feat, layer){ - if (layer == cluster_layer){ + if (layer == cluster_layer[map_id]){ new_feature = feat; return true } @@ -249,10 +255,10 @@ var click_on_cluster = function(feature, zoom_level, duration, nb_zoom, ); if (new_feature){ if (zoom_level < min_auto_zoom_on_cluster){ - return display_cluster_detail(new_feature); + return display_cluster_detail(map_id, new_feature); } return click_on_cluster( - new_feature, zoom_level + 1, duration, nb_zoom, + map_id, new_feature, zoom_level + 1, duration, nb_zoom, current_nb_items); } // no more cluster feature here or min auto zoom reach: stop zooming @@ -262,7 +268,7 @@ var click_on_cluster = function(feature, zoom_level, duration, nb_zoom, /* display info */ -var display_cluster_detail = function(cluster){ +var display_cluster_detail = function(map_id, cluster){ // console.log("display_cluster_detail"); var features = cluster.getProperties()['features'] var offset_x = 0; @@ -270,24 +276,27 @@ var display_cluster_detail = function(cluster){ if (features.length == 1){ offset_y = -54; } - display_items(features, offset_x, offset_y); + display_items(map_id, features, offset_x, offset_y); }; -var display_items = function(features, offset_x, offset_y){ - wait_animation_end(function() {_display_items(features, offset_x, offset_y)}); +var display_items = function(map_id, features, offset_x, offset_y){ + wait_animation_end(function() {_display_items(map_id, features, offset_x, offset_y)}); }; -var open_map_window = function(){ - $('.ishtar-map-window').show(); +var open_map_window = function(map_id){ + return function(){ + $('#ishtar-map-window-' + map_id).show(); + }; }; var complete_list_label = "complete list..."; -var _display_items = function(features, offset_x, offset_y){ +var _display_items = function(map_id, features, offset_x, offset_y){ // console.log("display_items"); var feature = features[0]; var geom = feature.getGeometry(); - var popup_content = "