X-Git-Url: https://git.openstreetmap.org./rails.git/blobdiff_plain/bb9a8958fb5bbe630da5c4bfd592a96b259df5b3..cbf53088a2c2668077b68c62e605beb1f530d095:/app/assets/javascripts/index/directions-endpoint.js diff --git a/app/assets/javascripts/index/directions-endpoint.js b/app/assets/javascripts/index/directions-endpoint.js index b475b9a05..b9dc65748 100644 --- a/app/assets/javascripts/index/directions-endpoint.js +++ b/app/assets/javascripts/index/directions-endpoint.js @@ -42,6 +42,7 @@ OSM.DirectionsEndpoint = function Endpoint(map, input, iconUrl, dragCallback, ch setLatLng(latlng); setInputValueFromLatLng(latlng); endpoint.value = input.val(); + if (e.type === "dragend") getReverseGeocode(); dragCallback(e.type === "drag"); } @@ -56,20 +57,29 @@ OSM.DirectionsEndpoint = function Endpoint(map, input, iconUrl, dragCallback, ch } endpoint.setValue = function (value) { - endpoint.value = value; - removeLatLng(); - input.removeClass("is-invalid"); - input.val(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); + endpoint.value = endpoint.cachedReverseGeocode.value; + input.val(endpoint.value); + changeCallback(); + return; + } + + endpoint.value = value; + removeLatLng(); + input.val(value); + if (latlng) { setLatLng(latlng); setInputValueFromLatLng(latlng); + getReverseGeocode(); changeCallback(); } else if (endpoint.value) { getGeocode(); @@ -90,12 +100,29 @@ 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) { + 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)