Newer
Older
www-root / osm / ol3ex10.js
@hayashi hayashi on 9 Oct 2017 6 KB 表題
  1. // -------------------------------------------------------------------
  2. var cyberJ = null; // 地理院地図用の変数
  3.  
  4. var center_lon = 136.181193333; // 中心の経度(大杉谷,宮川第三発電所)
  5. var center_lat = 34.2329783333; // 中心の緯度(大杉谷,宮川第三発電所)
  6.  
  7. var kml_url = "data/map_data1.kml";
  8. var kml_url2 = "data/wp_data1.kml";
  9.  
  10. var initZoom = 15; // ズームの初期値
  11. var MinZoom = 6; // ズームの最小値(最も広い範囲)
  12. var MaxZoom = 21; // ズームの最大値(最も狭い範囲)
  13.  
  14. var initPrecision = 8; // 座標表示の小数点以下の桁数の初期値
  15. var initOpacity = 1.0; // 不透明度の初期値
  16. var gMaxOpacity = 1.0; // 不透明度の最大値
  17. var gMinOpacity = 0.0; // 不透明度の最小値
  18. //*******************************************************************
  19.  
  20. function init_map() {
  21. // 以下の DOM の定義は,init_map() の中に入れないとだめだった。
  22. var container = document.getElementById('popup');
  23. var content = document.getElementById('popup-content');
  24. var closer = document.getElementById('popup-closer');
  25.  
  26. // 表示用の view 変数の定義
  27. var view = new ol.View({maxZoom: MaxZoom, minZoom:MinZoom});
  28.  
  29. // cyberJ の opacity をいじるために,cyberJ という変数に入れている。
  30. cyberJ = new ol.layer.Tile({
  31. opacity: initOpacity,
  32. source: new ol.source.XYZ({
  33. attributions: [ new ol.Attribution({ html: "<a href='http://maps.gsi.go.jp/development/ichiran.html' target='_blank'>国土地理院</a>" }) ],
  34. url: "http://cyberjapandata.gsi.go.jp/xyz/std/{z}/{x}/{y}.png", projection: "EPSG:3857"
  35. })
  36. });
  37.  
  38. // 経路の KML データ
  39. // v3.11.0 以降の場合は new ol.format.KML() を new ol.format.KML({ showPointNames: false }) とする。
  40. var kml_vector = new ol.layer.Vector({
  41. source: new ol.source.Vector({ url: kml_url, format: new ol.format.KML() })
  42. });
  43.  
  44. // マーカーの KML データ
  45. // v3.11.0 以降の場合は new ol.format.KML() を new ol.format.KML({ showPointNames: false }) とする。
  46. var wp_vector = new ol.layer.Vector({
  47. source: new ol.source.Vector({ url: kml_url2, format: new ol.format.KML() })
  48. });
  49.  
  50. // -------------------------------------------------------------------
  51. // 地図をクリックした際に,停留点の情報を表示するための overlay 変数(popup 用)
  52. var overlay = new ol.Overlay({
  53. element: container
  54. });
  55.  
  56. // 地図変数 (map 変数) の定義。地理院地図を表示するように指定している
  57. var map = new ol.Map({
  58. target: document.getElementById('map_canvas'),
  59. layers: [cyberJ, kml_vector, wp_vector],
  60. view: view,
  61. overlays: [overlay],
  62. renderer: ['canvas', 'dom'],
  63. controls: ol.control.defaults().extend([new ol.control.ScaleLine()]),
  64. interactions: ol.interaction.defaults()
  65. });
  66.  
  67. function displayFeatureInfo(pixel, coordinate) {
  68. var features = [];
  69. map.forEachFeatureAtPixel(pixel, function(feature, wp_layer) {
  70. features.push(feature);
  71. });
  72. if (features.length > 0) {
  73. var info = [];
  74. // for (i = 0; i < features.length; ++i) {
  75. // info.push('<div id="wp_desc" style="font-size:12px; width:235px">'+features[i].get('name')+features[i].get('description')+'</div>');
  76. // }
  77. info.push('<div id="wp_desc" style="font-size:12px; width:215px">'+features[0].get('name')+features[0].get('description')+'</div>');
  78.  
  79. overlay.setPosition(coordinate);
  80. content.innerHTML = info[0];
  81. // content.innerHTML = info.join('<br>') || '(unknown)';
  82. container.style.display = 'block';
  83. } else {
  84. content.innerHTML = '';
  85. container.style.display = 'none';
  86. }
  87. };
  88.  
  89. map.on('click', function(evt) {
  90. displayFeatureInfo(evt.pixel, evt.coordinate);
  91. });
  92.  
  93. // マーカー上でアイコンの表示を変更するイベントハンドラー, jQuery が必要
  94. $(map.getViewport()).on('mousemove', function(e) {
  95. var pixel = map.getEventPixel(e.originalEvent);
  96. var hit = map.forEachFeatureAtPixel(pixel, function(feature, layer) { return true; });
  97. if (hit) { map.getTarget().style.cursor = 'pointer'; }
  98. else { map.getTarget().style.cursor = ''; }
  99. });
  100.  
  101. // popup を閉じるためのイベントハンドラー
  102. closer.onclick = function() {
  103. container.style.display = 'none';
  104. closer.blur();
  105. return false;
  106. };
  107.  
  108. // zoom slider の追加
  109. map.addControl(new ol.control.ZoomSlider());
  110.  
  111. // 中心の指定。view に対して指定。transform を忘れないこと。
  112. view.setCenter(ol.proj.transform([center_lon, center_lat], "EPSG:4326", "EPSG:3857"));
  113.  
  114. // zoom の指定。view に対して指定する。
  115. view.setZoom(initZoom);
  116.  
  117. // span opacity_control (地理院地図の不透明度) に初期値(実数)を入れる。
  118. document.getElementById('opacity_control').innerHTML = initOpacity.toFixed(1);
  119.  
  120. } // 初期化
  121.  
  122. // *******************************************************************
  123. // 地理院地図 (var cyberJ) の opacity(この場合は不透明度) を変える
  124. function changeOpacity(opacity) {
  125. var newOpacity = (parseFloat(document.getElementById('opacity_control').innerHTML) + opacity).toFixed(1); // 新しい opacity の値を求める
  126. newOpacity = Math.min(gMaxOpacity, Math.max(gMinOpacity, newOpacity)); // 最大値と最小値の範囲を超えないように
  127. cyberJ.setOpacity(newOpacity); // 地理院地図の opacity の変更
  128. document.getElementById('opacity_control').innerHTML = newOpacity.toFixed(1); // opacity の数字の表示書き換え
  129. }
  130.  
  131. function directSetOpacity(opacity) {
  132. cyberJ.setOpacity(opacity);
  133. document.getElementById('opacity_control').innerHTML = opacity.toFixed(1);
  134. }
  135. // *******************************************************************