проверить, находится ли маркер внутри от маршрута - PullRequest
0 голосов
/ 24 сентября 2019

меня зовут Жуан, и я использую leaflet.js, чтобы выполнить свой проект заключительного курса в Университете Кампинас - Бразилия.Проблема, которую нужно решить: маркер должен оставаться внутри маршрута, если нет, нужно вернуть false.Кто-нибудь может мне помочь?Спасибо.

var map = L.map('map',18);

  L.tileLayer('https://{s}.tile.osm.org/{z}/{x}/{y}.png', {
    maxZoom: 20,
  }).addTo(map);

  var cont = 0;
  var marker = null;

  function refresh() {

    $.ajax({
      method: "GET",
      url: "mapa/coordenada",
      dataType: "json"
    })
      .done(function( msg ) {
        registro_coordenada(msg.coordenada);
      });
  }

  function select_cord() {

    $.ajax({
      method: "GET",
      url: "mapa/coordenada",
      dataType: "json"
    })
      .done(function( msg ) {
        add_cord(msg.coordenada);
      });
  }

  function add_cord(coordenada){
    out = coordenada.split(",");

    var control = L.Routing.control(L.extend(window.lrmConfig, {
      waypoints: [
      L.latLng(-22.5627235,-47.425501),
      L.latLng([out[0],out[1]])
  ],
      geocoder: L.Control.Geocoder.nominatim(),
      routeWhileDragging: true,
      reverseWaypoints: true,
      showAlternatives: true,
      altLineOptions: {
          styles: [
            {color: 'black', opacity: 0.15, weight: 9},
            {color: 'white', opacity: 0.8, weight: 6},
            {color: 'blue', opacity: 0.5, weight: 2}
        ]
    }
  })).addTo(map);

  L.Routing.errorControl(control).addTo(map);

  }

var icone = new L.Icon({
                      iconUrl: 'https://cdn.rawgit.com/pointhi/leaflet-color-markers/master/img/marker-icon-2x-red.png',
                      shadowUrl: 'https://cdnjs.cloudflare.com/ajax/libs/leaflet/0.7.7/images/marker-shadow.png',
                      iconSize: [25, 41],
                      iconAnchor: [12, 41],
                      popupAnchor: [1, -34],
                      shadowSize: [41, 41]
                    });


function registro_coordenada(coordenada){
  out = coordenada.split(",");
  if (cont === 0 ){
    marker = L.marker([out[0],out[1]], {icon: icone}).addTo(map).bindPopup("<b>Localização atual</b>").openPopup();
    cont = 1;
    return;
  }
  map.removeLayer(marker);
  //var marker = L.marker([out[0],out[1]]).remove(map).bindPopup("<b>Localização atual</b>").openPopup();
  marker = L.marker([out[0],out[1]], {icon: icone}).addTo(map).bindPopup("<b>Localização atual</b>").openPopup().closePopup();
}

$(document).ready(function(){
  if ($('#map')){
    self.setInterval(function () {
      refresh()
    }, 1000);
  }
  select_cord();
});

Проблема не может быть решена на GitHub

Если кто-то мне поможет, я буду очень благодарен!

1 Ответ

0 голосов
/ 25 сентября 2019

Вы не можете сделать это из-за того, как работают более мелкие детали вычислительной геометрии: поскольку точки линейной строки представлены в плавающей точке, могут быть отрезки, для которых нет (действительного) представления с плавающей точкойточек вдоль этого отрезка.

Подход, используемый здесь, состоит в том, чтобы вычислить расстояние от данной точки до заданной строки линий, а затем проверить, находится ли это расстояние в пределах порога.Таким образом, значение «внутри» меняется, становясь «не более (пороговым) расстоянием от линии».

Обратите внимание, что любой алгоритм расстояния между точками может возвращать ноль для точек, которые не на линии из-за ошибок округления с плавающей запятой (в этих случаях расстояние от точки до линии меньше точности используемого формата с плавающей запятой или ошибок с плавающей запятой, накопленных во время вычислений).

Самая известная (насколько мне известно) реализация javascript алгоритма расстояния от точки до линии - в Turf.js .

...