From: Tom Hughes Date: Sun, 2 Feb 2025 12:44:27 +0000 (+0000) Subject: Merge remote-tracking branch 'upstream/pull/5064' X-Git-Tag: live~205 X-Git-Url: https://git.openstreetmap.org./rails.git/commitdiff_plain/8f7f02b025f59db466fdb22ea3686cb6c5adc400?ds=sidebyside;hp=-c Merge remote-tracking branch 'upstream/pull/5064' --- 8f7f02b025f59db466fdb22ea3686cb6c5adc400 diff --combined app/assets/javascripts/index/directions-endpoint.js index 2cc3ea662,6a3cd7c26..30d499ad7 --- a/app/assets/javascripts/index/directions-endpoint.js +++ b/app/assets/javascripts/index/directions-endpoint.js @@@ -34,11 -34,15 +34,15 @@@ OSM.DirectionsEndpoint = function Endpo }; function markerDragListener(e) { - var latlng = convertLatLngToZoomPrecision(e.target.getLatLng()); + const latlng = L.latLng(OSM.cropLocation(e.target.getLatLng(), map.getZoom())); + if (endpoint.geocodeRequest) endpoint.geocodeRequest.abort(); + delete endpoint.geocodeRequest; + setLatLng(latlng); setInputValueFromLatLng(latlng); endpoint.value = input.val(); + if (e.type === "dragend") getReverseGeocode(); dragCallback(e.type === "drag"); } @@@ -52,26 -56,54 +56,54 @@@ endpoint.setValue(value); } - endpoint.setValue = function (value, latlng) { + endpoint.setValue = function (value) { + if (endpoint.geocodeRequest) endpoint.geocodeRequest.abort(); + delete endpoint.geocodeRequest; + input.removeClass("is-invalid"); + + var coordinatesMatch = value.match(/^\s*([+-]?\d+(?:\.\d*)?)(?:\s+|\s*[/,]\s*)([+-]?\d+(?:\.\d*)?)\s*$/); + var latlng = coordinatesMatch && L.latLng(coordinatesMatch[1], coordinatesMatch[2]); + + if (latlng && endpoint.cachedReverseGeocode && endpoint.cachedReverseGeocode.latlng.equals(latlng)) { + setLatLng(latlng); + if (endpoint.cachedReverseGeocode.notFound) { + endpoint.value = value; + input.addClass("is-invalid"); + } else { + endpoint.value = endpoint.cachedReverseGeocode.value; + } + input.val(endpoint.value); + changeCallback(); + return; + } + endpoint.value = value; removeLatLng(); - input.removeClass("is-invalid"); input.val(value); if (latlng) { setLatLng(latlng); setInputValueFromLatLng(latlng); + getReverseGeocode(); changeCallback(); } else if (endpoint.value) { getGeocode(); } }; + endpoint.swapCachedReverseGeocodes = function (otherEndpoint) { + var g0 = endpoint.cachedReverseGeocode; + var g1 = otherEndpoint.cachedReverseGeocode; + delete endpoint.cachedReverseGeocode; + delete otherEndpoint.cachedReverseGeocode; + if (g0) otherEndpoint.cachedReverseGeocode = g0; + if (g1) endpoint.cachedReverseGeocode = g1; + }; + function getGeocode() { var viewbox = map.getBounds().toBBoxString(); // ,,, var geocodeUrl = OSM.NOMINATIM_URL + "search?q=" + encodeURIComponent(endpoint.value) + "&format=json&viewbox=" + viewbox; - if (endpoint.geocodeRequest) endpoint.geocodeRequest.abort(); endpoint.geocodeRequest = $.getJSON(geocodeUrl, function (json) { delete endpoint.geocodeRequest; if (json.length === 0) { @@@ -82,12 -114,30 +114,30 @@@ setLatLng(L.latLng(json[0])); + endpoint.value = json[0].display_name; input.val(json[0].display_name); changeCallback(); }); } + function getReverseGeocode() { + var latlng = endpoint.latlng.clone(); + var reverseGeocodeUrl = OSM.NOMINATIM_URL + "reverse?lat=" + latlng.lat + "&lon=" + latlng.lng + "&format=json"; + + endpoint.geocodeRequest = $.getJSON(reverseGeocodeUrl, function (json) { + delete endpoint.geocodeRequest; + if (!json || !json.display_name) { + endpoint.cachedReverseGeocode = { latlng: latlng, notFound: true }; + return; + } + + endpoint.value = json.display_name; + input.val(json.display_name); + endpoint.cachedReverseGeocode = { latlng: latlng, value: endpoint.value }; + }); + } + function setLatLng(ll) { input .attr("data-lat", ll.lat) @@@ -109,5 -159,11 +159,5 @@@ input.val(latlng.lat + ", " + latlng.lng); } - function convertLatLngToZoomPrecision(latlng) { - var precision = OSM.zoomPrecision(map.getZoom()); - - return L.latLng(latlng.lat.toFixed(precision), latlng.lng.toFixed(precision)); - } - return endpoint; }; diff --combined app/assets/javascripts/index/directions.js index 4eb0e09f4,df5677105..0847318cf --- a/app/assets/javascripts/index/directions.js +++ b/app/assets/javascripts/index/directions.js @@@ -65,10 -65,9 +65,9 @@@ OSM.Directions = function (map) if (coordTo) { routeTo = coordTo.lat + "," + coordTo.lng; } + endpoints[0].swapCachedReverseGeocodes(endpoints[1]); OSM.router.route("/directions?" + Qs.stringify({ - from: $("#route_to").val(), - to: $("#route_from").val(), route: routeTo + ";" + routeFrom })); }); @@@ -116,14 -115,18 +115,14 @@@ // Cancel any route that is already in progress if (routeRequest) routeRequest.abort(); - var o = endpoints[0].latlng, - d = endpoints[1].latlng; + const points = endpoints.map(p => p.latlng); - if (!o || !d) return; + if (!points[0] || !points[1]) return; $("header").addClass("closed"); - var precision = OSM.zoomPrecision(map.getZoom()); - OSM.router.replace("/directions?" + Qs.stringify({ engine: chosenEngine.id, - route: o.lat.toFixed(precision) + "," + o.lng.toFixed(precision) + ";" + - d.lat.toFixed(precision) + "," + d.lng.toFixed(precision) + route: points.map(p => OSM.cropLocation(p, map.getZoom()).join()).join(";") })); // copy loading item to sidebar and display it. we copy it, rather than @@@ -132,7 -135,7 +131,7 @@@ $("#sidebar_content").html($(".directions_form .loader_copy").html()); map.setSidebarOverlaid(false); - routeRequest = chosenEngine.getRoute([o, d], function (err, route) { + routeRequest = chosenEngine.getRoute(points, function (err, route) { routeRequest = null; if (err) { @@@ -281,17 -284,16 +280,15 @@@ var pt = L.DomEvent.getMousePosition(oe, map.getContainer()); // co-ordinates of the mouse pointer at present pt.y += 20; var ll = map.containerPointToLatLng(pt); - var precision = OSM.zoomPrecision(map.getZoom()); - var value = ll.lat.toFixed(precision) + ", " + ll.lng.toFixed(precision); - endpoints[type === "from" ? 0 : 1].setValue(value); + const llWithPrecision = OSM.cropLocation(ll, map.getZoom()); - endpoints[type === "from" ? 0 : 1].setValue(llWithPrecision.join(", "), llWithPrecision); ++ endpoints[type === "from" ? 0 : 1].setValue(llWithPrecision.join(", ")); }); endpoints[0].enable(); endpoints[1].enable(); var params = Qs.parse(location.search.substring(1)), - route = (params.route || "").split(";"), - from = route[0] && L.latLng(route[0].split(",")), - to = route[1] && L.latLng(route[1].split(",")); + route = (params.route || "").split(";"); if (params.engine) { var engineIndex = findEngine(params.engine); @@@ -301,10 -303,10 +298,10 @@@ } } - endpoints[0].setValue(params.from || "", from); - endpoints[1].setValue(params.to || "", to); + endpoints[0].setValue(params.from || route[0] || ""); + endpoints[1].setValue(params.to || route[1] || ""); - map.setSidebarOverlaid(!from || !to); + map.setSidebarOverlaid(!endpoints[0].latlng || !endpoints[1].latlng); }; page.load = function () {