2014年5月28日水曜日

1 - ol3-beta.5 17 - Workshop 4.3. Styling Vector Layers

4.3. ベクタレイヤのスタイル
1. ベクタレイヤに建物の水平投影を表示する演習例から始めます。テキストエディタを開き、ワークショップディレクトリのルートに map.html として次のように保存します。
<!doctype html>
<html lang="en">
 <head>
  <link rel="stylesheet" href="ol3/ol.css" type="text/css">
  <style>
   #map {
    background-color: gray;
    height: 256px;
    width: 512px;
   }
  </style>
  <title>OpenLayers 3 example</title>
  <script src="ol3/ol.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',
    renderer: 'canvas',
    layers: [
     new ol.layer.Vector({
      title: 'Buildings',
      source: new ol.source.KML({
       url: 'data/layers/buildings.kml'
      }),
      style: new ol.style.Style({
       stroke: new ol.style.Stroke({color: 'red', width: 2})
      })
     })
    ],
    view: new ol.View2D({
     projection: 'EPSG:4326',
     center: [-122.791859392, 42.3099154789],
     zoom: 16
    })
   });
  </script>
 </body>
</html>

2. ブラウザでこの map.html ファイルを開き、赤いアウトラインの建物を見ます。:http://localhost:8080/ol_workshop/map.html(訳注:Webサーバが動作している任意のディレクトリなら、対応するアドレス。以降、これに準じます。)
3. OpenLayers のスタイリングを基本的に理解した上で、水平投影のサイズに基づいた異なる色の建物を表示するスタイルの関数を作成することができます。マップの初期化コードでは、次のように建物のレイヤのスタイル設定オプションを置き換えます。
style: (function() {
 var defaultStyle = [new ol.style.Style({
  fill: new ol.style.Fill({color: 'navy'}),
  stroke: ol.style.Stroke({color: 'black', width: 1})
 })];
 var ruleStyle = [new ol.style.Style({
  fill: new ol.style.Fill({color: 'olive'}),
  stroke: new ol.style.Stroke({color: 'black', width: 1})
 })];
 return function(feature, resolution) {
  if (feature.get('shape_area') < 3000) {
   return ruleStyle;
  } else {
   return defaultStyle;
  }
 };
})()

4. 変更lを保存し、map.htm をブラウザで開きます。:http://localhost:8080/ol_workshop/map.html



水平投影領域に塗りつぶされた建物。

5. 今、最後のステップとして、建物にラベルを追加してみます。簡単にするために、我々はスタイルとしてラベルと黒のアウトラインだけ使用しています。
style: (function() {
 var stroke = new ol.style.Stroke({
  color: 'black'
 });
 var textStroke = new ol.style.Stroke({
  color: '#fff',
  width: 3
 });
 var textFill = new ol.style.Fill({
  color: '#000'
 });
 return function(feature, resolution) {
  return [new ol.style.Style({
   stroke: stroke,
   text: new ol.style.Text({
    font: '12px Calibri,sans-serif',
    text: feature.get('key'),
    fill: textFill,
    stroke: textStroke
   })
  })];
 };
})()


6. 変更lを保存し、map.htm をブラウザで開きます。:http://localhost:8080/ol_workshop/map.html


キーフィールドによってラベルが付けられた建物。

1 - ol3-beta.5 16 - Workshop 4.2. Understanding Style

4.2. スタイルを理解する
HTML 要素をスタイリングするとき、次のような CSS を使用します。
.someClass {
 background-color: blue;
 border-width: 1px;
 border-color: olive;
}

「.someClass」テキストはセレクタで(この場合は、クラス名 「someClass」を含むすべての要素を選択します)、次は、名前付きプロパティと値のグループですが、スタイル宣言として知られているブロックです。

4.2.1. ol.feature.StyleFunction
ベクタレイヤは、異なるスタイルが選択されている、フィーチャのいくつかの属性に基づいた 「style」設定のための関数を有することができます。スタイル関数は2つの引数、「feature(フィーチャ)」と「resolution(解像度)」を取得します。あなたが 「someClass」の値と共に「class」という名前の属性を持つすべてのフィーチャにスタイルを適用すると仮定すると、次のように、スタイル関数をはじめることになります。
style: function(feature, resolution) {
 if (feature.get('class') === 'someClass') {
  // return the style
 }
}

4.2.2. Symbolizers
CSS の宣言ブロックと同義は、OpenLayers 3 では symbolizer です。(これらは通常、ol.style.* のインスタンスです。)青の背景と1ピクセル幅のオリーブ色のストロークでポリゴンフィーチャを塗るには、次のような2つの symbolizer を使用します。
new ol.style.Style({
 fill: new ol.style.Fill({
  color: 'blue'
 }),
 stroke: new ol.style.Stroke({
  color: 'olive',
  width: 1
 })
});

ジオメトリタイプに応じて、異なる symbolizer を適用することができます。ライン(線)はポリゴン(面)のように動作しますが、それらは塗りつぶすことができません。ポイント(点)は ol.style.Circle または ol.style.Icon でスタイリングすることができます。前者は円形形状を描画するために使用され、後者はファイルのグラフィックス(例えば、PNG画像)を使用します。ここでは、円のスタイルの例です。
new ol.style.Circle({
 radius: 20,
 fill: new ol.style.Fill({
  color: '#ff9900',
  opacity: 0.6
 }),
 stroke: new ol.style.Stroke({
  color: '#ffcc00',
  opacity: 0.4
 })
});

4.2.3. ol.style.Style
ol.style.Style オブジェクトは4つのキー:fill(塗りつぶし)、image(イメージ)、stroke(線)およびtext(テキスト)を持っています。また、オプション zIndex プロパティがあります。スタイル関数は ol.style.Style オブジェクトの配列を返します。「someClass」の値でクラス属性を持っているものを除いて(それらのフィーチャは、1px 幅のオリーブ色の縁の青色で塗りつぶす)すべてのフィーチャを赤く着色したい場合は、、スタイル関数を以下のように作成します。(ところで、それはそれらが再利用できるようにスタイルの関数の外側でオブジェクトを作成することが重要ですが、オブジェクトがインラインに作成された下の例の理由は簡単にするためです。)
style: (function() {
 var someStyle = [new ol.style.Style({
  fill: new ol.style.Fill({
   color: 'blue'
  }),
  stroke: new ol.style.Stroke({
   color: 'olive',
   width: 1
  })
 })];
 var otherStyle = [new ol.style.Style({
  fill: new ol.style.Fill({
   color: 'red'
  })
 })];
 return function(feature, resolution) {
  if (feature.get('class') === "someClass") {
   return someStyle;
  } else {
   return otherStyle;
  }
 };
}())

注意:実際、関数の外側でスタイルの配列を作成することが重要です。上記の例では、これはクロージャを用いて行うことができます。
注意:フィーチャは、引数として解像度のみを持つ関数を取ることができるスタイル設定オプションを持っています。これは、(解像度に基づく)個々のフィーチャのスタイルをすることが可能です。

4.2.4. 擬似クラス
CSS はセレクタに擬似クラスを可能にします。これらはマウスの位置、隣接する要素、またはブラウザ履歴のような、セレクタ内で簡単に置き換えられない内容(コンテキスト)に基づいたスタイル宣言の適用を基本的に制限します。OpenLayers 3 では、いくらか似たような概念であるフィーチャオーバーレイにスタイル設定オプションを持っています。フィーチャオーバーレイが ol.interaction.Select の選択されたフィーチャを示すために使用され、独自のスタイル設定オプションを取得します。例を次に示します。
var select = new ol.interaction.Select({
 featureOverlay: new ol.FeatureOverlay({
  style: new ol.style.Style({
   fill: new ol.style.Fill({
    color: 'rgba(255,255,255,0.5)'
   })
  })
 })
});

