From 97b9c65c97eb74bc4f03b13fd619bc2d60360fdd Mon Sep 17 00:00:00 2001 From: DennisSchiefer Date: Sun, 18 Mar 2012 20:03:15 +0100 Subject: [PATCH] refactored reverse geocoder --- WebContent/OSRM.Markers.js | 2 +- WebContent/geocoder.js | 138 +++++++++++++++++++------------------ WebContent/routing.js | 4 +- 3 files changed, 73 insertions(+), 71 deletions(-) diff --git a/WebContent/OSRM.Markers.js b/WebContent/OSRM.Markers.js index 97dca3f34..d0b93780d 100644 --- a/WebContent/OSRM.Markers.js +++ b/WebContent/OSRM.Markers.js @@ -140,7 +140,7 @@ onDragEnd: function(e) { } if(OSRM.G.route.isShown()==false) - updateReverseGeocoder(this.parent.label); + updateAddress(this.parent.label); }, toString: function() { return "OSRM.RouteMarker: \""+this.label+"\", "+this.position+")"; diff --git a/WebContent/geocoder.js b/WebContent/geocoder.js index 02e4105c5..00fc75fb5 100644 --- a/WebContent/geocoder.js +++ b/WebContent/geocoder.js @@ -27,9 +27,9 @@ OSRM.CONSTANTS.VIA_LABEL = "via"; // update geo coordinates in input boxes function updateLocation(marker_id) { - if (marker_id == OSRM.C.SOURCE_LABEL) { + if (marker_id == OSRM.C.SOURCE_LABEL && OSRM.G.markers.hasSource()) { document.getElementById("input-source-name").value = OSRM.G.markers.route[0].getPosition().lat.toFixed(6) + ", " + OSRM.G.markers.route[0].getPosition().lng.toFixed(6); - } else if (marker_id == OSRM.C.TARGET_LABEL) { + } else if (marker_id == OSRM.C.TARGET_LABEL && OSRM.G.markers.hasTarget()) { document.getElementById("input-target-name").value = OSRM.G.markers.route[OSRM.G.markers.route.length-1].getPosition().lat.toFixed(6) + ", " + OSRM.G.markers.route[OSRM.G.markers.route.length-1].getPosition().lng.toFixed(6); } } @@ -73,7 +73,7 @@ function onclickGeocoderResult(marker_id, lat, lon, do_reverse_geocode, do_zoom index = -1; // via nodes not yet implemented if( do_reverse_geocode == true ) - updateReverseGeocoder(marker_id); + updateAddress(marker_id); var zoom = undefined; if( do_zoom == false ) zoom = OSRM.G.map.getZoom(); @@ -141,75 +141,77 @@ function showGeocoderResults_Timeout() { // - [upcoming feature: reverse geocoding (untested) ] - -//update reverse geocoder informatiopn in input boxes -function updateReverseGeocoder(marker_id) { - if (marker_id == OSRM.C.SOURCE_LABEL && OSRM.G.markers.hasSource()) { //&& OSRM.G.markers.route[0].dirty == true ) { - //document.getElementById("input-source-name").value = OSRM.G.markers.route[0].getPosition().lat.toFixed(6) + ", " + OSRM.G.markers.route[0].getPosition().lng.toFixed(6); - callReverseGeocoder(OSRM.C.SOURCE_LABEL, OSRM.G.markers.route[0].getPosition().lat, OSRM.G.markers.route[0].getPosition().lng); - } else if (marker_id == OSRM.C.TARGET_LABEL && OSRM.G.markers.hasTarget()) { //&& OSRM.G.markers.route[OSRM.G.markers.route.length-1].dirty == true) { - //document.getElementById("input-target-name").value = OSRM.G.markers.route[OSRM.G.markers.route.length-1].getPosition().lat.toFixed(6) + ", " + OSRM.G.markers.route[OSRM.G.markers.route.length-1].getPosition().lng.toFixed(6); - callReverseGeocoder(OSRM.C.TARGET_LABEL, OSRM.G.markers.route[OSRM.G.markers.route.length-1].getPosition().lat, OSRM.G.markers.route[OSRM.G.markers.route.length-1].getPosition().lng); - } +// update address in input boxes +function updateAddress(marker_id, do_fallback_to_lat_lng) { + var lat = null; + var lng = null; + + if(marker_id == OSRM.C.SOURCE_LABEL && OSRM.G.markers.hasSource()) { + lat = OSRM.G.markers.route[0].getPosition().lat; + lng = OSRM.G.markers.route[0].getPosition().lng; + } else if(marker_id == OSRM.C.TARGET_LABEL && OSRM.G.markers.hasTarget() ) { + lat = OSRM.G.markers.route[OSRM.G.markers.route.length-1].getPosition().lat; + lng = OSRM.G.markers.route[OSRM.G.markers.route.length-1].getPosition().lng; + } else + return; + + var call = OSRM.DEFAULTS.HOST_REVERSE_GEOCODER_URL + "?format=json" + "&lat=" + lat + "&lon=" + lng; + OSRM.JSONP.call( call, processReverseGeocoderResponse, processReverseGeocoderResponse_Timeout, OSRM.DEFAULTS.JSONP_TIMEOUT, "reverse_geocoder_"+marker_id, {marker_id:marker_id, do_fallback: do_fallback_to_lat_lng} ); } -//prepare request and call reverse geocoder -function callReverseGeocoder(marker_id, lat, lon) { - //build request - if (marker_id == OSRM.C.SOURCE_LABEL) { - var call = OSRM.DEFAULTS.HOST_REVERSE_GEOCODER_URL + "?format=json" + "&lat=" + lat + "&lon=" + lon; - OSRM.JSONP.call( call, showReverseGeocoderResults_Source, showReverseGeocoderResults_Timeout, OSRM.DEFAULTS.JSONP_TIMEOUT, "reverse_geocoder_source" ); - } else if (marker_id == OSRM.C.TARGET_LABEL) { - var call = OSRM.DEFAULTS.HOST_REVERSE_GEOCODER_URL + "?format=json" + "&lat=" + lat + "&lon=" + lon; - OSRM.JSONP.call( call, showReverseGeocoderResults_Target, showReverseGeocoderResults_Timeout, OSRM.DEFAULTS.JSONP_TIMEOUT, "reverse_geocoder_target" ); - } +// processing JSONP response of reverse geocoder +function processReverseGeocoderResponse_Timeout(response, parameters) { + if(parameters.do_fallback) + updateLocation(parameters.marker_id); } -//processing JSONP response of reverse geocoder -//(with wrapper functions for source/target jsonp) -function showReverseGeocoderResults_Timeout() {} -function showReverseGeocoderResults_Source(response) { showReverseGeocoderResults(OSRM.C.SOURCE_LABEL, response); } -function showReverseGeocoderResults_Target(response) { showReverseGeocoderResults(OSRM.C.TARGET_LABEL, response); } -function showReverseGeocoderResults(marker_id, response) { - if(response){ - if(response.address == undefined) - return; +function processReverseGeocoderResponse(response, parameters) { + if(!response) { + processReverseGeocoderResponse_Timeout(response, parameters); + return; + } + + if(response.address == undefined) { + processReverseGeocoderResponse_Timeout(response, parameters); + return; + } - // build reverse geocoding address - var used_address_data = 0; - var address = ""; - if( response.address.road) { - address += response.address.road; - used_address_data++; - } - if( response.address.city ) { - if( used_address_data > 0 ) - address += ", "; - address += response.address.city; - used_address_data++; - } else if( response.address.village ) { - if( used_address_data > 0 ) - address += ", "; - address += response.address.village; - used_address_data++; - } - if( used_address_data < 2 && response.address.country ) { - if( used_address_data > 0 ) - address += ", "; - address += response.address.country; - used_address_data++; - } - if( used_address_data == 0 ) - return; - - // add result to DOM - if(marker_id == OSRM.C.SOURCE_LABEL) { - document.getElementById("input-source-name").value = address; - OSRM.G.markers.route[0].dirty_move = false; - OSRM.G.markers.route[0].dirty_type = false; - } else if(marker_id == OSRM.C.TARGET_LABEL) { - document.getElementById("input-target-name").value = address; - OSRM.G.markers.route[OSRM.G.markers.route.length-1].dirty_move = false; - OSRM.G.markers.route[OSRM.G.markers.route.length-1].dirty_type = false; - } + // build reverse geocoding address + var used_address_data = 0; + var address = ""; + if( response.address.road) { + address += response.address.road; + used_address_data++; + } + if( response.address.city ) { + if( used_address_data > 0 ) + address += ", "; + address += response.address.city; + used_address_data++; + } else if( response.address.village ) { + if( used_address_data > 0 ) + address += ", "; + address += response.address.village; + used_address_data++; + } + if( used_address_data < 2 && response.address.country ) { + if( used_address_data > 0 ) + address += ", "; + address += response.address.country; + used_address_data++; + } + if( used_address_data == 0 ) { + processReverseGeocoderResponse_Timeout(response, parameters); + return; + } + // add result to DOM + if(parameters.marker_id == OSRM.C.SOURCE_LABEL && OSRM.G.markers.hasSource() ) { + document.getElementById("input-source-name").value = address; + OSRM.G.markers.route[0].dirty_move = false; + OSRM.G.markers.route[0].dirty_type = false; + } else if(parameters.marker_id == OSRM.C.TARGET_LABEL && OSRM.G.markers.hasTarget() ) { + document.getElementById("input-target-name").value = address; + OSRM.G.markers.route[OSRM.G.markers.route.length-1].dirty_move = false; + OSRM.G.markers.route[OSRM.G.markers.route.length-1].dirty_type = false; } } diff --git a/WebContent/routing.js b/WebContent/routing.js index 31f3d9764..284191814 100644 --- a/WebContent/routing.js +++ b/WebContent/routing.js @@ -379,8 +379,8 @@ function snapRoute() { for(var i=0; i