簡単に言うと、事前にレンダリングされたタイルがあるズームレベルしか表示できないということです。リーフレットは、中間のズームレベルを作成しません。
長い答えは、これを使用するには、独自のCRSスケールメソッドを定義し、それをマップに渡す必要があるということです。たとえば、次のようになります。
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);
この例では、拡張しましL.CRS.Simple
たが、もちろん、必要なAPIから任意のCRSを拡張したり、独自のCRSを最初から作成したりすることもできます。
タイルサイズの倍数ではないマップピクセルサイズになるズーム係数を使用すると、右/下端のタイルがマップデータで部分的にのみ埋められることを意味します。これは、そのようなタイルの非マップ部分を100%透明(または背景と同じ色)にすることで修正できます。
ただし、私の意見では、最小公分母(この場合は100px)に一致するようにタイルサイズを設定することをお勧めします。tileSize
タイルレイヤーのオプションを使用して、これを反映することを忘れないでください。そしてもちろん、現在使用している256x256タイルではなく、100x100ピクセルのタイルに画像を再レンダリングする必要があります。
注意点の1つとして、現在のバージョンのLeafletJS(0.5)には、TileLayerクラスが2の累乗のズームスケーリングを使用するようにハードコーディングされているため、カスタムscale()メソッドが機能しないというバグがあります。ただし、実行する必要のある変更は軽微であり、Leafletの将来のリリースで対処されることを願っています。変更TileLayer._getWrapTileNum()
するだけ:
_getWrapTileNum: function () {
// TODO refactor, limit is not valid for non-standard projections
return Math.pow(2, this._getZoomForUrl());
},
に:
_getWrapTileNum: function () {
return this._map.options.crs.scale(this._getZoomForUrl());
},