スタイリングの基本を体験したので、ベクタレイヤのスタイルに移動する時です。(訳注:原文では、「styling vector layers」にリンクが設定されています。)

1 - ol3-beta.5 15 - Workshop 4.1. Working with Vector Layers

4. ベクタスタイリング
4.1. ベクタレイヤの演習
ベース ol.layer.Vector コンストラクタは、かなり柔軟なレイヤタイプが提供されています。デフォルトで、新しいベクタレイヤを作成するとき、これは ol.source.Vector の定義域(domain)であるため、レイヤのためのフィーチャの由来に前提条件はありません。レンダリングスタイルのカスタマイズは今後のセクションで扱われています。このセクションでは、ベクタデータフォーマットの基本を紹介します。

4.1.1. ol.format
OpenLayers 3 の ol.format クラスは、ベクタフィーチャを描画するサーバからのデータの解析を担当しています。ほとんどの場合、それらを直接使用することはできませんが、それに対応するソース(例えばol.source.KML)を使用することがあります。フォーマットは生のフィーチャデータを ol.Feature オブジェクトに変換します。
下の2つのデータブロックを考えてみましょう。どちらも同じ ol.Feature オブジェクト(スペイン、バルセロナのポイント)を表します。最初は、(ol.format.GeoJSON パーサーを使用して)GeoJSON としてシリアル化されます。2つ目は(ol.format.KML パーサーを使用して)KML としてシリアル化されます。

4.1.1.1. GeoJSON Example
{
 "type": "Feature",
 "id": "OpenLayers.Feature.Vector_107",
 "properties": {},
 "geometry": {
  "type": "Point",
  "coordinates": [-104.98, 39.76]
 }
}

4.1.1.2. KML Example
<?xml version="1.0" encoding="utf-8"?>
<kml xmlns="http://earth.google.com/kml/2.2">
 <Placemark>
  <Point>
   <coordinates>-104.98,39.76</coordinates>
  </Point>
 </Placemark>
</kml>

1 - ol3-beta.5 14 - Workshop 3.4. Modifying Features

3.4. フィーチャの修正
フィーチャの修正は、ol.interaction.Modify と組み合わせて ol.interaction.Select を使用して動作します。それらは共通の ol.FeatureOverlay を共有しています。

3.4.1. ベクタレイヤーと変更インスタレーションを作成
タスク
1. それでは演習例を始めます。テキストエディタで map.html を開き、以下のように修正して、確認します。
<!doctype html>
<html lang="en">
 <head>
  <link rel="stylesheet" href="ol3/ol.css" type="text/css">
  <style>
    #map {
     height: 256px;
     width: 512px;
    }
  </style>
  <title>OpenLayers 3 example</title>
  <script src="ol3/ol.js" type="text/javascript"></script>
 </head>
 <body>
  <h1>My Map</h1>
  <div id="map"></div>
  <script type="text/javascript">
   // 追加 3.4.1
   var source = new ol.source.GeoJSON({
    url: 'data/layers/7day-M2.5.json'
   });
   var overlay = new ol.FeatureOverlay({
    style: new ol.style.Style({
     image: new ol.style.Circle({
      radius: 7,
       fill: new ol.style.Fill({
        color: [0, 153, 255, 1]
       }),
       stroke: new ol.style.Stroke({
        color: [255, 255, 255, 0.75],
        width: 1.5
       })
      }),
      zIndex: 100000
    })
   });
   var modify = new ol.interaction.Modify({ featureOverlay: overlay });
   var select = new ol.interaction.Select({ featureOverlay: overlay });
   var map = new ol.Map({
    interactions: ol.interaction.defaults().extend([modify, select]), // 修正 3.4.1
    target: 'map',
    renderer: 'canvas',
    layers: [
     new ol.layer.Tile({
      title: "Global Imagery",
      source: new ol.source.TileWMS({
       url: 'http://maps.opengeo.org/geowebcache/service/wms',
       params: {LAYERS: 'bluemarble', VERSION: '1.1.1'}
      })
     }),
     new ol.layer.Vector({
      title: 'Earthquakes',
      source: source, // 修正 3.4.1
      style: new ol.style.Style({
       image: new ol.style.Circle({
        radius: 5,
        fill: new ol.style.Fill({
         color: '#0000FF'
        }),
        stroke: new ol.style.Stroke({
         color: '#000000'
        })
       })
      })
     })
    ],
    view: new ol.View2D({
     projection: 'EPSG:4326',
     center: [0, 0],
     zoom: 1
    })
   });
  </script>
 </body>
</html>

2. map.html の変更を保存し、ブラウザでページを開きます。: http://localhost:8080/ol_workshop/map.html(訳注:Webサーバが動作している任意のディレクトリなら、対応するアドレス。以降、これに準じます。)フィーチャの変更の実行を確認するには、地震(の発生場所)の選択のためマウスクリックと、ポイントを移動するためにドラッグを使用します。

3.4.2. 詳しく見る
フィーチャの修正が動作するしくみを調べてみます。
var overlay = new ol.FeatureOverlay({
 style: new ol.style.Style({
  image: new ol.style.Circle({
   radius: 7,
   fill: new ol.style.Fill({
    color: [0, 153, 255, 1]
   }),
   stroke: new ol.style.Stroke({
    color: [255, 255, 255, 0.75],
    width: 1.5
   })
  }),
  zIndex: 100000
 })
});
var modify = new ol.interaction.Modify({ featureOverlay: overlay });
var select = new ol.interaction.Select({ featureOverlay: overlay });

2つのインターラクション、フィーチャを修正する前に選択するための ol.interaction.Select と実際のジオメトリを修正する ol.interaction.Modify です。それらは、フィーチャが修正のために選択され、ドラッグされるときに使用されるスタイルを与えられる ol.FeatureOverlay のインスタンスを共有します。ユーザが再びマップ内をクリックすると、フィーチャがレイヤのスタイルを使用して描画されます。

1 - ol3-beta.5 13 - Workshop 3.3. Drawing Features

3.3. フィーチャを描く
新しいフィーチャは ol.interaction.Draw を使用して描画することができます。描画インターラクションは、ベクタソースおよびジオメトリタイプで構成されています。

3.3.1. ベクタレイヤと描画インターラクションを作成
タスク
1. 以下の例を始めます。テキストエディタで map.html を開き、以下のように修正して、確認します。
<!doctype html>
<html lang="en">
 <head>
  <link rel="stylesheet" href="ol3/ol.css" type="text/css">
  <style>
    #map {
     height: 256px;
     width: 512px;
    }
  </style>
  <title>OpenLayers 3 example</title>
  <script src="ol3/ol.js" type="text/javascript"></script>
 </head>
 <body>
  <h1>My Map</h1>
  <div id="map"></div>
  <script type="text/javascript">
   // 追加 3.3.1
   var source = new ol.source.GeoJSON({
    url: 'data/layers/7day-M2.5.json'
   });
   var draw = new ol.interaction.Draw({
    source: source,
    type: 'Point'
   });
   var map = new ol.Map({
    interactions: ol.interaction.defaults().extend([draw]),     // 修正 3.3.1
    target: 'map',
    renderer: 'canvas',
    layers: [
     new ol.layer.Tile({
      title: "Global Imagery",
      source: new ol.source.TileWMS({
       url: 'http://maps.opengeo.org/geowebcache/service/wms',
       params: {LAYERS: 'bluemarble', VERSION: '1.1.1'}
      })
     }),
     new ol.layer.Vector({
      title: 'Earthquakes',
      source: source, // 修正 3.3.1
      style: new ol.style.Style({
       image: new ol.style.Circle({
        radius: 5,
        fill: new ol.style.Fill({
         color: '#0000FF'
        }),
        stroke: new ol.style.Stroke({
         color: '#000000'
        })
       })
      })
     })
    ],
    view: new ol.View2D({
     projection: 'EPSG:4326',
     center: [0, 0],
     zoom: 1
    })
   });
  </script>
 </body>
