GNSS/GPS 経路の表示に OpenLayers 2 を使う(その0:はじめに)に目次がある。
ここでは OpenLayers 2.13.1 を使っている。
前回(その4:不透明度を変えて2つの地図を重ねて表示)では 2種類の地図を表示させ,一方の地図の不透明度を変更させて,見え具合をユーザーが変更できるようにした。
今回は,KML ファイルを読み込ませて,GNSS/GPS ロガーの経路データを任意の地図の上に表示させる。 ここでの話は OpenLayers のサンプルや,地理院地図の使い方, 技術情報, 地理院タイルを用いたサイト構築サンプル集, 等を参考にしている。
以下に web ソースコードを書いておこう。
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <meta name="viewport" content="initial-scale=1.0, user-scalable=no"> <meta http-equiv="content-type" content="text/html; charset=UTF-8"> <meta http-equiv="content-style-type" content="text/css"> <meta http-equiv="content-script-type" content="text/javascript"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <title>OpenLayers Example: KML file</title> <link rel="stylesheet" href="../../cj_map/popup.css" type="text/css"> <script src="http://maps.google.co.jp/maps/api/js?sensor=false&language=ja"></script> <script src="../../OpenLayers-2.13.1/lib/OpenLayers.js"></script> <script type="text/javascript">//<![CDATA[ var param = { div: 'map_canvas', lon: 136.181193333333, lat: 34.2329783333333, zoom: 15, url: 'work/map_data1.kml' }; //]]></script> <script type="text/javascript"> // ------------------------------------------------------------------- var proj_3857 = new OpenLayers.Projection('EPSG:3857'); var proj_4326 = new OpenLayers.Projection('EPSG:4326'); // WGS84 var map = null; var std_map = null; // ------------------------------------------------------------------- // 初期化 function init_map() { // 地図表示の変数定義 map = new OpenLayers.Map({ div: param.div, projection: proj_3857, displayProjection: proj_4326 }); // 地理院地図(標準地図)表示 std_map = new OpenLayers.Layer.XYZ('標準地図', 'http://cyberjapandata.gsi.go.jp/xyz/std/${z}/${x}/${y}.png', { attribution: '<a href="http://portal.cyberjapan.jp/help/termsofuse.html" target="_blank">国土地理院</a>', maxZoomLevel: 17 }); map.addLayer(std_map); // kml ファイルの読込み var kmlLayer = new OpenLayers.Layer.Vector('GPSデータ', { projection: proj_4326, strategies: [new OpenLayers.Strategy.Fixed()], protocol: new OpenLayers.Protocol.HTTP({ url: param.url, format: new OpenLayers.Format.KML({extractStyles: true, extractAttributes: true, maxDepth: 2}) }) }); map.addLayer(kmlLayer); // 中心座標を設定 if (!map.getCenter()) { map.setCenter(new OpenLayers.LonLat(param.lon, param.lat).transform(proj_4326, proj_3857), param.zoom); } // Layer 切替スイッチ表示 map.addControl(new OpenLayers.Control.LayerSwitcher()); // スケールの表示 map.addControl(new OpenLayers.Control.ScaleLine()); } // 初期化 // ------------------------------------------------------------------- </script> </head> <body onload="init_map()"> <div id="map_canvas"></div> </body> </html>
基本的な構造はこれまでと同じである。 今回も今回に特徴的な部分を色付きにしてみた。 それぞれについて説明しよう。
最初の赤字の部分で,読み込むべき KML ファイルの URL を相対 URL で与えている。
実際の KML ファイルの読み込みは,青字の部分で行っている。 実はこの部分は地理院地図のサンプルそのままなので,細かいパラメータに関してはよくわかっていない…。 しかし,これで簡単に経路を表示できる。
以下に KML ファイルの具体例を書こう。
<?xml version="1.0" encoding="UTF-8"?> <kml xmlns="http://www.opengis.net/kml/2.2"> <Document> <description> <![CDATA[<p>大杉谷20140615</p><p><a href="http://hippo.matsup.mydns.jp/motorcycle/">Powered by matsup</a></p>]]> </description> <Style id="Line_1"> <LineStyle> <color>ffff0000</color> <width>3</width> </LineStyle> </Style> <Folder> <name>Tracks</name> <Placemark> <name>Track 1</name> <description><![CDATA[Original tracking filename : LOG00489.nma<br>From: 2014/06/15 07:22:32 (34.2331033333333,136.181595)<br> To: 2014/06/15 16:50:40 (34.233195,136.181676666667)]]></description> <styleUrl>#Line_1</styleUrl> <LineString> <extrude>0</extrude> <tessellate>1</tessellate> <altitudeMode>clampToGround</altitudeMode> <coordinates> 136.181595,34.2331033333333,320.7 136.181633333333,34.233065,329.8 136.181591666667,34.23311,310.7 136.18165,34.23311,311.2 136.181568333333,34.2330966666667,309.3 136.181206666667,34.2327066666667,310.8 136.180971666667,34.2327233333333,311.9 </coordinates> </LineString> </Placemark> </Folder> </Document> </kml>KML ファイルは web のソースファイルと同じように,「<XX>」と「</XX>」で挟まれた XML の構造体で書かれている。 KML ファイル全体は「<kml>」と「</kml>」で挟まれている。 その中にさらに「<Document>〜</Document>」で挟まれたメインパートがある。 私が扱うものでは,「<kml>〜</kml>」の中の全部が「<Document>〜</Document>」となっている。
「<Document>〜</Document>」の中に「<description>〜</description>」, 「<Style>〜</Style>」,「<Folder>〜</Folder>」という要素が含まれている。 「<description>〜</description>」はこのファイル全体に関する記述であり,様々なことが記述できるように「<![CDATA[」と「]]>」で挟まれている。 「<Style>〜</Style>」の中にさらに「<LineStyle>〜</LineStyle>」が含まれている。 その中で経路を記載するラインの幅や色を定義している。 「<Folder>〜</Folder>」の中に「<Placemark>〜</Placemark>」があり,その中で具体的な経路が記述されている。 ラインのスタイルは「<styleUrl>〜</stleUrl>」で「Line_1」を使うと指定してある。 ここで,スタイルの指定は URL で行わないといけないため,「Line_1」の前に「#」がつけてある。 具体的な点は「<coordinates>〜</coordinates>」で挟まれ,1行に1点で経度,緯度,高度が記載されている。 高度に関しては,「<altitudeMode>clampToGround</altitudeMode>」としてあるので,意味がないかも…。
「その5」のサンプルを具体的な web ページとして用意したので,具体的な表示を見てみて欲しい。(ちなみにサンプルページはアクセスログを取るルーチンを組み込んでいます)
その6:KML ファイルで経路とマーカーを表示に続く
4 件のコメント:
高橋様,
さすがにこれだけの情報だと原因を判断するのは困難ですが,
これまでの私の経験だと,
(1) kml ファイルは,外部から読める場所にないといけない。
例えばパスワードで保護されたサイトにあると,経路は表示されません。
(2) OpenLayers のバージョンが新しい過ぎるとうまくいかない。
ご覧のページは OpenLayers 2 用なので,新しい OpenLayers 3 以降では
うまく動かない可能性があります。同じ OL3 の中でも OpenLayers 3.7 以降は
kml ファイルの使い方が変わったので,うまく動かないことがあります。
OpenLayers 3.7 の場合の kml ファイルを使った例は,
http://matsup.blogspot.jp/2014/09/openlayers-3-kml_12.html にあるので,
もしバージョン違いならこちらもご覧ください。
(3) 上記以外なら,JavaScript か kml ファイルの問題だと思います。
サンプルの http://hippo.matsup.mydns.jp/OLayerMap/ex5_kml.html と,
そのkml ファイル(http://hippo.matsup.mydns.jp/OLayerMap/work/map_data1.kml)
を移植してみてください。もしうまくいけば,ご自身の kml ファイルを使うとか,
逆に JavaScript の方を入れ替えるなどして,どこに原因があるのかを調べることが
できると思います。
今のところ,この程度しか推定できませんが,問題が解決することを祈っています。
Rider Matsup さん
早速のコメントありがとうございました。
手抜きで、サーバを立てずにローカルファイルで試験していたんですが、kml ファイルは url で指定しなければいけないんですね。
気がついてコメントを削除したんですが、遅かったようです。
お手数をお掛けしました。
高橋様,
ご指針で気づかれたのですね。問題が解決してよかったです。
kml ファイルがパスワードで保護した場所にあるなどで読めない,というのはよくありますが,知らないと気づきにくいと思います。他の方がこのコメントを見て少しでも役に立てば,と思います。
これからもよろしくお願いします。
コメントを投稿