Вы хотите знать этот фрагмент кода из 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);
Замена недокументированных внутренних методов обычно рассматривается как грязный прием и может привести к путанице. По моему опыту, благородные программисты склонны доверять этому хаку, не понимая, как работает 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 (к сожалению).