</html>

2. map.html の変更を保存し、ブラウザでページを開きます。: http://localhost:8080/ol_workshop/map.html(訳注:Webサーバが動作している任意のディレクトリなら、対応するアドレス。以降、これに準じます。)ポイントジオメトリの描画の実行を確認するには、新しいフィーチャを追加するために、マップ内をクリックします:


ベクタソースにフィーチャを追加するために描画インターラクションを使用。

ボーナスタスク
1. 描画された後、新しいフィーチャの X と Y を取得するリスナを作成します。

1 - ol3-beta.5 12 - Workshop 3.2. Selecting Features

3.2. フィーチャを選択する
レイヤモジュールで見てきたように、ベクタとしてフィーチャを引き出し、ベースマップの上にそれらを描くことができます。ベクタデータを提供することの利点の一つは、ユーザがデータとインターラクション(対話型操作)ができることです。この例では、ユーザが選択し、フィーチャ情報を表示することができるベクタレイヤを作成します。

3.2.1. ベクタレイヤと選択インターラクションを作成
タスク
1. 前のセクションからの演習例から始めます。テキストエディタで map.html を開き、以下のように修正して、確認します。
<!doctype html>
<html lang="en">
 <head>
  <link rel="stylesheet" href="ol3/ol.css" type="text/css">
  <style>
    #map {
     height: 256px;
     width: 512px;
    }
  </style>
  <title>OpenLayers 3 example</title>
  <script src="ol3/ol.js" type="text/javascript"></script>
 </head>
 <body>
  <h1>My Map</h1>
  <div id="map"></div>
  <script type="text/javascript">
   var map = new ol.Map({
    // 追加 3.2.1
    interactions: ol.interaction.defaults().extend([
     new ol.interaction.Select({
      featureOverlay: new ol.FeatureOverlay({
       style: new ol.style.Style({
        image: new ol.style.Circle({
         radius: 5,
         fill: new ol.style.Fill({
          color: '#FF0000'
         }),
         stroke: new ol.style.Stroke({
          color: '#000000'
         })
        })
       })
      })
     })
    ]),
    target: 'map',
    renderer: 'canvas',
    layers: [
     new ol.layer.Tile({
      title: "Global Imagery",
      source: new ol.source.TileWMS({
       url: 'http://maps.opengeo.org/geowebcache/service/wms',
       params: {LAYERS: 'bluemarble', VERSION: '1.1.1'}
      })
     }),
     new ol.layer.Vector({
      title: 'Earthquakes',
      source: new ol.source.GeoJSON({
       url: 'data/layers/7day-M2.5.json'
      }),
      style: new ol.style.Style({
       image: new ol.style.Circle({
        radius: 5,
        fill: new ol.style.Fill({
         color: '#0000FF'
        }),
        stroke: new ol.style.Stroke({
         color: '#000000'
        })
       })
      })
     })
    ],
    view: new ol.View2D({
     projection: 'EPSG:4326',
     center: [0, 0],
     zoom: 1
    })
   });
  </script>
 </body>
</html>

2. map.html の変更を保存し、ブラウザでページを開きます。: http://localhost:8080/ol_workshop/map.html(訳注:Webサーバが動作している任意のディレクトリなら、対応するアドレス。以降、これに準じます。)フィーチャ選択の実行を確認するには、地震(の発生場所)を選択するためマウスのクリックを使用します。


ベクタレイヤからフィーチャを選択するためにインターラクションを利用。

1 - ol3-beta.5 11 - Workshop 3.1. Displaying a Scale Line

3. コントロールとインターラクション(対話操作)
3.1. スケールラインを表示する
マップに表示するもうひとつの典型的なウィジェットは、スケールバーです。OpenLayers 3 はまさにこのために ol.control.SaleLine を提供しています。

3.1.1. ScaleLine コントロールの作成
タスク
1. テキストエディタで map.html を開きます。
2. マップの設定のどこかに、地図に新しいスケールラインコントロールを作成するための次のコードを追加します。
controls: ol.control.defaults().extend([
  new ol.control.ScaleLine()
]),

3. 変更を保存し、map.htm をブラウザで開きます。:http://localhost:8080/ol_workshop/map.html(訳注:Webサーバが動作している任意のディレクトリなら、対応するアドレス。以降、これに準じます。)


左下隅にあるデフォルトのスケールバー。

3.1.2. ScaleLine コントロールの移動
画像の上のスケールバーを読むのは少し難しいかもしれません。スケールの視認性を向上させるために取るべきアプローチ(見やすくする方法)がいくつかあます。あなたがマップのビューポート内のコントロールを維持したい場合は、ドキュメントの CSS 内でいくつかのスタイル宣言を追加することができます。これをテストするには、次のようなものでスケールバーに背景色とパディング(ボーダとコンテンツの間隔)を含めることができます。
.ol-scale-line, .ol-scale-line:not([ie8andbelow]) {
  background: black;
  padding: 5px;
}

しかしながら、この演習のために、マップのビューポートがひどく混雑しつつあると思うでしょう。このような過剰な混雑を避けるには、別の場所にスケールを表示することができます。これを実現するためには、まず最初に、マークアップに追加要素を作成して、それから、この新しい要素の中でスケールコントロールにそのものを描画することを指示する必要があります。

タスク
1. ページの <body> に新しいブロックレベル要素を作成します。要素の参照を簡単にするために、それに id 属性を与えます。map.html ページの <body> のどこかに次のマークアップを挿入します。(マップビューポート要素 <div id="map"></div> の後でスケール要素を右に配置することは、理にかなっています。):
<div id="scale-line" class="scale-line"></div>

2. ここでは、「scale-line」要素を参照するために、スケールコントロールを作成するコードを修正します。
controls: ol.control.defaults().extend([
  new ol.control.ScaleLine({className: 'ol-scale-line', target: document.getElementById('scale-line')})
]),

3. 変更を保存し、map.html をブラウザで開きます。:http://localhost:8080/ol_workshop/map.html
.scale-line {
  position: absolute;
  top: 350px;
}
.ol-scale-line {
  position: relative;
  bottom: 0px;
  left: 0px;
}

4. ここで、変更を保存し、ブラウザで map.html を再び表示します。:http://localhost:8080/ol_workshop/map.html


マップビューポートの外側のスケールライン制御。

注意:ol.control.Control から(ol.inherits を使用して)継承できるカスタムコントロールを作成します。この例を参照するために、次を確認します。:http://ol3js.org/en/master/examples/custom-controls.html

1 - ol3-beta.5 10 - Workshop 2.5. Image Vector

2.5. 画像ベクタ
データとスタイリングが比較的安定しているときは、OpenLayers が、性能によってベクタデータから画像を生成することがわかります。

2.5.1. ol.source.ImageVector
それでは世界地図の上に地震データを取得するために、ベクタレイヤの例に戻ります。
<!doctype html>
<html lang="en">
 <head>
  <link rel="stylesheet" href="ol3/ol.css" type="text/css">
  <style>
    #map {
     height: 256px;
     width: 512px;
    }
  </style>
  <title>OpenLayers 3 example</title>
  <script src="ol3/ol.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',
    renderer: 'canvas',
    layers: [
     new ol.layer.Tile({
      title: "Global Imagery",
      source: new ol.source.TileWMS({
       url: 'http://maps.opengeo.org/geowebcache/service/wms',
       params: {LAYERS: 'bluemarble', VERSION: '1.1.1'}
      })
     })
    ],
    view: new ol.View2D({
     projection: 'EPSG:4326',
     center: [0, 0],
     zoom: 0,
     maxResolution: 0.703125
    })
   });
  </script>
 </body>
</html>

タスク
1. テキスト·エディタで map.html を開き、上記からベクタ例の内容をコピーします。変更を保存して、ブラウザで正しく見えることを確認します。:http://localhost:8080/ol_workshop/map.html(訳注:Webサーバが動作している任意のディレクトリなら、対応するアドレス。以降、これに準じます。)
2. ベクタレイヤを次のように変更します。
new ol.layer.Image({
 title: 'Earthquakes',
 source: new ol.source.ImageVector({
  source: new ol.source.GeoJSON({
   url: 'data/layers/7day-M2.5.json'
  }),
  style: new ol.style.Style({
   image: new ol.style.Circle({
   radius: 3,
    fill: new ol.style.Fill({color: 'white'})
   })
  })
 })
})

ブラウザで http://localhost:8080/ol_workshop/map.html を再読み込みします。

注意:同じベクタデータのように見ますが、イメージとして描かれます。これは、それでもフィーチャ検出のようなものを可能にしますが、ベクタデータが鮮明でなくなります。これは基本的に性能と品質との釣り合いのためです。

2.5.1.1. 詳しく見る
それでは何が起こっているか理解するために、そのレイヤの作成を検討してみます。
new ol.layer.Image({
 title: 'Earthquakes',
 source: new ol.source.ImageVector({
  source: new ol.source.GeoJSON({
   url: 'data/layers/7day-M2.5.json'
  }),
  style: new ol.style.Style({
   image: new ol.style.Circle({
   radius: 3,
    fill: new ol.style.Fill({color: 'white'})
   })
  })
 })
})

ol.layer.Vector の代わりに ol.layer.Image を使用しています。しかしながら、オリジナルの ol.source.GeoJSON ベクタソースに接続する ol.source.ImageVector を通じて、ここでは、それでも、ベクタデータを使用することができます。スタイルはレイヤ上ではなく、 ol.source.ImageVector の設定として提供されます。

ボーナスタスク
1. そのフィーチャ検出が、それでも、forEachFeatureAtPixel を呼び出す地図上のシングルクリックリスナを登録することによって動作し、マップビューポートの下の地震情報を表示することを確認します。

1 - ol3-beta.5 9 - Workshop 2.4. Vector Layers

2.4. ベクタレイヤ
ベクタレイヤは ol.layer.Vector で表され、ベクタデータのクライアント側の表示を処理しています。現在、OpenLayers 3 はキャンバスレンダラのベクタ描画だけをサポートしています。

2.4.1. クライアント側のフィーチャ描画
基本の世界地図を取得するには、WMS の例に戻ります。ベクタレイヤのこの上にいくつかのフィーチャデータを追加します。
<!doctype html>
<html lang="en">
 <head>
  <link rel="stylesheet" href="ol3/ol.css" type="text/css">
  <style>
    #map {
     height: 256px;
     width: 512px;
    }
  </style>
  <title>OpenLayers 3 example</title>
  <script src="ol3/ol.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',
    renderer: 'canvas',
    layers: [
     new ol.layer.Tile({
      title: "Global Imagery",
      source: new ol.source.TileWMS({
       url: 'http://maps.opengeo.org/geowebcache/service/wms',
       params: {LAYERS: 'bluemarble', VERSION: '1.1.1'}
      })
     })
    ],
    view: new ol.View2D({
     projection: 'EPSG:4326',
     center: [0, 0],
     zoom: 0,
     maxResolution: 0.703125
    })
   });
  </script>
 </body>
</html>


タスク
1. テキストエディタで map.html を開き、最初の WMS 例の内容をコピーします。変更を保存して、ブラウザで正しく見えることを確認します。:http://localhost:8080/ol_workshop/map.html(訳注:Webサーバが動作している任意のディレクトリなら、対応するアドレス。以降、これに準じます。)
2. マップの初期化コードでタイルレイヤの後にもうひとつのレイヤを追加(続けて貼り付け)します。これは GeoJSON に格納されている一連のフィーチャを要求したマップに新しいベクタレイヤを追加します。
new ol.layer.Vector({
 title: 'Earthquakes',
 source: new ol.source.GeoJSON({
  url: 'data/layers/7day-M2.5.json'
 }),
 style: new ol.style.Style({
  image: new ol.style.Circle({
   radius: 3,
   fill: new ol.style.Fill({color: 'white'})
  })
 })
})



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

注意:GeoJSON データは EPSG:4326 の投影法で、マップのビューも、EPSG:4326 なので、再投影は必要ありません。ソースの投影法とビューの投影法が異なる場合、「projection」プロパティはフィーチャキャッシュの投影を示しているソースに設定しなければなりません。これは、通常、ここでは、ビューの投影法を設定することを意味します。

2.4.1.1. 詳しく見る
それでは何が起こっているか理解するために、そのベクタレイヤの作成を検討してみます。
new ol.layer.Vector({
 title: 'Earthquakes',
 source: new ol.source.GeoJSON({
  url: 'data/layers/7day-M2.5.json'
 }),
 style: new ol.style.Style({
  image: new ol.style.Circle({
   radius: 3,
   fill: new ol.style.Fill({color: 'white'})
  })
 })
})


レイヤは、「title」の「Earthquakes」といくつかのカスタムオプションを与えられています。オプションオブジェクトでは、「url」 を指示する ol.source.GeoJSON タイプの「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 3 でサポートされているフォーマットの空間情報がある追加データを見つけることができるかどうか参照してください。もし、「data」ディレクトリ内の空間データを表現する別のドキュメントを保存するなら、マップ上のベクタレイヤで表示することができます。

1 - ol3-beta.5 8 - Workshop 2.3. Proprietary Raster Layers

2.3. 所有権のあるラスタレイヤ
前のセクションでは、標準規格に準拠した WMS とカスタムタイルキャッシュに基づいてレイヤを表示しました。オンライン地図(または少なくともタイルマップクライアント)は、主に所有権のあるマップタイルサービスが、利用されやすさによって広く知れ渡っています。OpenLayers は、そのAPIを通して、これらの所有権のあるサービスを利用したレイヤタイプが用意されています。
このセクションでは、Bing のタイルを使用したレイヤーを追加することによって、前のセクションで開発された例を構築していきます。
OpenLayers 3 と Google マップを統合する方法を見るには、次を確認してください。:http://ol3js.org/en/master/examples/google-map.html

2.3.1. Bing!
Bing のレイヤーを追加してみましょう。
タスク
1. map.html ファイルで、OSM ソースが設定されている場所を探して、ol.source.BingMaps に変更してください。
source: new ol.source.BingMaps({
 imagerySet: 'Road',
 key: 'Ak-dzM4wZjSqTlzveKz5u0d4IQ4bRzVI309GxmkgSVr1ewS6iPSrOvOKhA-CJlm3'
})

注意:Bing のタイル API は、マッピングアプリケーションで使用する API キーを登録する必要があります。ここでの例では、生産に使用することはできない API キーを使用しています。生産に Bing のレイヤを使用するには、https://www.bingmapsportal.com/ で API キーを登録します。
(訳注:公開方法によってライセンスの種類が違うので、詳しくは上記サイトを参照して下さい。)
2. 変更を保存して、ブラウザで map.html をリロードします。http://localhost:8080/ol_workshop/map.html(訳注:Webサーバが動作している任意のディレクトリなら、対応するアドレス。以降、これに準じます。)


Bing Maps のソースからのタイルマップ。

2.3.1.1. 完全な演習例
改訂した map.html ファイルは、次のようになります。
<!doctype html>
<html lang="en">
 <head>
  <link rel="stylesheet" href="ol3/ol.css" type="text/css">
  <style>
   #map {
    height: 256px;
    width: 512px;
   }
   .ol-attribution ul, .ol-attribution a, .ol-attribution a:not([ie8andbelow]) {
    color: black !important;
   }
  </style>
  <title>OpenLayers 3 example</title>
  <script src="ol3/ol.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',
    renderer: 'canvas',
    layers: [
     new ol.layer.Tile({
      source: new ol.source.BingMaps({
       imagerySet: 'Road',
       key: 'Ak-dzM4wZjSqTlzveKz5u0d4IQ4bRzVI309GxmkgSVr1ewS6iPSrOvOKhA-CJlm3'
      })
     })
    ],
     view: new ol.View2D({
      center: ol.proj.transform([-93.27, 44.98], 'EPSG:4326', 'EPSG:3857'),
      zoom: 9
    })
   });
  </script>
 </body>
</html>

1 - ol3-beta.5 7 - Workshop 2.2. Cached Tiles

2.2. キャッシュタイル
デフォルトでは、タイルレイヤが、256×256(ピクセル)画像をマップのビューポートに埋めるかそれ以上になるように、要求されます。地図のいろいろなところをパンし、拡大すると、画像の要求が、まだ訪れたことのない地域を埋めるために、さらに送られます。ブラウザが、要求された画像をいくつかキャッシュしますが、処理動作の多くは、一般的に、動的に画像を描画するためにサーバが必要とされています。
タイルレイヤが規則的な格子状の画像を要求しているため、サーバがこれらの画像の要求をキャッシュし、あなた(または他の誰か)が同じ地域を訪れた次の機会に、キャッシュされた結果を返すことができます。結果的に、すべての地域のパフォーマンスが向上することになります。

2.2.1. ol.source.XYZ
ウェブマップサービス(WMS)の仕様では、クライアントが要求できるものに多くの柔軟性があります。実際にキャッシュが困難または不可能にする制約はありません。
反対に、あるサービスは、固定されたズームレベルでだけ、そして、規則的なグリッドだけ、タイルを提供できます。これらは、XYZ ソースを使ったタイルレイヤとして一般化することができます。 - XとYはグリッドの列および行を示し、Zはズームレベルを表すと考えられます。

2.2.2. ol.source.OSM
OpenStreetMap(OSM)のプロジェクトは、世界中の自由に利用できる地図データを収集し、作るための努力をしています。OSM は、キャッシュされたタイルセットとして、いくつかの異なるレンダリングのデータを提供します。これらのレンダリングは、基本的な XYZ グリッド配置に適合し、OpenLayers のマップで使用できます。ol.source.OSM レイヤソースは OpenStreetMap のタイルにアクセスします。

タスク
1 テキストエディタで、前のセクションの map.html ファイルを開き、以下のように、マップの初期化コードを変更します。
<script type="text/javascript">
 var map = new ol.Map({
  target: 'map',
  renderer: 'canvas',
  layers: [
   new ol.layer.Tile({
    source: new ol.source.OSM()
   })
  ],
  view: new ol.View2D({
   center: ol.proj.transform([-93.27, 44.98], 'EPSG:4326', 'EPSG:3857'),
   zoom: 9
  })
 });
</script>

2 同じドキュメントの <head> に、レイヤ属性のためのスタイル宣言をいくつか追加します。
<style>
 #map {
  width: 512px;
  height: 256px;
 }
 .ol-attribution ul, .ol-attribution a, .ol-attribution a:not([ie8andbelow]) {
  color: black !important;
 }
</style>

3 変更内容を保存し、ブラウザでページを更新します。
:http://localhost:8080/ol_workshop/map.html(訳注:Webサーバが動作している任意のディレクトリなら、対応するアドレス。以降、これに準じます。)



OpenStreetMapのソースとタイルレイヤとマップ。

2.2.2.1. 詳しく見る
2.2.2.1.1. 投影法
マップのビュー定義を確認します。
view: new ol.View2D({
 center: ol.proj.transform([-93.27, 44.98], 'EPSG:4326', 'EPSG:3857'),
 zoom: 9
})

地理空間データは、すべての座標参照系になることができます。一つのデータセットは、度数で地理座標(緯度と経度)を使用し、もう一つはメートル単位のもので、限られた地域で使う投影法の座標参照系を使用します。座標参照系の完全な説明は、このモジュールの範囲外ですが、基本的な概念を理解することが重要です。
OpenLayers 3 は、データの座標参照系を知る必要があります。内部的には、これは ol.proj.Projection オブジェクトで表されます。ol.proj 名前空間の「transform」関数も座標参照系(上の例では "EPSG:3857" と " EPSG:4326")を表す文字列を取ります。

2.2.2.1.2. 位置設定変換
使用する OpenStreetMap のタイルは、メルカトル図法です。このため、メルカトル座標を使用して、中心の初期値を設定する必要があります。座標参照系で、関心の場所の座標を見つけることは比較的容易なので、座標参照系("EPSG:4326")をメルカトル座標("EPSG:3857")に換える ol.proj.transform メソッドを使用します。

2.2.2.1.3. カスタムマップオプション
注意:ここで使用される投影法が OpenLayers 3 が知っている唯一の投影法です。他の投影法のために、投影を設定する必要があります。
var projection = ol.proj.configureProj4jsProjection({
  code: 'EPSG:21781',
  extent: [485869.5728, 76443.1884, 837076.5648, 299941.7864]
});

そして、2つの追加のスクリプトタグを含める必要があります。
<script src="http://cdnjs.cloudflare.com/ajax/libs/proj4js/1.1.0/proj4js-compressed.js" type="text/javascript"></script>
<script src="http://cdnjs.cloudflare.com/ajax/libs/proj4js/1.1.0/defs/EPSG21781.js" type="text/javascript"></script>

この情報は、EPSG コードを使用していて、http://spatialreference.org/ で見つけることができます。

2.2.2.1.4. レイヤーの作成
layers: [
 new ol.layer.Tile({
  source: new ol.source.OSM()
 })
],

前と同じように、レイヤーを作成し、マップの config オブジェクトのレイヤー配列に追加します。このとき、ソースのすべてのデフォルトオプションを受け入れます。

2.2.2.1.5. スタイル
.ol-attribution ul, .ol-attribution a, .ol-attribution a:not([ie8andbelow]) {
 color: black;
}

マップコントロールの処理は、このモジュールの範囲外ですが、これらのスタイル宣言は、スニークプレビュー(訳注:試し画像?)を与えます。デフォルトでは、ol.control.Attribution コントロールは、すべてのマップに追加されます。これはレイヤのソースにマップビューポート内の属性情報を表示させます。上記の宣言は、マップのこの属性のスタイルを変更します。(マップ右下の著作ラインに注意)
公的に利用可能なキャッシュされたタイルセットを使ったレイヤを理解したら、所有権のあるラスタレイヤでの演習に移りましょう。(原文では、「proprietary raster layers」がリンクになっています。)

1 - ol3-beta.5 6 - Workshop 2.1. Web Map Service Layers

2. レイヤとソース
2.1. ウェブマップサービス(Web Map Service[WMS])レイヤ

マップにレイヤを追加するとき、レイヤのソースは、一般的に、表示するデータを取ってくることに起因しています。要求されたデータは、ラスタまたはベクタデータのいずれかです。ラスタデータは、サーバ側で描画された画像情報と同じ、と考えることができます。ベクタデータは、サーバから構造化された情報として提供され、表示するためにクライアント(ブラウザ)上で描画されます。

