最近、日本語サイトのOpenStreetMap Japanで地図ページの改良をなさっている方が居て、私もちょっと触ってみたくなってBloggerに表示させてみることにしました。
ベースにしたのは、MediaWiki用のSlippy Map MediaWiki Extensionからの出力です。
サーバーからタイル(細分化された地図画像)を引っ張ってくることは直ぐにできましたが、タイル同士の間に数ピクセルの隙間が空いてしまいます。OSM.orgやOSM.jpで使用しているコードを覗いて見たり、OpenLayersの文書やソースを読んでみても解決できず二日程悩んでいました。ふと思い立ってFirefoxのアドオンのページを確認してみるとFirebugのFirefox3対応版が出ていたので早速インストール。HTMLを調査すると適用されているスタイル (padding:4px;) や要素のクラス名 (olTileImage) が簡単に分かり、直ぐに解決。この程度のことだから、OpenLayersのFAQやメーリングにも質問が出ていなかったんだと思いました。それにしてもFirebugは便利だなぁ。あまり使ったことがないので、使い方も良く分かんないけど...
やろうと思ったけどやり方が分からず、とりあえず現時点では諦めたこと。
- 地図のスクロール時やズーム時に、OSM.orgの地図へのURLに入っている座標やズームレベルを更新すること。
- URLのベースをOSM.orgサーバーへ向ける。
- 座標の形式を lat=35.67255 lon=139.76183 のように普段GPSなどで見ているものと同じにする。
- リンクテキストを Permalink 以外のものにする
- ズームレベルに合わせたスケールを表示する。
- 1ページに複数のSlippy Mapを表示させる。
- Slippy Map MediaWiki Extensionは1ページに1つしか表示できない。
- Widget追加ボタンの作成。
Data by OpenStreetMap
CC-BY-SA-2.0
上の地図を表示させているコードはこちら。( "+ expand source" のリンクをクリックして下さい。)
<style> .map img { padding: 0px !important; border: none !important;} </style> <div class="map" style="margin-bottom:-35px;"> <!-- define a DIV into which the map will appear --> <div style="width:400px; height:350px; border-style:solid; border-width:1px; border-color:#000;" id="map"></div> <br/> <span style="font-size:70%; background-color:white; position:relative;top:-65px;left:5px;z-index:1003;">Data by <a href="http://www.openstreetmap.org/?lat=36&lon=139&zoom=4" title="See this map on OpenStreetMap.org">OpenStreetMap</a><br/> <a href="http://creativecommons.org/licenses/by-sa/2.0/" title="Creative Commons Attribution-Share Alike 2.0">CC-BY-SA-2.0</a></span> </div> <!-- bring in the OpenLayers javascript library --> <script src="http://openlayers.org/api/OpenLayers.js"></script> <!-- bring in the OpenStreetMap OpenLayers layers. Using this hosted file will make sure we are kept up to date with any necessary changes. --> <script src="http://openstreetmap.org/openlayers/OpenStreetMap.js"></script> <script type="text/javascript"> var lon=139; var lat=36; var zoom=4; var map; function lonLatToMercator(ll) { var lon = ll.lon * 20037508.34 / 180; var lat = Math.log (Math.tan ((90 + ll.lat) * Math.PI / 360)) / (Math.PI / 180); lat = lat * 20037508.34 / 180; return new OpenLayers.LonLat(lon, lat); } window.onload=init; function init() { map = new OpenLayers.Map("map", { controls:[ new OpenLayers.Control.Navigation(), new OpenLayers.Control.PanZoom(), new OpenLayers.Control.LayerSwitcher()], maxExtent: new OpenLayers.Bounds(-20037508.34, -20037508.34, 20037508.34, 20037508.34), maxResolution:156543.0399, units:'meters', projection: "EPSG:900913" } ); var mapnik = new OpenLayers.Layer.OSM.Mapnik("Mapnik"); map.addLayer(mapnik); var osmarender = new OpenLayers.Layer.OSM.Osmarender("Osmarender"); map.addLayer(osmarender); var cyclemap = new OpenLayers.Layer.OSM.CycleMap("Cycle Map"); map.addLayer(cyclemap); var maplint = new OpenLayers.Layer.OSM.Maplint("Maplint"); map.addLayer(maplint); var lonLat = lonLatToMercator(new OpenLayers.LonLat(lon, lat)); map.setCenter (lonLat, zoom); } </script>
追記
Widget追加ボタンを作成しました。
尚、上のコードで表示できるSlippy Mapは1ページに1つだけで、Widgetでは複数のSlippy Mapを同じページに表示できます。また、上のコードによるSlippy Mapと同じページ内にWidgetによるSlippy Mapがあると、その影響により指定した座標・ズームで表示できないことがあるようです。
|