diff --git a/WebContent/base/OSRM.Geocoder.js b/WebContent/base/OSRM.Geocoder.js index 45c2659c5..183c0b5ce 100644 --- a/WebContent/base/OSRM.Geocoder.js +++ b/WebContent/base/OSRM.Geocoder.js @@ -43,7 +43,7 @@ call: function(marker_id, query) { } // build basic request for geocoder - var call = OSRM.DEFAULTS.HOST_GEOCODER_URL + "?format=json&json_callback=%jsonp" + OSRM.DEFAULTS.GEOCODER_BOUNDS + "&accept-language="+OSRM.Localization.current_language+"&q=" + query; + var call = OSRM.DEFAULTS.HOST_GEOCODER_URL + "?format=json&json_callback=%jsonp" + OSRM.DEFAULTS.GEOCODER_BOUNDS + "&accept-language="+OSRM.Localization.current_language+"&limit=30&q=" + query; // prioritize results in currently shown mapview var bounds = OSRM.G.map.getBounds(); call += "&viewbox=" + bounds._southWest.lat + "," + bounds._northEast.lng + "," + bounds._northEast.lat + "," + bounds._southWest.lng; @@ -80,27 +80,42 @@ _showResults: function(response, parameters) { return; } + // filter/sort inputs + var filtered_response = []; + for(var i=0; i < response.length; i++){ + var result = response[i]; + if( OSRM.Geocoder._filterResult( result ) ) + continue; + filtered_response.push( result ); + } + filtered_response.sort( OSRM.Geocoder._compareResults ); + // show first result - OSRM.Geocoder._onclickResult(parameters.marker_id, response[0].lat, response[0].lon); + OSRM.Geocoder._onclickResult(parameters.marker_id, filtered_response[0].lat, filtered_response[0].lon); if( OSRM.G.markers.route.length > 1 ) // if a route is displayed, we don't need to show other possible geocoding results - return; + return; // show possible results for input var html = ""; html += ''; - for(var i=0; i < response.length; i++){ - var result = response[i]; - + for(var i=0; i < filtered_response.length; i++){ + var result = filtered_response[i]; + //odd or even ? var rowstyle='results-body-odd'; if(i%2==0) { rowstyle='results-body-even'; } html += ''; - html += ''; + if(!result.icon) + result.icon = "http://nominatim.openstreetmap.org/images/mapicons/poi_point_of_interest.glow.12.png"; + html += ''; html += '"; } @@ -108,8 +123,8 @@ _showResults: function(response, parameters) { document.getElementById('information-box-header').innerHTML = "
"+OSRM.loc("SEARCH_RESULTS")+"
" + - "
("+OSRM.loc("FOUND_X_RESULTS").replace(/%i/,response.length)+")
"; - "
(found "+response.length+" results)"+"
"; + "
("+OSRM.loc("FOUND_X_RESULTS").replace(/%i/,filtered_response.length)+")
"; + "
(found "+filtered_response.length+" results)"+"
"; document.getElementById('information-box').innerHTML = html; }, _showResults_Empty: function(parameters) { @@ -128,6 +143,45 @@ _showResults_Timeout: function() { "
"+OSRM.loc("SEARCH_RESULTS")+"
" + "
("+OSRM.loc("FOUND_X_RESULTS").replace(/%i/,0)+")
"; document.getElementById('information-box').innerHTML = "
"+OSRM.loc("TIMED_OUT")+"
"; +}, + + +// filter search results [true: result will not be displayed] +_filterResult: function(result) { + if( result.osm_type == "relation") + return true; + if( result.type == "aerial_views") + return true; + return false; +}, + + +// comparator for sorting results [higher weight: result will appear first] +_compare_class_weights: { + place: 9000, + highway: 8000, + boundary: 7000 +}, +_compare_type_weights: { + country: 13, + state: 12, + county: 11, + city: 10, + town: 9, + village: 8, + hamlet: 7, + suburb: 6, + locality: 5, + farm: 4 +}, +_compareResults: function(lhs, rhs) { + var class_values = OSRM.Geocoder._compare_class_weights; + var type_values = OSRM.Geocoder._compare_type_weights; + + var lhs_value = (-class_values[ lhs.class ] || 0) + (-type_values[ lhs.type ] || 0); + var rhs_value = (-class_values[ rhs.class ] || 0) + (-type_values[ rhs.type ] || 0); + + return (lhs_value - rhs_value); }, diff --git a/WebContent/main.css b/WebContent/main.css index d37b91ac1..25deae410 100644 --- a/WebContent/main.css +++ b/WebContent/main.css @@ -327,14 +327,14 @@ html, body { .results-body-counter { text-align:right; - vertical-align:top; + vertical-align:middle; font-weight:bold; padding:1px 5px 1px 5px; } .results-body-items { text-align:left; - vertical-align: middle; + vertical-align:top; width:100%; padding:1px; } @@ -347,6 +347,10 @@ html, body { { color:#ff0000 } +.results-body-item-remark +{ + color:#999999 +} /* style for main-output information-box -> table (driving directions) */ @@ -649,5 +653,5 @@ input[type=checkbox], .small-font { font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 9px; - font-weight: normal; -} \ No newline at end of file + font-weight: normal; +}
'+(i+1)+'.'; if(result.display_name){ - html += '
'+result.display_name+'
'; + html += '
'+result.display_name; + // debug output to show osm_type, class, type + // html += '
[osm_type: ' + result.osm_type + ', class: ' + result.class + ', type: ' + result.type + ']'; + html += '
'; } html += "