编辑非地理地图中的比例尺

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了编辑非地理地图中的比例尺相关的知识,希望对你有一定的参考价值。

我正在Leaflet中制作非地理地图。由于坐标是笛卡儿式的,没有地理参考,所以不应该是这样的。m 缺省情况如下(我已经禁用了比例栏中的英制单位)。

enter image description here

有什么办法可以将 100 m100 在刻度条中,甚至可以替换 m 用其他东西?

答案

你要注意的是 这段代码来自Leaflet的 L.Control.Scale:

_updateMetric: function (maxMeters) 
    var meters = this._getRoundNum(maxMeters),
        label = meters < 1000 ? meters + ' m' : (meters / 1000) + ' km';

    this._updateScale(this._mScale, label, meters / maxMeters);
,

现在,为了改变这种行为,有一个丑陋的黑客方法和一个比较干净的方法。

丑陋的方法是用(私密的,没有文件的)替代 _updateMetric 方法中的任何一个方法。样板 或者 L.Control.Scale,例如:

L.Control.Scale.prototype._updateMetric = function (maxMeters) 
    var meters = this._getRoundNum(maxMeters),
        label = meters + ' units';

    this._updateScale(this._mScale, label, meters / maxMeters);
;
var myScaleControl = L.control.scale().addTo(map);

var myScaleControl = L.control.scale();
myScaleControl._updateMetric = function (maxMeters) 
    var meters = this._getRoundNum(maxMeters),
        label = meters + ' units';

    this._updateScale(this._mScale, label, meters / maxMeters);
;
myScaleControl.addTo(map);

替换非文档化的内部方法通常被视为肮脏的hack,并可能导致混乱。根据我的经验,贵族程序员往往会在不了解JS原型继承工作原理的情况下,相信这个黑客。

"更干净一点 "的方法是将其改为 Leaflet的子类控件教程的子类,然后创建一个 L.Control.Scale,例如:。

L.Control.MeterlessScale = L.Control.Scale.extend(
    _updateMetric: function (maxMeters) 
        var meters = this._getRoundNum(maxMeters),
            label = meters + ' units';

        this._updateScale(this._mScale, label, meters / maxMeters);
    
);

var scale = (new L.Control.MeterlessScale()).addTo(map);

不应害怕阅读Leaflet的源代码。同时,在跳入之前,请先阅读JS原型继承,阅读Leaflet自己的教程。


也确实是这样的。distance 方式 L.CRS假定的 返回以米为单位的距离,并且不能告知任何呼叫者该CRS的单位;因此。L.Control.Scale 假设 的距离是以米为单位的。从架构上讲,根据CRS,没有一个好的简单的方法来抽象距离单位(很遗憾)。

以上是关于编辑非地理地图中的比例尺的主要内容,如果未能解决你的问题,请参考以下文章

墨卡托投影地理坐标系地面分辨率地图比例尺

墨卡托投影地理坐标系地面分辨率地图比例尺Bing Maps Tile System

怎么使用supermap统计面积

为地理编码结果自动寻找合适的缩放比例

如何将地理坐标转换为固定比例的像素?

地图比例尺与高德地图中的缩放级别(0-20)的映射关系与转换方法