编辑非地理地图中的比例尺
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了编辑非地理地图中的比例尺相关的知识,希望对你有一定的参考价值。
我正在Leaflet中制作非地理地图。由于坐标是笛卡儿式的,没有地理参考,所以不应该是这样的。m
缺省情况如下(我已经禁用了比例栏中的英制单位)。
有什么办法可以将 100 m
到 100
在刻度条中,甚至可以替换 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,没有一个好的简单的方法来抽象距离单位(很遗憾)。
以上是关于编辑非地理地图中的比例尺的主要内容,如果未能解决你的问题,请参考以下文章