From 0e60d1e6087985f6cb25cbaadb786f20f05d8938 Mon Sep 17 00:00:00 2001 From: Jacek Kowalski <Jacek@jacekk.info> Date: Sun, 23 Apr 2017 23:36:05 +0000 Subject: [PATCH] Match inacurrate clicks to nearest feature --- map.js | 40 ++++++++++++++++++++++++++++++++++++++++ 1 files changed, 40 insertions(+), 0 deletions(-) diff --git a/map.js b/map.js index 7547af4..b1ed525 100644 --- a/map.js +++ b/map.js @@ -19,6 +19,7 @@ var feature_timer = null; var map = null; +var map_sphere = null; var popup_element = document.getElementById('popup'); var fail_element = document.getElementById('fail'); @@ -430,6 +431,26 @@ featureClicked(feature); } +function getDistance(c1, c2) { + if(c1.getGeometry) { + c1 = c1.getGeometry().getCoordinates(); + } + if(c2.getGeometry) { + c2 = c2.getGeometry().getCoordinates(); + } + + var c1 = ol.proj.transform(c1, 'EPSG:3857', 'EPSG:4326'); + var c2 = ol.proj.transform(c2, 'EPSG:3857', 'EPSG:4326'); + return map_sphere.haversineDistance(c1, c2); +} + +function returnClosest(point, f1, f2) { + if(!f1) return f2; + if(!f2) return f1; + + return (getDistance(point, f1) < getDistance(point, f2)) ? f1 : f2; +} + function init() { if(!window.jQuery) { fail(lang.jquery_not_loaded); @@ -490,10 +511,29 @@ }) ]), }); + map_sphere = new ol.Sphere(6378137); // Display popup on click map.on('singleclick', function(e) { + var point = e.coordinate; var feature = map.forEachFeatureAtPixel(e.pixel, function(feature) { return feature; }); + + if(!feature) { + if(stops_layer.getVisible()) { + feature = returnClosest(point, feature, stops_source.getClosestFeatureToCoordinate(point)); + } + if(stop_points_layer.getVisible()) { + feature = returnClosest(point, feature, stop_points_source.getClosestFeatureToCoordinate(point)); + } + if(vehicles_layer.getVisible()) { + feature = returnClosest(point, feature, vehicles_source.getClosestFeatureToCoordinate(point)); + } + + if(getDistance(point, feature) > 200) { + feature = null; + } + } + featureClicked(feature); }); -- Gitblit v1.9.1