OpenLayers 3 を使ってみよう(その0:はじめに:地理院地図を表示)に目次がある。
ここでは OpenLayers 3.7.0 を使っている。
前回(その10:KML でマーカーを描画して吹出しをつける)では, KML ファイルで地図上にマーカーを描画し,さらにそのマーカーをクリックすると,マーカーの情報が吹き出しに表示されるようにする方法を記述した。 今回は経路(ルート)とマーカーを個別に表示・非表示の切替えをしてみよう。
KML ファイルから読み込んだ経路(ルート)とマーカーを個別に非表示にできると,経路だけを確認したい時や,経路の下に隠れてしまった地図の情報を読み取るのに便利である。 具体的な方法としては,KML から作った vector layer(map に addLayer() してある)の visible というオプション項目を true にすれば表示され,false にすれば画面から消える。 前回,経路(ルート)とマーカー用の KML vector layer を別々にしておいたので,それぞれに対して,visible オプションを変更する関数を用意して, それらの関数を呼び出すボタンを設定すればできあがる。
KML ファイルについての説明はOpenLayers 3 を使ってみよう(番外2:KML ファイルのフォーマットについて)に書いているので,そちらを見てみて欲しい。
まず,いつものように以下に 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"> <link rel="stylesheet" href="http://openlayers.org/en/v3.7.0/css/ol.css" type="text/css"> <script src="http://openlayers.org/en/v3.7.0/build/ol.js" type="text/javascript"></script> <style type="text/css"> div.fill {width: 100%; height: 100%;} body {padding: 0; margin: 0;} html, body, #map {height: 100%; width: 100%;} .ol-attribution { padding: 3px; position: absolute; background-color:#ffffff; background-color:rgba(230,255,255,0.7); right: 3px; bottom:5px; font-size:12px; } .ol-attribution ul { padding: 0px; line-height: 14px; margin: 0px; } .ol-attribution li { line-height: inherit; display: inline; list-style: none outside none; } .ol-zoom .ol-zoom-out { margin-top: 202px; } .ol-zoomslider { background-color: transparent; top: 2.3em; } .ol-touch .ol-zoom .ol-zoom-out { margin-top: 212px; } .ol-touch .ol-zoomslider { top: 2.75em; } .ol-popup { display: none; position: absolute; background-color: white; -moz-box-shadow: 0 1px 4px rgba(0,0,0,0.2); -webkit-filter: drop-shadow(0 1px 4px rgba(0,0,0,0.2)); filter: drop-shadow(0 1px 4px rgba(0,0,0,0.2)); padding: 5px; border-radius: 10px; border: 1px solid #cccccc; bottom: 24px; left: -51px; } .ol-popup:after, .ol-popup:before { top: 100%; border: solid transparent; content: " "; height: 0; width: 0; position: absolute; pointer-events: none; } .ol-popup:after { border-top-color: white; border-width: 10px; left: 48px; margin-left: -10px; } .ol-popup:before { border-top-color: #cccccc; border-width: 11px; left: 48px; margin-left: -11px; } .ol-popup-closer { text-decoration: none; position: absolute; top: 2px; right: 8px; } .ol-popup-closer:after { content: " ✖ "; } button.boldblack { color:black; font-weight:bold; } button.red { color:red; } button.boldred { color:red; font-weight:bold; } </style> <title>OpenLayers 3 Example: KML Layer Visible/Invisible Switch</title> <script src="ol3ex11.js" type="text/javascript"></script> <script src="../jquery.min.js" type="text/javascript"></script> </head> <body onload="init_map()"> <div id="map_canvas" style="width: 100%; height: 97%; position:absolute; top:25px; left:0px; font-size:100%;"> <div id="popup" class="ol-popup"> <a href="#" id="popup-closer" class="ol-popup-closer"></a> <div id="popup-content"></div> </div> </div> <div style="font-size:85%"> 不透明度:<a title="decrease opacity" href="javascript: directSetOpacity(0.1);">0.1</a> <a title="decrease opacity" href="javascript: directSetOpacity(0.5);">0.5</a> <a title="decrease opacity" href="javascript: directSetOpacity(1.0); ">1.0</a> <b> 不透明度・0.2ずつ変更: <a title="decrease opacity" href="javascript: changeOpacity(-0.2);"><<</a> <span id="opacity_control">0.5</span> <a title="increase opacity" href="javascript: changeOpacity(0.2);">>></a></b> <button id="kml_vector_visible" onclick="kml_vector_visible();" class="boldblack">ルート表示</button> <button id="kml_vector_invisible" onclick="kml_vector_invisible();" class="red">ルート非表示</button> <button id="wp_vector_visible" onclick="wp_vector_visible();" class="boldblack">マーカー表示</button> <button id="wp_vector_invisible" onclick="wp_vector_invisible();" class="red">マーカー非表示</button> </div> </body> </html>今回の web ページ上の変更点は,経路(ルート)とマーカーの,表示,非表示のボタンを追加した点である。 それ以外の設定は特に変更はしていない。
注意点として JavaScript の中で使いたいので jQuery (jquery.min.js) を読み込ませている。 ここでは jQuery はサーバーにダウンロードしてきたものを読み込ませている。
次に JavaScript を載せよう。ここでも変更箇所の色を変え,説明は web ページのソースと同じくこの下に書いておく。
// ------------------------------------------------------------------- var cyberJ = null; // 地理院地図用の変数 var kml_vector = null; // KML ファイル用変数 1 var wp_vector = null; // waypoint KML ファイル用変数 2 var center_lon = 136.181193333; // 中心の経度(大杉谷,宮川第三発電所) var center_lat = 34.2329783333; // 中心の緯度(大杉谷,宮川第三発電所) var kml_url = "work/map_data1.kml"; var kml_url2 = "work/wp_data1.kml"; var initZoom = 15; // ズームの初期値 var MinZoom = 6; // ズームの最小値(最も広い範囲) var MaxZoom = 21; // ズームの最大値(最も狭い範囲) var initPrecision = 8; // 座標表示の小数点以下の桁数の初期値 var initOpacity = 1.0; // 不透明度の初期値 var gMaxOpacity = 1.0; // 不透明度の最大値 var gMinOpacity = 0.0; // 不透明度の最小値 ******************************************************************* function init_map() { // 以下の DOM の定義は,init_map() の中に入れないとだめだった。 var container = document.getElementById('popup'); var content = document.getElementById('popup-content'); var closer = document.getElementById('popup-closer'); // 表示用の view 変数の定義 var view = new ol.View({maxZoom: MaxZoom, minZoom:MinZoom}); // cyberJ の opacity をいじるために,cyberJ という変数に入れている。 cyberJ = new ol.layer.Tile({ opacity: initOpacity, source: new ol.source.XYZ({ attributions: [ new ol.Attribution({ html: "<a href='http://maps.gsi.go.jp/development/ichiran.html' target='_blank'>国土地理院</a>" }) ], url: "http://cyberjapandata.gsi.go.jp/xyz/std/{z}/{x}/{y}.png", projection: "EPSG:3857" }) }); // 経路の KML データ // v3.11.0 以降の場合は new ol.format.KML() を new ol.format.KML({ showPointNames: false }) とする。 var kml_vector = new ol.layer.Vector({ source: new ol.source.Vector({ url: kml_url, format: new ol.format.KML() }) }); // マーカーの KML データ // v3.11.0 以降の場合は new ol.format.KML() を new ol.format.KML({ showPointNames: false }) とする。 var wp_vector = new ol.layer.Vector({ source: new ol.source.Vector({ url: kml_url2, format: new ol.format.KML() } }); // ------------------------------------------------------------------- // 地図をクリックした際に,停留点の情報を表示するための overlay 変数(popup 用) var overlay = new ol.Overlay({ element: container }); // 地図変数 (map 変数) の定義。地理院地図を表示するように指定している var map = new ol.Map({ target: document.getElementById('map_canvas'), layers: [cyberJ, kml_vector, wp_vector], view: view, overlays: [overlay], renderer: ['canvas', 'dom'], controls: ol.control.defaults().extend([new ol.control.ScaleLine()]), interactions: ol.interaction.defaults() }); function displayFeatureInfo(pixel, coordinate) { var features = []; map.forEachFeatureAtPixel(pixel, function(feature, wp_layer) { features.push(feature); }); if (features.length > 0) { var info = []; info.push('<div id="wp_desc" style="font-size:12px; width:215px">'+features[0].get('name')+features[0].get('description')+'</div>'); overlay.setPosition(coordinate); content.innerHTML = info[0]; container.style.display = 'block'; } else { content.innerHTML = ''; container.style.display = 'none'; } }; map.on('click', function(evt) { displayFeatureInfo(evt.pixel, evt.coordinate); }); // マーカー上でアイコンの表示を変更するイベントハンドラー, jQuery が必要 $(map.getViewport()).on('mousemove', function(e) { var pixel = map.getEventPixel(e.originalEvent); var hit = map.forEachFeatureAtPixel(pixel, function(feature, layer) { return true; }); if (hit) { map.getTarget().style.cursor = 'pointer'; } else { map.getTarget().style.cursor = ''; } }); // popup を閉じるためのイベントハンドラー closer.onclick = function() { container.style.display = 'none'; closer.blur(); return false; }; // zoom slider の追加 map.addControl(new ol.control.ZoomSlider()); // 中心の指定。view に対して指定。transform を忘れないこと。 view.setCenter(ol.proj.transform([center_lon, center_lat], "EPSG:4326", "EPSG:3857")); // zoom の指定。view に対して指定する。 view.setZoom(initZoom); // span opacity_control (地理院地図の不透明度) に初期値(実数)を入れる。 document.getElementById('opacity_control').innerHTML = initOpacity.toFixed(1); } // 初期化 // ******************************************************************* // 地理院地図 (var cyberJ) の opacity(この場合は不透明度) を変える function changeOpacity(opacity) { var newOpacity = (parseFloat(document.getElementById('opacity_control').innerHTML) + opacity).toFixed(1); // 新しい opacity の値を求める newOpacity = Math.min(gMaxOpacity, Math.max(gMinOpacity, newOpacity)); // 最大値と最小値の範囲を超えないように cyberJ.setOpacity(newOpacity); // 地理院地図の opacity の変更 document.getElementById('opacity_control').innerHTML = newOpacity.toFixed(1); // opacity の数字の表示書き換え } function directSetOpacity(opacity) { cyberJ.setOpacity(opacity); document.getElementById('opacity_control').innerHTML = opacity.toFixed(1); } // ******************************************************************* function kml_vector_visible() { kml_vector.setVisible(true); } function kml_vector_invisible() { kml_vector.setVisible(false); } function wp_vector_visible() { wp_vector.setVisible(true); } function wp_vector_invisible() { wp_vector.setVisible(false); } // *******************************************************************今回の変更点は,kml_vector と wp_vector という2つの変数をグローバルに定義し直しているのと, 最後の方にオレンジ色で示した4つの関数を追加したのみである。 これらの関数は,それぞれ,kml_vector,wp_vector の visible を true/false の切替をしているだけである。 これで簡単に経路やマーカーは消せるし,またすぐに復活させることができる。
「その11」のサンプルを具体的な web ページとして用意したので,具体的な表示を見てみて欲しい。(ちなみにサンプルページはアクセスログを取るルーチンを組み込んでいます)
その12:KML+マーカーで zoom の自動調整に続く
0 件のコメント:
コメントを投稿