2017年6月10日土曜日

OpenLayers4 Workshop - 2.4. Vector data

2.4. ベクタレイヤ
ベクタレイヤは ol.layer.Vector で表示され、ベクタデータのクライアント側の表示を処理しています。現在、OpenLayers は Canvas レンダラのベクタレンダリング全てと、WebGL レンダラのポイントジオメトリだけをサポートしています。

2.4.1. クライアント側のフィーチャ描画
基本の世界地図を取得するには、WMS の例に戻ります。ベクタレイヤでこの上にいくつかのフィーチャデータを追加します。
<!doctype html>
<html lang="en">
 <head>
  <link rel="stylesheet" href="/ol.css" type="text/css">
  <style>
    #map {
     height: 256px;
     width: 512px;
    }
  </style>
  <title>OpenLayers example</title>
  <script src="/loader.js" type="text/javascript"></script>
 </head>
 <body>
  <h1>My Map</h1>
  <div id="map"></div>
  <script type="text/javascript">
   var map = new ol.Map({
    target: 'map',
    layers: [
     new ol.layer.Tile({
      title: "Global Imagery",
      source: new ol.source.TileWMS({
       url: 'http://ahocevar.com/geoserver/wms',
       params: {LAYERS: 'nasa:bluemarble', TILED: true}
      })
     })
    ],
    view: new ol.View({
     projection: 'EPSG:4326',
     center: [0, 0],
     zoom: 0,
     maxResolution: 0.703125
    })
   });
  </script>
 </body>
</html>
タスク
1. テキストエディタで map.html を開き、最初の WMS example の内容をコピーします。変更を保存して、ブラウザで正しく見えることを確認します。:http://localhost:4000/map.html
2. マップの初期化コードで Tile layer の後にもうひとつのレイヤを追加(下記のものを貼り付け)します。これは GeoJSON に格納されている一連のフィーチャを要求したマップに新しいベクタレイヤを追加します。
new ol.layer.Vector({
 title: 'Earthquakes',
 source: new ol.source.Vector({
  url: '/data/layers/7day-M2.5.json',
  format: new ol.format.GeoJSON()
 }),
 style: new ol.style.Style({
  image: new ol.style.Circle({
   radius: 3,
   fill: new ol.style.Fill({color: 'white'})
  })
 })
})

地震の場所を表す白丸と世界地図。

2.4.2. 詳しく見る
それでは何が起こっているか理解するために、そのベクタレイヤの作成を検討してみます。
new ol.layer.Vector({
 title: 'Earthquakes',
 source: new ol.source.Vector({
  url: '/data/layers/7day-M2.5.json',
  format: new< ol.format.GeoJSON()
 }),
 style: new ol.style.Style({
  image: new ol.style.Circle({
   radius: 3,
   fill: new ol.style.Fill({color: 'white'})
  })
 })
})
レイヤは、title の「Earthquakes」といくつかのカスタムオプションを与えられています。オプションオブジェクトでは、url を指示する ol.source.vector タイプの source を用意しています。

注意:属性に基づいたフィーチャのスタイルを設定したい場合は、 ol.layer.Vector の style 設定オプションである ol.style.Style の替りににスタイル関数を使用します。

ボーナスタスク
1. マップ上の白丸は、 ol.layer.Vector レイヤの上に ol.Feature オブジェクトを表します。これらの各フィーチャは、それぞれ、title と summary(要約) のプロパティの属性データを持っています。マップ上で forEachFeatureAtPixel を呼び出す、マップ上の 「singleclick」リスナを登録し、マップビューポートの下に地震情報を表示します。
2. ベクタレイヤのデータは、USGS(http://earthquake.usgs.gov/earthquakes/catalogs/)が発行した地震のフィード由来しています。OpenLayers でサポートされているフォーマットの空間情報がある追加データを見つけることができるかどうか参照してください。もし、data ディレクトリ内の空間データを表現する別のドキュメントを保存するなら、マップ上のベクタレイヤで表示することができます。

解答
最初のボーナスタスクの解答として、map の下に info div タグを追加できます。

<div id="info"></div>

クリックされたフィーチャのタイトル(title)を表示するために次の JavaScript コードを追加します。
map.on('singleclick', function(e) {
 var feature = map.forEachFeatureAtPixel(e.pixel, function(feature) {
  return feature;
 });
 var infoElement = document.getElementById('info');
 infoElement.innerHTML = feature ? feature.get('title') : '';
});

■□ Debian8 で試します■□
上記コードを map.html に追加します。

user@deb8-vmw:~/openlayers-workshop-en$ vim map.html
{---
   <div id="map"></div>
   <!-- ここを追加 -->
   <div id="info"></div>
---
   <!-- ここから追加 -->
   map.on('singleclick', function(e) {
    var feature = map.forEachFeatureAtPixel(e.pixel, function(feature) {
     return feature;
    });
    var infoElement = document.getElementById('info');
    infoElement.innerHTML = feature ? feature.get('title') : '';
   });
   <!-- ここまで追加 -->
  </script>
 </body>
</html>


0 件のコメント: