Редактирование масштабной линейки на негеографических c картах - PullRequest
2 голосов
/ 29 мая 2020

Я работаю над негеографическими c картами в Leaflet. Поскольку координаты декартовы без географической привязки c, по умолчанию они не должны быть m следующим образом (я отключил британские единицы на шкале масштаба):

enter image description here

Есть ли какое-либо решение для преобразования 100 m в 100 на шкале масштаба или даже замены m на что-то другое?

1 Ответ

1 голос
/ 29 мая 2020

Вы хотите знать этот фрагмент кода из 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 (к сожалению).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...