[OSM-ja] BLOG on OSM Japan

Kimiya FUJISAWA fujisawa @ techstrom.org
2008年 6月 23日 (月) 19:10:25 BST


藤澤です。

#斜めにHTMLとjsファイルを辿っただけですが…

Hiroshi Miura wrote:
> 
> あわせて、現在Japanサイトの地図表示
> http://www.openstreetmap.jp/showmap
> ですが、permalinkが正常に動作していません。
> 
> これについて、何とかしたいのですが、
> JavaScriptに詳しい方の応援をいただけるとうれしいと
> おもいます。

本家の
http://www.openstreetmap.org/javascripts/site.js/1208610930
に相当するjavascriptファイルが抜けているのではないでしょうか。
中身がupdatelinks()関数で始まっているものです。
updatelinks()関数で、idがpermalinkanchorの中身を書き換えている
ように見えます。

機能すればなんでもよいのであれば、以下のように、showmapで定義されている
init()関数を変更して、3つほど関数を追加すれば機能するかと思います。
あと、permalinkのリンク先は、/ではなく/showmapに変更する必要が
あります。
//ここから
function init() {
        map = new OpenLayers.Map("map", {
        controls:[      new OpenLayers.Control.Navigation(),
                        new OpenLayers.Control.PanZoomBar(),
                        new OpenLayers.Control.Attribution()],
        maxExtent: new OpenLayers.Bounds(-20037508.34,-20037508.34,20037508.34,20037508.34),
        maxResolution:156543.0399, units:'meters', projection:"EPSG:900913"} );
        var layerMapnik = new OpenLayers.Layer.OSM.Mapnik("Mapnik");
        var layerTah = new OpenLayers.Layer.OSM.Osmarender("Tiles @ Home");
        map.addLayers([layerTah,layerMapnik]);
        //map.addLayer(layerTah);
        map.addControl(new OpenLayers.Control.LayerSwitcher());
        var args = getArgs(location.href);
        if(args){
                lon = args["lon"];
                lat = args["lat"];
                zoom = args["zoom"];
        }
        var lonLat = lonLatToMercator(new OpenLayers.LonLat(lon, lat));
        map.setCenter (lonLat, zoom);
        map.events.register("moveend", map, setPermaLink);
        setPermaLink();
}
function setPermaLink(){
        var lonlat = map.getCenter();
        var zoom = map.getZoom();
        node = document.getElementById("permalinkanchor");
        if (node) {
                var args = getArgs(node.href);
                if(!args) args = new Object();
                args["lat"] = Math.atan(Math.exp((lonlat.lat*180/20037508.34)*Math.PI/180))*360/Math.PI-90;
                args["lon"] = lonlat.lon * 180/20037508.34;
                args["zoom"] = zoom;
                node.href = setArgs(node.href, args);
        }
}
function getArgs(url) {
  var args;
  var querystart = url.indexOf("?");

  if (querystart >= 0) {
     args = new Object();
     var querystring = url.substring(querystart + 1);
     var queryitems = querystring.split("&");

     for (var i = 0; i < queryitems.length; i++) {
        if (match = queryitems[i].match(/^(.*)=(.*)$/)) {
           args[unescape(match[1])] = unescape(match[2]);
        } else {
           args[unescape(queryitems[i])] = null
        }
     }
  }

  return args;
}
function setArgs(url, args) {
   var queryitems = new Array();

   for (arg in args)
   {
      if (args[arg] == null) {
         queryitems.push(escape(arg));
      } else {
         queryitems.push(escape(arg) + "=" + escape(args[arg]));
      }
   }

   return url.replace(/\?.*$/, "") + "?" + queryitems.join("&");
}
//ここまで

それと、divタグでid="map"が2箇所にあるので、下の方の
permalinkを囲っている方はとってしまった方がよいかと思います。

> 
> OpenLayersをいじってみたい方、いましたら
> 教えてください。管理者権限を付与するので、
> サイトの地図を行けてる風にしていただけると
> うれしいです。
> 

いけてる風かどうかわかりませんが、私は試しに手元のgpsdriveでの
mapnikのレンダリングで、trunk/primary/secondaryの道番号アイコンを
日本の形(丸まった逆三角形と六角形)に変えてみています。
アイコンファイルを用意して、osm.xmlを一部
書き換えるだけなので比較的簡単にできました。
-- 
 @@@@@                             藤澤 公也 / Kimiya FUJISAWA
@//  @@                          mailto:fujisawa @ techstrom.org
@-O-O-@                          work:fujisawa @ media.teu.ac.jp
 \ ^ /  mixi ID:10397871            http://www.techstrom.org/





Talk-ja メーリングリストの案内