验证标记是否位于路线

时间:2019-09-24 19:14:51

标签: javascript dictionary leaflet leaflet-routing-machine

我的名字叫João,我正在使用leaflet.js在巴西坎皮纳斯大学完成我的结业课程项目。要解决的问题是:标记需要留在路线内,如果不需要,则返回假。有人能帮我吗?谢谢。

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 :(得分:0)

您无法执行此操作,因为计算几何如何工作的更精细的细节:由于线串的点以浮点表示,因此可能存在没有(有效)浮点表示的线段该段中的点数。

此处采取的方法是计算从给定点到给定线串的距离,然后检查该距离是否在阈值内。因此,“内部”的含义发生了变化,变为“与线的距离不超过(阈值)距离。”

请注意,由于浮点舍入误差(在这种情况下,从点到点的距离),任何点到线的距离算法对于在线上不是的点都可能返回零。行小于使用的浮点格式的精度或计算过程中累积的浮点错误。

(据我所知)距离点到线串距离算法的最著名的javascript实现是the one in Turf.js