Google Maps API の GTileLayer インターフェイスを使うと、自分で生成した画像タイリング地図を表示できる。

MapLib.net なんかでは好き勝手なAjax地図(&地図じゃないだろうそれはみたいな画像) を GTileLayer で実現していておもしろい。

明日のためにその1。
地図をサーバから配信するのは作るのが大変そうなので、とりあえず簡易的な画像を配信してみる。

サンプル画像

Poison Maps [ポイズンマップ] に実装してみた結果。

タイル画像Jack
Jack by GTileLayer

地図+タイル画像Jack
JackMix by GTileLayer

地図
地図

航空写真
航空写真

地図+写真
地図+写真

サンプルコード

JavaScriptで実装したソースコードの一部。


function createCustomTileLayer() {
  // GTileLayer 実装クラス
  var dataLayer =
    new GTileLayer(
      new GCopyrightCollection(""), 0, 19);
  dataLayer.getOpacity=CustomTileLayer_getOpacity;
  dataLayer.isPng=CustomTileLayer_isPng;
  dataLayer.getTileUrl=CustomTileLayer_getTileUrl;
  return dataLayer;
}
 
var CustomTileLayer_opacity = 0.3; // 透明度
var CustomTileLayer_png = true; // PNG画像かどうか
 
var CustomTileLayer_getOpacity = function getOpacity() {
  return CustomTileLayer_opacity;
}
 
var CustomTileLayer_isPng = function getOpacity() {
  return CustomTileLayer_png;
}
 
// タイル画像を返す関数
var CustomTileLayer_getTileUrl = function(tile, zoom) {
 
  // 地図タイリング画像生成サーバなんて
  // 自前で作れません(>_<;)
 
  // ここでは、とりあえずベタな画像のURLを返すことにする。
 
  // 交互にJackが表示されるように
  if(tile.x % 2 == tile.y % 2) {
    return "tile.png";
  } else {
    return "tile2.png";
  }
}
 
var g_map;
 
function init() {
 
  var customTileLayer = createCustomTileLayer();
 
  var mapCustom =
    new GMapType(
      [customTileLayer],
      G_NORMAL_MAP.getProjection(),
      "Jack");
 
  var mapNormalMix =
    new GMapType(
      [G_NORMAL_MAP.getTileLayers()[0], customTileLayer],
      G_NORMAL_MAP.getProjection(),
      "JackMix");
 
  //var mapSatelliteMix =
  //  new GMapType(
  //    [G_SATELLITE_MAP.getTileLayers()[0], customTileLayer],
  //    G_SATELLITE_MAP.getProjection(),
  //    "航空写真Mix");
 
  g_map =
    new GMap2(
      document.getElementById("map"),
      {
        mapTypes:
        [
          mapCustom,
          mapNormalMix,
          G_NORMAL_MAP,
          G_SATELLITE_MAP,
          G_HYBRID_MAP
        ]
      }
   );
 
  g_map.addControl(new GLargeMapControl());
  g_map.addControl(new GMapTypeControl());
}

参考

まじめにタイル画像を生成するための参考

将来に備えてメモ。

るきへなWeblog - GTileLayer のサンプル にある TILE TEST が素晴らしい。

ソースコード を見ると、


// タイル単位の(x,y)から緯度経度に変換
function x2lng_t($x,$zoom)
{
  return ($x/(1<<$zoom)*2-1)*180; 
}
 
function y2lat_t($y,$zoom)
{
  return atan(sinh((1-$y/(1<<$zoom)*2)*M_PI))/M_PI*180;
}
 
// ピクセル単位の(x,y)から緯度経度に変換
function x2lng_p($x,$zoom)
{
  return ($x/(1<<$zoom)/128-1)*180; 
}
 
function y2lat_p($y,$zoom)
{
  return atan(sinh((1-$y/(1<<$zoom)/128)*M_PI))/M_PI*180;
}

平面座標と緯度経度の変換ルーチンを発見。

るきへなWeblog - GTileLayerとメルカトル図法 とか Mercator projection - Wikipedia, the free encyclopedia の変換式も参考になりそう。

tags: zlashdot GIS GoogleMapsAPI WebServices

Posted by NI-Lab. (@nilab)