X-Git-Url: https://git.openstreetmap.org./nominatim-ui.git/blobdiff_plain/3d5062bc458e674828760ba0fe07100e3bf69e9b..e0d087f4a2b5fbc758de432f8932de296279a82f:/src/assets/js/searchpage.js?ds=sidebyside diff --git a/src/assets/js/searchpage.js b/src/assets/js/searchpage.js index 0b2ad41..be9c20a 100755 --- a/src/assets/js/searchpage.js +++ b/src/assets/js/searchpage.js @@ -1,28 +1,40 @@ -/********************************************************* -* FORWARD/REVERSE SEARCH PAGE -*********************************************************/ +// ********************************************************* +// FORWARD/REVERSE SEARCH PAGE +// ********************************************************* -function display_map_position(mouse_lat_lng){ - +function display_map_position(mouse_lat_lng) { + // if (mouse_lat_lng) { mouse_lat_lng = map.wrapLatLng(mouse_lat_lng); } - html_mouse = "mouse position " + (mouse_lat_lng ? [mouse_lat_lng.lat.toFixed(5), mouse_lat_lng.lng.toFixed(5)].join(',') : '-'); - html_click = "last click: " + (last_click_latlng ? [last_click_latlng.lat.toFixed(5),last_click_latlng.lng.toFixed(5)].join(',') : '-'); - - html_center = - "map center: " + - map.getCenter().lat.toFixed(5) + ',' + map.getCenter().lng.toFixed(5) + - " view on osm.org"; + var html_mouse = 'mouse position: -'; + if (mouse_lat_lng) { + html_mouse = 'mouse position: ' + + [mouse_lat_lng.lat.toFixed(5), mouse_lat_lng.lng.toFixed(5)].join(','); + } + var html_click = 'last click: -'; + if (last_click_latlng) { + html_click = 'last click: ' + + [last_click_latlng.lat.toFixed(5), last_click_latlng.lng.toFixed(5)].join(','); + } - html_zoom = "map zoom: " + map.getZoom(); + var html_center = 'map center: ' + + map.getCenter().lat.toFixed(5) + ',' + map.getCenter().lng.toFixed(5) + + ' view on osm.org'; - html_viewbox = "viewbox: " + map_viewbox_as_string(); + var html_zoom = 'map zoom: ' + map.getZoom(); + var html_viewbox = 'viewbox: ' + map_viewbox_as_string(); - $('#map-position-inner').html([html_center,html_zoom,html_viewbox,html_click,html_mouse].join('
')); + $('#map-position-inner').html([ + html_center, + html_zoom, + html_viewbox, + html_click, + html_mouse + ].join('
')); var center_lat_lng = map.wrapLatLng(map.getCenter()); var reverse_params = { @@ -30,58 +42,89 @@ function display_map_position(mouse_lat_lng){ lon: center_lat_lng.lng.toFixed(5) // zoom: 2, // format: 'html' - } + }; $('#switch-to-reverse').attr('href', 'reverse.html?' + $.param(reverse_params)); $('input#use_viewbox').trigger('change'); } +function init_map_on_search_page(is_reverse_search, nominatim_results, request_lat, + request_lon, init_zoom) { - - -function init_map_on_search_page(is_reverse_search, nominatim_results, request_lat, request_lon, init_zoom) { - + var attribution = get_config_value('Map_Tile_Attribution') || null; map = new L.map('map', { // center: [nominatim_map_init.lat, nominatim_map_init.lon], // zoom: nominatim_map_init.zoom, - attributionControl: (get_config_value('Map_Tile_Attribution') && get_config_value('Map_Tile_Attribution').length), - scrollWheelZoom: true, // !L.Browser.touch, - touchZoom: false, + attributionControl: (attribution && attribution.length), + scrollWheelZoom: true, // !L.Browser.touch, + touchZoom: false }); L.tileLayer(get_config_value('Map_Tile_URL'), { // moved to footer - attribution: (get_config_value('Map_Tile_Attribution') || null ) //'© OpenStreetMap contributors' + // '© OpenStreetMap contributors' + attribution: attribution }).addTo(map); // console.log(Nominatim_Config); map.setView([request_lat, request_lon], init_zoom); - var osm2 = new L.TileLayer(get_config_value('Map_Tile_URL'), {minZoom: 0, maxZoom: 13, attribution: (get_config_value('Map_Tile_Attribution') || null )}); - var miniMap = new L.Control.MiniMap(osm2, {toggleDisplay: true}).addTo(map); + var osm2 = new L.TileLayer(get_config_value('Map_Tile_URL'), { + minZoom: 0, + maxZoom: 13, + attribution: attribution + }); + new L.Control.MiniMap(osm2, { toggleDisplay: true }).addTo(map); if (is_reverse_search) { // We don't need a marker, but an L.circle instance changes radius once you zoom in/out - var cm = L.circleMarker([request_lat, request_lon], { radius: 5, weight: 2, fillColor: '#ff7800', color: 'red', opacity: 0.75, clickable: false}); + var cm = L.circleMarker( + [request_lat, request_lon], + { + radius: 5, + weight: 2, + fillColor: '#ff7800', + color: 'red', + opacity: 0.75, + zIndexOffset: 100, + clickable: false + } + ); cm.addTo(map); + } else { + var search_params = new URLSearchParams(window.location.search); + var viewbox = search_params.get('viewbox'); + if (viewbox) { + var coords = viewbox.split(','); // ,,, + var bounds = L.latLngBounds([coords[1], coords[0]], [coords[3], coords[2]]); + L.rectangle(bounds, { + color: '#69d53e', + weight: 3, + dashArray: '5 5', + opacity: 0.8, + fill: false + }).addTo(map); + } } var MapPositionControl = L.Control.extend({ options: { position: 'topright' }, - onAdd: function (map) { + onAdd: function (/* map */) { var container = L.DomUtil.create('div', 'my-custom-control'); - $(container).text('show map bounds').addClass('leaflet-bar btn btn-sm btn-default').on('click', function(e){ - e.preventDefault(); - e.stopPropagation(); - $('#map-position').show(); - $(container).hide(); - }); - $('#map-position-close a').on('click', function(e){ + $(container).text('show map bounds') + .addClass('leaflet-bar btn btn-sm btn-outline-secondary') + .on('click', function (e) { + e.preventDefault(); + e.stopPropagation(); + $('#map-position').show(); + $(container).hide(); + }); + $('#map-position-close a').on('click', function (e) { e.preventDefault(); e.stopPropagation(); $('#map-position').hide(); @@ -98,51 +141,58 @@ function init_map_on_search_page(is_reverse_search, nominatim_results, request_l - function update_viewbox_field(){ + function update_viewbox_field() { // hidden HTML field - $('input[name=viewbox]').val( $('input#use_viewbox').prop('checked') ? map_viewbox_as_string() : ''); + $('input[name=viewbox]') + .val($('input#use_viewbox') + .prop('checked') ? map_viewbox_as_string() : ''); } - map.on('move', function(e) { + map.on('move', function () { display_map_position(); update_viewbox_field(); }); - map.on('mousemove', function(e) { + map.on('mousemove', function (e) { display_map_position(e.latlng); }); - map.on('click', function(e) { + map.on('click', function (e) { last_click_latlng = e.latlng; display_map_position(); }); - map.on('load', function(e){ + map.on('load', function () { display_map_position(); }); - - $('input#use_viewbox').on('change', function(){ + $('input#use_viewbox').on('change', function () { update_viewbox_field(); }); - - - - function get_result_element(position){ + function get_result_element(position) { return $('.result').eq(position); } - function marker_for_result(result){ - return L.marker([result.lat,result.lon], {riseOnHover:true,title:result.name }); - } - function circle_for_result(result){ - return L.circleMarker([result.lat,result.lon], { radius: 10, weight: 2, fillColor: '#ff7800', color: 'blue', opacity: 0.75, clickable: !is_reverse_search}); + // function marker_for_result(result) { + // return L.marker([result.lat, result.lon], { riseOnHover: true, title: result.name }); + // } + function circle_for_result(result) { + var cm_style = { + radius: 10, + weight: 2, + fillColor: '#ff7800', + color: 'blue', + opacity: 0.75, + clickable: !is_reverse_search + }; + return L.circleMarker([result.lat, result.lon], cm_style); } - var layerGroup = new L.layerGroup().addTo(map); - function highlight_result(position, bool_focus){ + var layerGroup = (new L.layerGroup()).addTo(map); + + function highlight_result(position, bool_focus) { var result = nominatim_results[position]; - if (!result){ return } + if (!result) { return; } var result_el = get_result_element(position); $('.result').removeClass('highlight'); @@ -150,26 +200,29 @@ function init_map_on_search_page(is_reverse_search, nominatim_results, request_l layerGroup.clearLayers(); - if (result.lat){ + if (result.lat) { var circle = circle_for_result(result); - circle.on('click', function(){ + circle.on('click', function () { highlight_result(position); }); - layerGroup.addLayer(circle); + layerGroup.addLayer(circle); } - if (result.boundingbox){ - var bounds = [[result.boundingbox[0]*1,result.boundingbox[2]*1], [result.boundingbox[1]*1,result.boundingbox[3]*1]]; - map.fitBounds(bounds); - - if (result.geojson && result.geojson.type.match(/(Polygon)|(Line)/) ){ + if (result.boundingbox) { + var bbox = [ + [result.boundingbox[0] * 1, result.boundingbox[2] * 1], + [result.boundingbox[1] * 1, result.boundingbox[3] * 1] + ]; + map.fitBounds(bbox); + if (result.geojson && result.geojson.type.match(/(Polygon)|(Line)/)) { + // var geojson_layer = L.geoJson( parse_and_normalize_geojson_string(result.geojson), { // https://leafletjs.com/reference-1.0.3.html#path-option - style: function(feature) { - return { interactive: false, color: 'blue' }; + style: function (/* feature */) { + return { interactive: false, color: 'blue' }; } } ); @@ -179,41 +232,42 @@ function init_map_on_search_page(is_reverse_search, nominatim_results, request_l // var layer = L.rectangle(bounds, {color: "#ff7800", weight: 1} ); // layerGroup.addLayer(layer); // } - } - else { + } else { var result_coord = L.latLng(result.lat, result.lon); - if ( result_coord ){ - if ( is_reverse_search ){ + if (result_coord) { + if (is_reverse_search) { // console.dir([result_coord, [request_lat, request_lon]]); // make sure the search coordinates are in the map view as well - map.fitBounds([result_coord, [request_lat, request_lon]], {padding: [50,50], maxZoom: map.getZoom()}); - - // better, but causes a leaflet warning - // map.panInsideBounds([[result.lat,result.lon], [nominatim_map_init.lat,nominatim_map_init.lon]], {animate: false}); - } - else { + map.fitBounds( + [result_coord, [request_lat, request_lon]], + { + padding: [50, 50], + maxZoom: map.getZoom() + } + ); + } else { map.panTo(result_coord, result.zoom || get_config_value('Map_Default_Zoom')); } } } - if (bool_focus){ + if (bool_focus) { $('#map').focus(); } } - $('.result').on('click', function(e){ + $('.result').on('click', function () { highlight_result($(this).data('position'), true); }); - if ( is_reverse_search ){ - map.on('click', function(e){ - $('form input[name=lat]').val( e.latlng.lat); - $('form input[name=lon]').val( e.latlng.wrap().lng); + if (is_reverse_search) { + map.on('click', function (e) { + $('form input[name=lat]').val(e.latlng.lat); + $('form input[name=lon]').val(e.latlng.wrap().lng); $('form').submit(); }); - $('#switch-coords').on('click', function(e){ + $('#switch-coords').on('click', function (e) { e.preventDefault(); e.stopPropagation(); var lat = $('form input[name=lat]').val(); @@ -227,30 +281,22 @@ function init_map_on_search_page(is_reverse_search, nominatim_results, request_l highlight_result(0, false); // common mistake is to copy&paste latitude and longitude into the 'lat' search box - $('form input[name=lat]').on('change', function(){ - var coords = $(this).val().split(','); - if (coords.length == 2) { - $(this).val(L.Util.trim(coords[0])); - $(this).siblings('input[name=lon]').val(L.Util.trim(coords[1])); + $('form input[name=lat]').on('change', function () { + var coords_split = $(this).val().split(','); + if (coords_split.length === 2) { + $(this).val(L.Util.trim(coords_split[0])); + $(this).siblings('input[name=lon]').val(L.Util.trim(coords_split[1])); } }); -}; - - - - - +} -jQuery(document).ready(function(){ - if ( !$('#search-page,#reverse-page').length ){ return; } - - var is_reverse_search = !!( $('#reverse-page').length ); - var endpoint = is_reverse_search ? 'reverse' : 'search'; +function search_page_load() { + var is_reverse_search = window.location.pathname.match(/reverse/); - var search_params = new URLSearchParams(location.search); + var search_params = new URLSearchParams(window.location.search); // return view('search', [ // 'sQuery' => $sQuery, @@ -262,28 +308,32 @@ jQuery(document).ready(function(){ // 'sApiURL' => $url // ]); + var api_request_params; + var context; if (is_reverse_search) { - var api_request_params = { - // lat: typeof(search_params.get('lat') !== 'undefined') ? search_params.get('lat') : get_config_value('Map_Default_Lat'), - // lon: typeof(search_params.get('lon') !== 'undefined') ? search_params.get('lon') : get_config_value('Map_Default_Lon'), + api_request_params = { lat: search_params.get('lat'), lon: search_params.get('lon'), - zoom: (search_params.get('zoom') !== null ? search_params.get('zoom') : get_config_value('Reverse_Default_Search_Zoom')), + zoom: (search_params.get('zoom') > 1 + ? search_params.get('zoom') + : get_config_value('Reverse_Default_Search_Zoom')), format: 'jsonv2' - } + }; - var context = { + context = { // aPlace: aPlace, fLat: api_request_params.lat, fLon: api_request_params.lon, - iZoom: (search_params.get('zoom') !== null ? api_request_params.zoom : get_config_value('Reverse_Default_Search_Zoom')) + iZoom: (search_params.get('zoom') > 1 + ? api_request_params.zoom + : get_config_value('Reverse_Default_Search_Zoom')) }; - + update_html_title(); if (api_request_params.lat && api_request_params.lon) { - fetch_from_api('reverse', api_request_params, function(aPlace){ + fetch_from_api('reverse', api_request_params, function (aPlace) { if (aPlace.error) { aPlace = null; @@ -292,42 +342,96 @@ jQuery(document).ready(function(){ context.aPlace = aPlace; render_template($('main'), 'reversepage-template', context); - - init_map_on_search_page(is_reverse_search, [aPlace], api_request_params.lat, api_request_params.lon, api_request_params.zoom); + update_html_title('Reverse result for ' + + api_request_params.lat + + ',' + + api_request_params.lon); + + init_map_on_search_page( + is_reverse_search, + [aPlace], + api_request_params.lat, + api_request_params.lon, + api_request_params.zoom + ); update_data_date(); }); } else { render_template($('main'), 'reversepage-template', context); - init_map_on_search_page(is_reverse_search, [], get_config_value('Map_Default_Lat'), get_config_value('Map_Default_Lon'), get_config_value('Map_Default_Zoom')); + init_map_on_search_page( + is_reverse_search, + [], + get_config_value('Map_Default_Lat'), + get_config_value('Map_Default_Lon'), + get_config_value('Map_Default_Zoom') + ); } } else { - var api_request_params = { + api_request_params = { q: search_params.get('q'), - polygon_geojson: search_params.get('polygon_geojson') ? 1 : 0, + street: search_params.get('street'), + city: search_params.get('city'), + county: search_params.get('county'), + state: search_params.get('state'), + country: search_params.get('country'), + postalcode: search_params.get('postalcode'), + polygon_geojson: get_config_value('Search_AreaPolygons', false) ? 1 : 0, viewbox: search_params.get('viewbox'), + exclude_place_ids: search_params.get('exclude_place_ids'), format: 'jsonv2' }; - var context = { - // aSearchResults: aResults, + context = { sQuery: api_request_params.q, - sViewBox: '', - env: Nominatim_Config, - sMoreURL: '' + sViewBox: search_params.get('viewbox'), + env: {} }; - if (api_request_params.q) { + if (api_request_params.street || api_request_params.city || api_request_params.county + || api_request_params.state || api_request_params.country || api_request_params.postalcode) { + context.hStructured = { + street: api_request_params.street, + city: api_request_params.city, + county: api_request_params.county, + state: api_request_params.state, + country: api_request_params.country, + postalcode: api_request_params.postalcode + }; + } - fetch_from_api('search', api_request_params, function(aResults){ + if (api_request_params.q || context.hStructured) { + + fetch_from_api('search', api_request_params, function (aResults) { context.aSearchResults = aResults; - render_template($('main'), 'searchpage-template', context); + if (aResults.length >= 10) { + var aExcludePlaceIds = []; + if (search_params.has('exclude_place_ids')) { + aExcludePlaceIds.search_params.get('exclude_place_ids').split(','); + } + for (var i = 0; i < aResults.length; i += 1) { + aExcludePlaceIds.push(aResults[i].place_id); + } - init_map_on_search_page(is_reverse_search, aResults, get_config_value('Map_Default_Lat'), get_config_value('Map_Default_Lon'), get_config_value('Map_Default_Zoom')); + var parsed_url = new URLSearchParams(window.location.search); + parsed_url.set('exclude_place_ids', aExcludePlaceIds.join(',')); + context.sMoreURL = '?' + parsed_url.toString(); + } + + render_template($('main'), 'searchpage-template', context); + update_html_title('Result for ' + api_request_params.q); + + init_map_on_search_page( + is_reverse_search, + aResults, + get_config_value('Map_Default_Lat'), + get_config_value('Map_Default_Lon'), + get_config_value('Map_Default_Zoom') + ); $('#q').focus(); @@ -336,13 +440,15 @@ jQuery(document).ready(function(){ } else { render_template($('main'), 'searchpage-template', context); - init_map_on_search_page(is_reverse_search, [], get_config_value('Map_Default_Lat'), get_config_value('Map_Default_Lon'), get_config_value('Map_Default_Zoom')); + init_map_on_search_page( + is_reverse_search, + [], + get_config_value('Map_Default_Lat'), + get_config_value('Map_Default_Lon'), + get_config_value('Map_Default_Zoom') + ); } - - } -}); - - +}