ラスタマップデータを提供する異なる形式のサービスがたくさんあります。このセクションでは、OGC(Open Geospatial Consortium)の ウェブマップサービス(Web Map Service[WMS])仕様に準拠しているプロバイダ(提供者)を扱っています。

2.1.1. レイヤーの作成
完全に動作するマップの例から始めて、動作を理解するためにレイヤを修正します。

次のコードをみていきます。
<!doctype html>
<html lang="en">
 <head>
  <link rel="stylesheet" href="ol3/ol.css" type="text/css">
  <style>
    #map {
     height: 256px;
     width: 512px;
    }
  </style>
  <title>OpenLayers 3 example</title>
  <script src="ol3/ol.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',
    renderer: 'canvas',
    layers: [
     new ol.layer.Tile({
      title: "Global Imagery",
      source: new ol.source.TileWMS({
       url: 'http://maps.opengeo.org/geowebcache/service/wms',
       params: {LAYERS: 'bluemarble', VERSION: '1.1.1'}
      })
     })
    ],
    view: new ol.View2D({
     projection: 'EPSG:4326',
     center: [0, 0],
     zoom: 0,
     maxResolution: 0.703125
    })
   });
  </script>
 </body>
</html>

タスク
1. まだ行っていない場合は、ワークショップでのディレクトリのルートにmap.htmlとして上記のテキストを保存します。
2. 動作を確認するには、ブラウザでページを開きます。
http://localhost:8080/ol_workshop/map.html(訳注:Webサーバが動作している任意のディレクトリなら、対応するアドレス。以降、これに準じます。)

2.1.2. ol.layer.Tile コンストラクタ
ol.layer.Tile コンストラクタは、 olx.layer.TileOptions 型のオブジェクトリテラルを取得します。次を参照してください。
http://ol3js.org/en/master/apidoc/olx.layer.html#TileOptions

この場合、「source(ソース)」キーのオプションに ol.source.TileWMS を提供しています。レイヤの人間が読み取り可能なタイトルは、「title(タイトル)」キーを設けることがでますが、基本的にキーの任意の名前を、ここで使用することができます。OpenLayers 2 で、これはレイヤのすべての部分だったのに対し、OpenLayers 3 では、レイヤとソースの間に隔たりがあります。

ol.layer.Tile は、画像の規則的な格子を示し、ol.layer.Image は、単一の画像を表します。レイヤの種類に応じて、別のソース(ol.source.ImageWMS に対して ol.source.TileWMS)を使用します。

2.1.3. ol.source.TileWMS コンストラクタ
ol.source.TileWMS コンストラクタは、http://ol3js.org/en/master/apidoc/olx.source.html#TileWMSOptions によって、定義される単一の引数を持っています。url は、WMS サービスのオンライン·リソースであり、「params」は、パラメータ名とその値を持つオブジェクトリテラルです。デフォルトの WMS バージョンは OpenLayers では、現在、1.3.0 なので、WMS 1.3.0 をサポートしていない場合は、「params」の中で下位バージョンの提供が必要になることがあります。
layers: [
 new ol.layer.Tile({
  title: "Global Imagery",
  source: new ol.source.TileWMS({
   url: 'http://maps.opengeo.org/geowebcache/service/wms',
  params: {LAYERS: 'bluemarble', VERSION: '1.1.1'}
  })
 })
]

タスク
1. これと同じ WMS は「openstreetmap」という名前のレイヤーを提供しています。「bluemarble」から「openstreetmap」へ LAYERS パラメータの値を変更します。修正した ol.layer.Tile コンストラクタは次のようになります。
new ol.layer.Tile({
 title: "Global Imagery",
 source: new ol.source.TileWMS({
  url: 'http://maps.opengeo.org/geowebcache/service/wms',
  params: {LAYERS: 'openstreetmap', VERSION: '1.1.1'}
 })
})

2. レイヤとソースを、タイルに換えて単一のイメージを持つように変更します。ヒントについては、次の API ドキュメントのページを見てください:http://ol3js.org/en/master/apidoc/ol.layer.Image.html と http://ol3js.org/en/master/apidoc/ol.source.ImageWMS.html。このプロセスの間に、url (を http://suite.opengeo.org/geoserver/wms へ)、そして、レイヤ名も(opengeo:cuntries へ)変更する必要があります。256×256ピクセルのタイルでなく、必ず一枚の画像が要求されていることを確認するには、ブラウザの開発者ツールの[ネットワーク]タブを使用します。



「image/png」形式の「openstreetmap」のレイヤーを表示するマップ。

ウェブマップサービス(WMS)から動的にレンダリングされたデータで演習するには、キャッシュされたタイルサービスについて学ぶために移動します。(原文では「cashed and services]がリンクになっています。)

1 - ol3-beta.5 5 - Workshop 1.3. OpenLayers Resources

1.3. OpenLayers のリソース
OpenLayers ライブラリは、機能が豊富にあります。開発者はその機能の例を提供するために努力を重ね、他の経験豊富な開発者がそのやり方を見つけることを可能にする方法でコードを編集してきたので、多くのユーザはそれがゼロから始めるための挑戦であることを見つけます。

1.3.1. 例から学ぶ
新規のユーザは、OpenLayers のイグザンプル(例)コードに取り組み、始めるために最も便利な方法である、ライブラリの可能な機能を使って試すことを、大概、見つけ出します。

http://ol3js.org/en/master/examples/

1.3.2. ドキュメントを参照
特定のトピックについての詳細は、拡張中の OpenLayers のドキュメントのコレクションを参照します。

http://ol3js.org/en/master/doc/quickstart.htmlhttp://ol3js.org/en/master/doc/tutorials

1.3.3. APIリファレンスを検索
マップを作成しコントロールする基本的な構成要素を理解した後に、メソッドのシグネチャとオブジェクトのプロパティの詳細については、APIリファレンスマニュアルを検索します。

signatures:プログラミングで, 関数の戻り値の型や引数の数といった特性

http://ol3js.org/en/master/apidoc/

1.3.4. コミュニティに参加
OpenLayers は、あなたのような開発者とユーザのコミュニティによってサポートされ、維持されています。問い合わせ、または、提供するコードがあるなら、メーリングリストにサインアップすることで参加することができます。

https://groups.google.com/forum/#!forum/ol3-dev

1.3.5. 問題を報告
問題を報告するためには、OpenLayers のライブラリが配布されているいくつかの性質の違いを理解することが重要です。

ol.js - Google クローザコンパイラを使用してアドバンスドモード(可読形式ではありません)で構築されたスクリプト。

ol-simple.js - Google グローザコンパイラを使用して単純なモードで構築されたスクリプト(詳細は以下を参照してください。

https://developers.google.com/closure/compiler/faq)

ol-whitespace.js - デバッグの問題のために使用することができる人間が読めるバージョン。

問題が発生した場合には、ol-whitespace.js を使用して問題を報告することが重要です。また、Chrome 開発ツールのような Web 開発ツールを使用して見つけることができる完全なスタックトレースが含まれています。ol.layer.Tile を ol.layer.Image に変更することで map.html に間違えが起こるかを試します。分かるエラーは、次のとおりです。Uncaught TypeError: Object #<yc> はメソッド 'tb' がありません。メーリングリストに報告したとき、誰もそれが何を意味するか知りません。まず最初に、代わりに ol.js の指定を ol-whitespace.js の指定にスクリプトタグを変更します。ページをリロードします。デバッガは、現在、エラー時に停止し、完全なスタックトレースを見ることができます:
(原文[http://ol3js.org/ol3-workshop/basics/resources.html]では、ここに ol-whitespace.js の出力例があります。)

スタックトレースを示すデバッガ。マウスの右ボタンを使用すると、クリップボードにコールスタックをコピーすることができます。

1 - ol3-beta.5 4 - Workshop 1.2. Dissecting Your Map

1.2. マップを解析
前のセクションで示したように、マップは、マークアップ、スタイル宣言、および、初期化コードを一緒に用いることによって生成されます。これらの部分を個々にもう少し詳わしくみていきます。

1.2.1. マップマークアップ
前の例のマップのマークアップは、単一のドキュメント要素を生成します。?

<div id="map"></div>

この <div> 要素は、マップのビューポートのコンテナとして機能します。ここでは、<div> 要素を使用していますが、ビューポートのコンテナは、任意のブロックレベル要素とすることができます。

このケースでは、マップのターゲット(target)として参照できるように、コンテナに id 属性を与えます。

1.2.2. マップスタイル
OpenLayers には、マップ関連の要素をスタイリングする方法を指定するデフォルトのスタイルシートが付属しています。map.html ページにこのスタイルシートを正確に追加します。(<link rel="stylesheet" href="ol3/ol.css" type="text/css">)

OpenLayers がマップの大きさを推測(して表示)することはありません。このため、次の基本のスタイルシートは、マップにページ上に区域を与えるために、少なくとも1つのカスタム(作成した)スタイル宣言を入れる必要があります。
<link rel="stylesheet" href="ol3/ol.css" type="text/css">
<style>
 #map {
  height: 256px;
  width: 512px;
 }
</style>

このケースでは、マップコンテナの id 値をセレクタとして使用し、マップコンテナの幅(512px)と高さ(256px)を指定します。

スタイル宣言は、この(HTML)ドキュメントの <head> に直接、入れています。ほとんどの場合、スタイル宣言に関連したマップは、外部スタイルシートにリンクした、比較的大きなウェブサイトのテーマの一部になっています。

1.2.3. マップの初期化
マップを生成する次のステップは、いくつかの初期化コードを入れることです。この場合、その演習を行うためにドキュメントの下の <body> に <script> 要素を入れます。
<script type="text/javascript">
 var map = new ol.Map({
  target: 'map',
  renderer: 'canvas',
  layers: [
   new ol.layer.Tile({
    title: "Global Imagery",
    source: new ol.source.TileWMS({
     url: 'http://maps.opengeo.org/geowebcache/service/wms',
     params: {LAYERS: 'bluemarble', VERSION: '1.1.1'
     }
    })
   })
  ],
  view: new ol.View2D({
   projection: 'EPSG:4326',
   center: [0, 0],
   zoom: 0,
   maxResolution: 0.703125
  })
 });
</script>

注意:これらのステップの順序は重要です。カスタムスクリプトが実行される前に、OpenLayers のライブラリをロードする必要があります。この例では、OpenLayers のライブラリはドキュメントの <script src="ol3/ol.js"></script> のある <head>(タグ)内でロードされます。

同様に、(上記の)カスタムマップの初期化コードは、ビューポートのコンテナとして機能するドキュメント要素、この場合は <div id="map"></div>、が準備されるまで実行できません。ドキュメントの最後 <body> に初期化コードがあることにより、マップが生成する前にライブラリがロードされていて、ビューポートのコンテナが準備できていることを確認します。

それでは、マップの初期化スクリプトが何をしているか、もっと詳わしくみていきます。このスクリプトは、いくつかの設定オプションを伴った新しい ol.Map オブジェクトを作成しています。

target: 'map'

マップコンストラクタにマップを描画する場所を伝えるため、ビューポートのコンテナの id 属性の属性値を使用します。このケースでは、マップコンストラクタのターゲットとして、文字列値「map」を渡します。この構文は、便利なショートカットです。要素(例えば document.getElementById('map'))へ直接参照することにより明確に提供することができます。

レンダラ設定オプションは、どのレンダラを使用するか指定します。OpenLayers 3 は3つのレンダラ(DOM レンダラ、Canvus レンダラ、WebGL レンダラ)を実行します。このケースでは、Canvus レンダラを使用するようにマップに伝えています。画像が別のドメインから来ているので、同一オリジンポリシーために、WebGLのレンダラでは動作しません。(訳注:「same origin policy - 同一生成元ポリシー」については、「MDN 同一生成元ポリシー https://developer.mozilla.org/ja/docs/Web/JavaScript/Same_origin_policy_for_JavaScript」などを参照してください。)

renderer:'canvus'

レイヤ設定は、マップに表示するためのレイヤを生成します。
layers: [
 new ol.layer.Tile({
  title: "Global Imagery",
  source: new ol.source.TileWMS({
   url: 'http://maps.opengeo.org/geowebcache/service/wms',
   params: {LAYERS: 'bluemarble', VERSION: '1.1.1'}
  })
 })
],

この部分が新しいことでも、この構文に疑問を持たないでください。レイヤーの作成は、別の単位で説明します。理解するための重要な部分は、マップビューはレイヤの集まりであるということです。地図を見るために、少なくとも一つのレイヤを含める必要があります。

最後のステップは、ビューを定義します。投影法、中心とズームレベルを指定します。また、GeoWebCache を扱うことができない boundingboxes を要求しないことを確認するため maxResolution を指定します。
view: new ol.View2D({
 projection: 'EPSG:4326',
 center: [0, 0],
 zoom: 0,
 maxResolution: 0.703125
})

最初のマップの解析に成功しました!次は、OpenLayers の開発について学びます。

1 - ol3-beta.5 3 - Workshop 1.1. Creating a Map

2013 OpenLayers 3 Workshop(http://ol3js.org/ol3-workshop/index.html)を参考に、OpenLayers 3 を使ってみます。

2013 OpenLayers 3 Workshop
OpenLayers 3 ワークショップへようこそ。
このワークショップは、Webマッピングソリューションとして OL3 の全体的な概要を説明するように設計されています。
演習は、セットアップページで説明したように、このワークショップのデータがあるローカルの GeoServer を設定していることを前提としています。(訳注:GeoServer が設定されていなくてもワークシップは試すことができます。)
このワークショップは、履修単位を一式にして提供されています。

各単位において、読者は、その単位の特定の目標を達成するように設計された課題一式を履修します。
各単位は、前の単位で学んだレッスンに基づいて構築され、読者の知識ベースを反復して構築するために設計されています。

以下の単位が、このワークショップで説明されています:

基礎
◆基本
 ol3 で Webページに地図を追加する方法(を学習)。
◆レイヤとソース
 ラスタとベクタレイヤについて(を学習)。
◆コントロールとインターラクション
 マップコントロールの使用について(を学習)。

高度なトピックス
◆ベクタスタイリング
 ベクタレイヤを詳細に探る。


1.1. 地図の作成
OpenLayers では、マップは、レイヤのコレクション、および、ユーザとの対話を処理するための様々なインタラクションとコントロールです。マップは、3つの基本的な部分:マークアップ、スタイル宣言、初期化コードで作成されます。

1.1.1. 演習例
それでは OpenLayers 3 マップの完全な演習例をみてみましょう。
<!doctype html>
<html lang="en">
 <head>
  <link rel="stylesheet" href="ol3/ol.css" type="text/css">
  <style>
    #map {
     height: 256px;
     width: 512px;
    }
  </style>
  <title>OpenLayers 3 example</title>
  <script src="ol3/ol.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',
    renderer: 'canvas',
    layers: [
     new ol.layer.Tile({
      title: "Global Imagery",
      source: new ol.source.TileWMS({
       url: 'http://maps.opengeo.org/geowebcache/service/wms',
       params: {LAYERS: 'bluemarble', VERSION: '1.1.1'
       }
      })
     })
    ],
    view: new ol.View2D({
     projection: 'EPSG:4326',
     center: [0, 0],
     zoom: 0,
     maxResolution: 0.703125
    })
   });
  </script>
 </body>
</html>


タスク
1. https://github.com/bartvde/ol3-training/archive/master.zipをダウンロードして、Webサーバのルートにあるフォルダに保存します。(訳注:Webサーバが動作しているフォルダで OK です。)
2. 新しいファイル map.html に上記のテキストをコピーして、ダウンロードしたフォルダのルート(訳注:または、1 のフォルダ。)に保存します。
3. Webブラウザで次の演習マップを開きます:http://localhost:8080/ol_workshop/map.html(訳注:1 に対応するアドレス。以降、これに準じます。)



世界画像を表示する演習地図

最初の地図を作成できたので、続けて各部をより詳しくみていくことにします。

1 - ol3-beta.5 2 - Quick Start

Quick Start(http://ol3js.org/en/master/doc/quickstart.html)を参考に、OpenLayers 3 を使ってみます。

「Put a map on a page」のコードを新しいファイル(訳注:例えば、Eclipse の HTML ファイル)にコピーします。
<!doctype html>
<html lang="en">
 <head>
  <link rel="stylesheet" href="http://ol3js.org/en/master/css/ol.css" type="text/css">
  <style>
   .map {
    height: 400px;
    width: 100%;
   }
  </style>
  <script src="http://ol3js.org/en/master/build/ol.js" type="text/javascript"></script>
  <title>OpenLayers 3 example</title>
 </head>
 <body>
  <h2>My Map</h2>
  <div id="map" class="map"></div>
  <script type="text/javascript">
   var map = new ol.Map({
    target: 'map',
    layers: [
     new ol.layer.Tile({
      source: new ol.source.MapQuest({layer: 'sat'})
     })
    ],
    view: new ol.View2D({
     center: ol.proj.transform([37.41, 8.82], 'EPSG:4326', 'EPSG:3857'),
     zoom: 4
    })
   });
  </script>
 </body>
</html>



どのようになっているか理解する
地図をWebページに表示するには3つのことが必要になります:
1 OpenLayers を読み込む。
2 <DIV>マップコンテナ。
3 単純なマップを作成するための JavaScript.

OpenLayers を読み込む

<script src="http://ol3js.org/en/master/build/ol.js" type="text/javascript"></script>

最初の部分は、JavaScriptライブラリを読み込んでいます。このチュートリアルのために、ここでは簡単にライブラリ全体を取得するための ol3js.org ウェブサイトを設定しています。本番環境では、我々のアプリケーションに必要なモジュールのみを含むライブラリのカスタムバージョンを構築します。

マップを含む <div>

<div id="map" class="map"></div>

アプリケーション内の map(マップオブジェクト)は <div> HTML 要素に入れます。この <div> により、幅、高さ、および境界線のような map のプロパティは、CSSで制御できます。ここに示したのは、400ピクセルの高さとブラウザウィンドウと同じ幅の地図を作るために使用されるCSS要素です。

<style>
 .map {
  height: 400px;
  width: 100%;
 }
</style>

単純なマップを作成するための JavaScript

var map = new ol.Map({
 target: 'map',
 layers: [
  new ol.layer.Tile({
   source: new ol.source.MapQuest({layer: 'sat'})
  })
 ],
 view: new ol.View2D({
  center: ol.proj.transform([37.41, 8.82], 'EPSG:4326', 'EPSG:3857'),
  zoom: 4
 })
});

この JavaScript コードを使用すると、map オブジェクトは、東アフリカの海岸にズームされたマップクエストオープンエアリアル(MapQuest Open Aerial)レイヤで作成されます。それでは、これを詳しくみてみます。

次の行は、OpenLayers の map オブジェクトを作成します。レイヤやそれに取り付けられたインターラクション(訳注:対話型操作。フィーチャ選択や描画操作など。)がないなら、これは、それ自体だけでは、何もしません。

var map = new ol.Map({ ... });

map オブジェクトを <div> タグに配置するには、map オブジェクトの引数に、target を入れます。<div> タグの id 属性の(属性)値になります。

target: 'map'

layers:[...] 配列は、マップで使用可能なレイヤのリストを定義するために使用されています。最初で唯一のレイヤは今のところタイル(画像)レイヤです。

layers: [
 new ol.layer.Tile({
  source: new ol.source.MapQuest({layer: 'sat'})
 })
]

OpenLayers 3 のレイヤは、ソースを含む形式(画像やタイル、ベクタ)で定義されています。 ソースは、マップタイルを取得するために使用されるプロトコルです。ここから有用なレイヤソースのリストを参照できます。(原文では、"ol.source" の API ページにリンクしています。)

map オブジェクトの次の部分は、view です。view は、地図の中心、解像度、回転を指定することができます。今のところ、View2D だけがサポートされていますが、他のビューは、随時利用可能になります。 view を定義する最も簡単な方法は、中心点とズームレベルを定義することです。ズームレベル0はズームアウトされていることに注意してください。

view: new ol.View2D({
 center: ol.proj.transform([37.41, 8.82], 'EPSG:4326', 'EPSG:3857'),
 zoom: 4
})

指定された中心は、緯度/経度の座標(EPSG:4326)であることがわかります。 使用する唯一のレイヤが球状メルカトル図法(EPSG:3857)なので、即座に正しい座標にマップをズームする(焦点を合わす)ことができるように、それらを再投影することができます。

1 - ol3-beta.5 1 - はじめに

OpenLayers が 3 になってメジャーバージョンアップされます。現在は、v.3.0.0-beta.5 になっています。今回のバージョンアップで API が大きく変更されます。あらためて使い方をみていきます。ホームページを意訳していますので、内容はそちらを確認してください。

OpenLayers
http://openlayers.org/

にライセンスについて記述があります。OpenLayers は、2クラス BSD ライセンスに準拠している、フリーでオープンソースの JavaScript です。OpenLayers 3 についてもこれに準じていると思われます。詳しくは「2-clause BSD License」リンクをクリックして参照してください。BSD ライセンスについては、

The BSD 2-Clause License
http://opensource.org/licenses/bsd-license.php

BSDライセンス テンプレート
http://sourceforge.jp/projects/opensource/wiki/licenses%2Fnew_BSD_license

を参照してください。

ソースコーソは無償で使用できます。改造もできます。
ソースコードの再配布には(自分が使用している分も含めて)、上記「2-clause BSD License」リンク先の文章を表示する必要があります。
内容は、ソースコードを使用したときに起こることについて、全て免責されることが記述されています。

「Toward OpenLayers 3!(OpenLayers 3 に向けて!)」には、OpenLayers 3 の特徴が書かれています。最新の HTML5 と CSS3 の機能に基づいてライブラリ全体が書き直されていること。OpenLayers 2.x の機能を殆どサポートしていること。パフォーマンスの改善、軽量化、鮮明なビジュアルコンポーネント、API の改良が行なわれていること、などです。

具体的な機能については、3D 機能を実行するための WebGL を提供すること、3D 地球儀図と 2D 地図を作成する JavaScript ライブラリ Cesium を統合していること、Google が提供する JavaScript ライブラリ圧縮・高速化ツール「Closure Compiler」でライブラリを作成できること、ベースコードを書き直してアクセスを改善していること、ドキュメントの品質を上げていることです。

Cesium
(http://cesiumjs.org/)
Closure Tools(Closure Compiler)
(https://developers.google.com/closure/compiler/?hl=ja)

OpenLayers のライブラリは、ダウンロードするか、Git リポジトリのクローンを使用します。このクローンは、常に最新版を提供します。