From 90bc5d7fbb9e92a9b7980265aa809847d48c8d62 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?F=C3=A9lix=20Sipma?= Date: Wed, 29 Jan 2014 11:51:49 +0100 Subject: [PATCH] bug fix: popup position; new ol3 api --- geodata/templates/geodata/bigmap.js | 97 ++++++++++++----------------- 1 file changed, 39 insertions(+), 58 deletions(-) diff --git a/geodata/templates/geodata/bigmap.js b/geodata/templates/geodata/bigmap.js index 4da35ac..7e415f0 100644 --- a/geodata/templates/geodata/bigmap.js +++ b/geodata/templates/geodata/bigmap.js @@ -1,7 +1,7 @@ {% load l10n %} {% block vars %}var {{ module }} = {}; -{{ module }}.map = null; {{ module }}.panel = null; {{ module }}.layers = {}; {{ module }}.info = null; {{ module }}.popup = null; +{{ module }}.map = null; {{ module }}.panel = null; {{ module }}.layers = {}; {{ module }}.layerstyle = {}; {{ module }}.info = null; {{ module }}.popup = null; {% endblock %} var base_layer = new ol.layer.Tile({ @@ -9,38 +9,28 @@ var base_layer = new ol.layer.Tile({ }); {% for layer in map_layers %} +{{ module }}.layerstyle[{{ forloop.counter0 }}] = [new ol.style.Style({ + image: new ol.style.Icon(({ + src: '{{ layer.external_graphic }}', + })) + })]; + {{ module }}.layers[{{ forloop.counter0 }}] = new ol.layer.Vector({ - source: new ol.source.Vector({ - parser: new ol.parser.GeoJSON(), + source: new ol.source.GeoJSON({ url: '{{ layer.url }}' }), - style: new ol.style.Style({ - symbolizers: [ - new ol.style.Icon({ - url: '{{ layer.external_graphic }}', - }) - ] - }), - transformFeatureInfo: function(features) { - if (features.length > 0) { - var content = {}; - content.name = features[0].get('name'); - content.url = features[0].get('url'); - content.image = features[0].get('image'); - content.geometry = features[0].getGeometry(); - content.coordinates = features[0].getGeometry().getCoordinates(); - return content; - }; + styleFunction: function(feature, resolution) { + return {{ module }}.layerstyle[{{ forloop.counter0 }}]; } }); {% endfor %} {{ module }}.map = new ol.Map({ - target: '{{ module }}_map', layers: [ base_layer{% for layer in map_layers %}, {{ module }}.layers[{{ forloop.counter0 }}]{% endfor %} ], renderer: ol.RendererHint.CANVAS, + target: document.getElementById('{{ module }}_map'), view: new ol.View2D({ center: [-2400000, 3000000], zoom: 2 @@ -64,47 +54,38 @@ var base_layer = new ol.layer.Tile({ $({{ module }}.map.getViewport()).on('mousemove', function(evt) { var pixel = {{ module }}.map.getEventPixel(evt.originalEvent); - var position = {{ module }}.map.getEventCoordinate(evt.originalEvent); - {{ module }}.map.getFeatureInfo({ - pixel: pixel, - layers: [{% for layer in map_layers %}{% if forloop.first %}{% else %}, {% endif %}{{ module }}.layers[{{ forloop.counter0 }}]{% endfor %}], - success: function(layerFeatures) { - var flattenFeatures = []; - for (i = 0; i < layerFeatures.length; i++ ) { - if (layerFeatures[i]) { - flattenFeatures = flattenFeatures.concat(layerFeatures[i]); - } - } - var feature = flattenFeatures[0]; - if (feature) { - {{ module }}.popup.setPosition([feature.coordinates[0], feature.coordinates[1] - 150000]); // TODO bug zoom-pixel!!! - var content = ""; - if (feature.image) { - content = "" - }; - {{ module }}.info.popover('hide') - .attr('data-original-title', "" + feature.name + "") - .attr('data-content', content) - .popover('show'); - } else { - {{ module }}.info.popover('hide'); - } - } + var allFeaturesAtPixel = []; + {{ module }}.map.forEachFeatureAtPixel(pixel, function(feature) { + allFeaturesAtPixel.push(feature); }); + + if (allFeaturesAtPixel.length > 0) { + var feature = allFeaturesAtPixel[0]; + var coordinates = feature.getGeometry().getCoordinates(); + var pixel = {{ module }}.map.getPixelFromCoordinate(coordinates); + {{ module }}.popup.setPosition({{ module }}.map.getCoordinateFromPixel([pixel[0], pixel[1] + 5])); + var content = ""; + if (feature.get('image')) { + content = "" + }; + {{ module }}.info.popover('hide') + .attr('data-original-title', "" + feature.get('name') + "") + .attr('data-content', content) + .popover('show'); + } else { + {{ module }}.info.popover('hide'); + } }); $({{ module }}.map.getViewport()).on('click', function(evt) { var pixel = {{ module }}.map.getEventPixel(evt.originalEvent); - {{ module }}.map.getFeatures({ - pixel: pixel, - layers: [{% for layer in map_layers %}{% if forloop.first %}{% else %}, {% endif %}{{ module }}.layers[{{ forloop.counter0 }}]{% endfor %}], - success: function(layerFeatures) { - var flattenFeatures = [].concat.apply([], layerFeatures); - var feature = flattenFeatures[0]; - if (feature) { - window.location.href = feature.e.url; - } else { - } - } + var allFeaturesAtPixel = []; + {{ module }}.map.forEachFeatureAtPixel(pixel, function(feature) { + allFeaturesAtPixel.push(feature); }); + + if (allFeaturesAtPixel.length > 0) { + var feature = allFeaturesAtPixel[0]; + window.location.href = feature.get('url'); + } });