2014年7月9日水曜日

GNSS/GPS 経路の表示に OpenLayers 2 を使う (その4:不透明度を変えて2つの地図を重ねて表示)

これはGNSS/GPS 経路の表示に OpenLayers 2 を使う(その3:中央にセンターマークを表示)からの続きである。
GNSS/GPS 経路の表示に OpenLayers 2 を使う(その0:はじめに)に目次がある。
ここでは OpenLayers 2.13.1 を使っている。
前回(その3:中央にセンターマークを表示)では 地図の中央にセンターマークを表示させた。 今回は,2つの地図を重ねて,一方の不透明度を操作して2つの地図を同時に見たり,一方だけにしたりしてみたい。 ここでの記載はy2blog 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: Opacity</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};
//]]></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;

var gMaxOpacity = 1.0; // 不透明度の最大値
var gMinOpacity = 0.0; // 不透明度の最小値
// -------------------------------------------------------------------
// 初期化
function init_map() {
        // 地図表示の変数定義
        map = new OpenLayers.Map({
          div: param.div, projection: proj_3857, displayProjection: proj_4326
        });

        // 地理院地図(標準地図)を半透明にしてoverlay として表示
        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, opacity: 0.5, isBaseLayer: false
        });

        // Google Maps(衛星写真)を base layer として表示
        var gmap = new OpenLayers.Layer.Google("Google Satellite", {
          type: google.maps.MapTypeId.SATELLITE, numZoomLevels:21
        });
        map.addLayers([std_map, gmap]);

        // 中心座標を設定
        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());
} // 初期化

// -------------------------------------------------------------------
// 地理院地図 (var std_map) の opacity(不透明度) を変える
function changeOpacity(opacity) {
  var newOpacity = ( parseFloat( OpenLayers.Util.getElement('opacity_control').value) + opacity ).toFixed(1); // 新しい opacity の値を求める
  newOpacity = Math.min( gMaxOpacity, Math.max( gMinOpacity, newOpacity) ); // 最大値と最小値の範囲を超えないように
  OpenLayers.Util.getElement('opacity_control').value = newOpacity; // opacity の数字の表示書き換え
  std_map.setOpacity(newOpacity); // 地理院地図の opacity の変更
}
// -------------------------------------------------------------------
</script>
</head>

<body onload="init_map()">
<div id="map_canvas" style="width: 100%; height: 95%; position:absolute; top:35px; left:0px"></div>

<div><b>不透明度:(0.1刻み)
    <a title="decrease opacity" href="javascript: changeOpacity(-0.1);">&lt;&lt;</a>
    <input id="opacity_control" type="text" value="0.5" size="3" disabled="true">
    <a title="increase opacity" href="javascript: changeOpacity(0.1);">&gt;&gt;</a>
</b></div>

</body>
</html>

 基本的な構造は前回や前々回と同じである。 今回に特徴的な部分を色付きにしてみた。 それぞれについて少しだけ(わかっている範囲で)説明しよう。

 最初の青字の部分は,不透明度の最大値と最小値を定義している。 参考にしたサイトは 0.1 ~ 0.9 だったが,私は 0~1 にしてみた。 また,地図の定義の所で,Overlay になっている地理院地図の標準地図は,最初から不透明度を 0.5 として,重なっているのがわかるようにしてある。

 ここで一番のミソとなるのが緑字の部分の部分である。 ここでは,web ページに表示させている矢印(<< と >>)のいずれかがクリックされた際に, 不透明度の数値を新しいものに置換え,最後に地理院地図・標準地図の Opacity(不透明度)を新しい数値に設定しなおしている。

 最後に,web ページに矢印と不透明度の数値を表示する箱を用意している。

 「その4」のサンプルを具体的な web ページとして用意したので,具体的な表示を見てみて欲しい。(ちなみにサンプルページはアクセスログを取るルーチンを組み込んでいます)

その5:KML ファイルで経路を表示に続く

0 件のコメント: