Krótka odpowiedź brzmi, że można pokazać tylko poziomów powiększenia do których masz pre-renderowanych płytek. Ulotka nie utworzy dla Ciebie pośrednich poziomów powiększenia.
Długa odpowiedź jest, że aby wykorzystać to zrobić, trzeba zdefiniować własną metodę skali CRS i przekazać je do mapy, na przykład:
L.CRS.CustomZoom = L.extend({}, L.CRS.Simple, {
scale: function (zoom) {
// This method should return the tile grid size
// (which is always square) for a specific zoom
// We want 0 = 200px = 2 tiles @ 100x100px,
// 1 = 300px = 3 tiles @ 100x100px, etc.
// Ie.: (200 + zoom*100)/100 => 2 + zoom
return 2 + zoom;
}
});
var map = L.map('map', { crs: L.CRS.CustomZoom }).setView([0, 0], 0);
W tym przykładzie, mam przedłużony L.CRS.Simple
, ale możesz oczywiście rozszerzyć dowolny CRS z interfejsu API, który chcesz, lub nawet stworzyć własny od zera.
Używanie współczynnika powiększenia, który powoduje, że piksel mapy nie jest wielokrotnością twoich kafelków, oznacza, że twoje prawe/dolne krawędzie są tylko częściowo wypełnione danymi mapy. Można to naprawić, czyniąc część niepowiązaną z mapą takich płytek w 100% przezroczystą (lub tym samym kolorem co tło).
Jednak moim zdaniem znacznie lepszym pomysłem jest ustawienie płytek tak, aby pasowały do najniższego wspólnego mianownika, w tym przypadku 100px. Pamiętaj, aby to odzwierciedlić, używając opcji tileSize
w swojej warstwie kafli. Oczywiście konieczne będzie ponowne renderowanie obrazu na płytki o wymiarach 100x100 pikseli zamiast obecnie używanych płytek 256x256.
Jedna uwaga, aktualna wersja LeafletJS (0.5) ma błąd, który uniemożliwia działanie niestandardowej metody scale(), ponieważ klasa TileLayer jest na stałe zakodowana z wykorzystaniem skalowania zoomu mocy. Jednak zmiana, którą musisz zrobić, jest niewielka i mam nadzieję, że zostanie to rozwiązane w przyszłym wydaniu ulotki. Wystarczy zmienić TileLayer._getWrapTileNum()
od:
_getWrapTileNum: function() {
// TODO refactor, limit is not valid for non-standard projections
return Math.pow(2, this._getZoomForUrl());
},
Do:
_getWrapTileNum: function() {
return this._map.options.crs.scale(this._getZoomForUrl());
},
Jeśli nie masz pre świadczonych płytki na każdym poziomie powiększenia, można Ulotka jakoś stosować wyższe płytki poziom powiększenia i skalować je i korzystać z tych? Nawet gdyby były nieco pikselizowane? –