如何在 crs.simple 中测量距离?

How to measure distance in crs.simple?

我有一张非地理地图,也就是平面图像,使用 CRS.Simple 通过自定义转换扩展。到目前为止一切正常,但现在我想添加一个距离测量按钮。我有信心自己可以实现两个标记之间的距离测量,但是动态画线和测量仍然有点超出我的技能,所以我希望我能使用一个插件。 None 我发现的,确实提供了这个。在查看传单的插件页面后,我尝试了这个分支 https://github.com/aprilandjan/leaflet.measure of leaflet.measure originally by https://github.com/jtreml/leaflet.measure,因为它似乎提供了添加自定义单位的能力——在我的例子中是像素。

我添加了这个:

L.control.measure({
    //  distance formatter, output mile instead of km
    formatDistance: function (val) {
      return Math.round(1000 * val / scaleFactor) / 1000 + 'mapUnits';
    }
  }).addTo(map)

不幸的是,与地图的像素大小 (4096x4096) 相比,结果是一个太大的数字。 distance() returns 预期的 1414.213562373095 在点 1000,1000 和点 2000,2000 之间。而是计算 distanctTo returns 8009572.105082839。我在我的文件开头使用这个

var yx = L.latLng;
var xy = function(x, y) {
  if (L.Util.isArray(x)) { // When doing xy([x, y]);
    return yx(x[1], x[0]);
  }
  return yx(y, x); // When doing xy(x, y);
};

如果我将 val 登录到控制台,我会得到如下信息:

20411385.176805027
7118674.47741132
20409736.502863288
7117025.8034695815
20409186.004645467
20409736.502863288

这可能是函数在没有适当参考系统的情况下尝试计算经纬度的问题。 任何人都知道如何解决这个问题?感觉应该不会太难,但是又不知道从何下手。

我找到了一种方法,尽管感觉有点'hacky': 我替换了行

var distance = e.latlng.distanceTo(this._lastPoint)

_mouseMove 和 leaflet.measure 的 _mouseClick 事件中

  var currentPoint = e.latlng;                                                      
  var lastPoint = this._lastPoint;
  var distance = map.distance(currentPoint, lastPoint); 

作为 map returns 米的 distance() 方法,或者在平面图像的情况下,像素值。那些我们可以在我们的平面图像中以我们想要的任何单位翻译。

如果有人有更优雅的方法,我洗耳恭听!