Merge remote-tracking branch 'upstream/pull/5064'

This commit is contained in:
Tom Hughes 2025-02-02 12:44:27 +00:00
commit 8f7f02b025
2 changed files with 59 additions and 12 deletions

View file

@ -36,9 +36,13 @@ OSM.DirectionsEndpoint = function Endpoint(map, input, iconUrl, dragCallback, ch
function markerDragListener(e) {
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 @@ OSM.DirectionsEndpoint = function Endpoint(map, input, iconUrl, dragCallback, ch
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(); // <sw lon>,<sw lat>,<ne lon>,<ne lat>
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 @@ OSM.DirectionsEndpoint = function Endpoint(map, input, iconUrl, dragCallback, ch
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)

View file

@ -65,10 +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
}));
});
@ -282,16 +281,14 @@ OSM.Directions = function (map) {
pt.y += 20;
var ll = map.containerPointToLatLng(pt);
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 +298,10 @@ OSM.Directions = function (map) {
}
}
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 () {