]> git.openstreetmap.org Git - rails.git/commitdiff
Merge remote-tracking branch 'upstream/pull/5064'
authorTom Hughes <tom@compton.nu>
Sun, 2 Feb 2025 12:44:27 +0000 (12:44 +0000)
committerTom Hughes <tom@compton.nu>
Sun, 2 Feb 2025 12:44:27 +0000 (12:44 +0000)
1  2 
app/assets/javascripts/index/directions-endpoint.js
app/assets/javascripts/index/directions.js

index 2cc3ea66256488c3bbd426d31f175e3836b3c3dd,6a3cd7c269edda3a3bdbc68f7a73e0ee68fa9683..30d499ad731707b404dc1ca3448af2e215cfb7d7
@@@ -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");
    }
  
      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) {
  
        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)
      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;
  };
index 4eb0e09f46c13bbfb83edb59ae773f65d18d601c,df56771055c51db6870db4c1a016b7a4f399349e..0847318cf9440ac49d1768710a5f4a6a5db5dfe4
@@@ -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
      }));
    });
      // 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
      $("#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) {
        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);
        }
      }
  
-     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 () {