Merge remote-tracking branch 'upstream/pull/5064'
This commit is contained in:
commit
8f7f02b025
2 changed files with 59 additions and 12 deletions
|
@ -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)
|
||||
|
|
|
@ -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 () {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue