从传单定位控件获取坐标

get coordinate from leaflet locate control

我尝试使用定位控件插件提取用户坐标以通过ajax

发送
var startMarker;
var lc = L.control.locate({
    position: "topright",
    layer: startMarker,
    drawCircle: false,
    showPopup: false,
    markerClass: L.marker,
  })
  .addTo(mymap);

当标记出现时,我点击通过ajax发送startMarker图层坐标,代码

$("button").on("click", (e) => {
  e.preventDefault();
  if (startMarker == null) {
    alert(`startpoint not defined`);
  } else {
    $.ajax({
      type: "POST",
      data: {
        startlat: startMarker.getLatLng().lat,
        startlng: startMarker.getLatLng().lng,
      },
      url: "php/find_nearest_path.php",
      dataType: "json",
      success: dosomething,
      error: function () {
        alert("failed getting respond from server");
      },
    });
  }
});

但我得到的错误是 alert(`startpoint not defined`); 现在有人知道获取坐标的正确方法吗?

当您将 startMarker 变量传递给 L.control.locatelayer 选项(来自 leaflet-locatecontrol plugin)时,它仍然是 undefined.

因此插件的行为就像您没有向该选项传递任何值一样。在这种情况下,它的默认行为是创建自己的内部图层组。

由于您似乎需要在创建的标记可用后对其进行检查,因此您只需在将变量传递给选项之前将图层组分配给变量即可:

var startMarker = L.layerGroup();
var lc = L.control.locate({
    layer: startMarker,
  })
  .addTo(mymap);

然后在您的情况下,检查该图层组是否有子标记,而不是检查分配:

var locationLayers = startMarker.getLayers();

if (locationLayers.length === 0) {
  alert(`startpoint not defined`);
} else {
  // Last position should be represented by one of the last layers
  // (there may be several layers on same position, should you
  // have enabled circle and/or compass)
  var positionMarker = locationLayers[locationLayers.length - 1];
  // Do something with positionMarker.getLatLng()...
}

话虽如此,正如 Ivan 在问题评论中隐含指出的那样,由于您似乎只需要创建的标记来获取位置坐标,因此您可以从 locationfound 事件中获取。这样,您就不需要检索任何标记。