世界の測量

Sibling of "Relevant, Timely, and Accurate, " but much lighter and shorter ※自らの所属する組織の見解を示すものでない

Leaflet, Modest Maps, mapbox.js での電子国土画像タイルの表現方法

Leaflet, Modest Maps, mapbox.js で電子国土画像タイルを表示してみた。OpenLayers はオリジナルの電子国土Webシステムが使用しているので割愛している。

それぞれについて、電子国土画像タイルレイヤを記載する方法を抽出してみると、次のとおり。

Leaflet

独自拡張のテンプレート表現で無理やり L.TileLayer を作ったあと、L.TileLayer#getTileUrl をモンキーパッチするイメージだ。比較的ダーティなやり方だと思う。

    var l = L.tileLayer('http://cyberjapandata.gsi.go.jp/sqras/all/{did}/latest/{z}/{X0}{Y0}/{X1}{Y1}/{X2}{Y2}/{X3}{Y3}/{X4}{Y4}/{X5}{Y5}/{tid}.png', {maxZoom: 18, attribution: '<a tatrget="_blank" href="http://cyberjapan.jp/"><img src="http://cyberjapan.jp/image/logo.gif"/></a>'});
    l.getTileUrl = function (e) {
      this._adjustTilePoint(e);
      var tid = ('0000000' + e.x).slice(-7) + ('0000000' + e.y).slice(-7);
      return  L.Util.template(this._url, L.Util.extend({
          did: {
		        5: "RELIEF",
		        6: "RELIEF",
		        7: "RELIEF",
		        8: "RELIEF",
		        9: "BAFD1000K",
		        10: "BAFD1000K",
		        11: "BAFD1000K",
		        12: "BAFD200K",
		        13: "BAFD200K",
		        14: "BAFD200K",
		        15: "DJBMM",
		        16: "DJBMM",
		        17: "DJBMM",
            18: 'FGD'
	        }[this._getZoomForUrl()],
          z: this._getZoomForUrl(),
          x: e.x,
          y: e.y,
          tid: tid,
          X0: tid.charAt(0),
          X1: tid.charAt(1),
          X2: tid.charAt(2),
          X3: tid.charAt(3),
          X4: tid.charAt(4),
          X5: tid.charAt(5),
          X6: tid.charAt(6),
          Y0: tid.charAt(7),
          Y1: tid.charAt(8),
          Y2: tid.charAt(9),
          Y3: tid.charAt(10),
          Y4: tid.charAt(11),
          Y5: tid.charAt(12),
          Y6: tid.charAt(13),
        },this.options));}
    l.addTo(map);

via 電子国土リフ

Modest Maps

MM.MapProvider が、タイルの column, row, zoom から URL を算出する関数をコンストラクタの引数として取ってくれる。比較的クリーンなやり方である。

    var layer = new MM.Layer(new MM.MapProvider(function(coord) {
      var did = [null, null, null, null, null, 
                 'RELIEF', 'RELIEF', 'RELIEF', 'RELIEF',
                 'BAFD1000K', 'BAFD1000K', 'BAFD1000K',
                 'BAFD200K', 'BAFD200K', 'BAFD200K',
                 'DJBMM', 'DJBMM', 'DJBMM', 'FGD'][coord.zoom];
      var tid = ('0000000' + coord.column).slice(-7) + 
                ('0000000' + coord.row).slice(-7);
      var url = 'http://cyberjapandata.gsi.go.jp/sqras/all/' + did + 
        '/latest/' + coord.zoom + 
        '/' + tid.charAt(0) + tid.charAt(7) +
        '/' + tid.charAt(1) + tid.charAt(8) +
        '/' + tid.charAt(2) + tid.charAt(9) +
        '/' + tid.charAt(3) + tid.charAt(10) +
        '/' + tid.charAt(4) + tid.charAt(11) +
        '/' + tid.charAt(5) + tid.charAt(12) +
        '/' + tid + '.png';
      return url;
    }));

via 電子国土MODS

mapbox.js

実は、このレイヤでは Modest Maps をそのままつかっているので、やりかたは Modest Maps と全く同じ。なお、メソッドの中で、定数的な役割を持っている did を宣言するのはちょっと気持ち悪い。JavaScript 処理系がうまくくくりだしてくれるといいけれども。

    var layer = new MM.Layer(new MM.MapProvider(function(coord) {
      var did = [null, null, null, null, null, 
                 'RELIEF', 'RELIEF', 'RELIEF', 'RELIEF',
                 'BAFD1000K', 'BAFD1000K', 'BAFD1000K',
                 'BAFD200K', 'BAFD200K', 'BAFD200K',
                 'DJBMM', 'DJBMM', 'DJBMM', 'FGD'][coord.zoom];
      var tid = ('0000000' + coord.column).slice(-7) + 
                ('0000000' + coord.row).slice(-7);
      var url = 'http://cyberjapandata.gsi.go.jp/sqras/all/' + did + 
        '/latest/' + coord.zoom + 
        '/' + tid.charAt(0) + tid.charAt(7) +
        '/' + tid.charAt(1) + tid.charAt(8) +
        '/' + tid.charAt(2) + tid.charAt(9) +
        '/' + tid.charAt(3) + tid.charAt(10) +
        '/' + tid.charAt(4) + tid.charAt(11) +
        '/' + tid.charAt(5) + tid.charAt(12) +
        '/' + tid + '.png';
      return url;
    }));

via 電子国土MBX