2017年5月16日火曜日

OpenLayers4 Tutorials - 6 Raster Reprojection

Raster Reprojection
(http://openlayers.org/en/latest/doc/tutorials/raster-reprojection.html)
ラスターの再投影

OpenLayers は、サーバから配信されるよりも、異なる座標系で WMS、WMTS、静的なイメージ、その他の多くのソースからラスタデータを表示する機能があります。イメージのマップ投影法の変換は、web ブラウザーで直接行われます。座標系がサポートされている Proj4js の view が可能で、以前は互換性のないレイヤが、現在、結合とオーバーレイすることができます。


使い方

API の使用方法は非常に簡単です。ol.View で適切な投影法 (EPSG コードを使用) を指定するだけです。
var map = new ol.Map({
 target: 'map',
 view: new ol.View({
  projection: 'EPSG:3857', //HERE IS THE VIEW PROJECTION
  center: [0, 0],
  zoom: 2
 }),
 layers: [
  new ol.layer.Tile({
   source: new ol.source.TileWMS({
    projection: 'EPSG:4326', //HERE IS THE DATA SOURCE PROJECTION
    url: 'http://demo.boundlessgeo.com/geoserver/wms',
    params: {
     'LAYERS': 'ne:NE1_HR_LC_SR_W_DR'
    }
   })
  })
 ]
});

(ol.source.TileImage または ol.source.Image に基づく) ソースは、現在の ol.View の投影法と別の投影法である場合、再投影はフードの下で自動的に行われます。


OpenLayers サイトの Examples にある例
Raster reprojection demo
OpenStreetMap to WGS84 reprojection
Reprojection with EPSG.io database search
Image reprojection


カスタム投影法

カスタム投影法を使用する最も簡単な方法は、Proj4js ライブラリをプロジェクトに追加し、それから、proj4 定義文字列を使用して投影法を定義することです。次の例は、British National Grid の定義を示しています。

<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/proj4js/2.3.14/proj4.js"></script>

proj4.defs('EPSG:27700', '+proj=tmerc +lat_0=49 +lon_0=-2 +k=0.9996012717 ' +
 '+x_0=400000 +y_0=-100000 +ellps=airy ' +
 '+towgs84=446.448,-125.157,542.06,0.15,0.247,0.842,-20.489 ' +
 '+units=m +no_defs');
var proj27700 = ol.proj.get('EPSG:27700');
proj27700.setExtent([0, 0, 700000, 1300000]);


view(ビュー)投影法の変更

マップを表示するために使用される投影法を切り替えるために、ol.Map 上の選択される投影法を使用して、new ol.View を設定しなければなりません。
map.setView(new ol.View({
 projection: 'EPSG:27700',
 center: [400000, 650000],
 zoom: 4
}));

TileGrid と範囲

投影法が必要な場合、 (ターゲット投影法の)新しいタイルは、「内部で」元のソースタイルから作成されます。再投影されたタイルの TileGrid は、デフォルトでは ol.tilegrid.getForProjection(projection) を使用して内部的に構築されています。投影は、これが正常に動作するために定義される(上記参照)範囲が必要です。

また、カスタムターゲット TileGrid は、手動で構成され、ol.source.TileImage#setTileGridForProjection (projection, tilegrid) を使用してソースインスタンスに設定されます。この TileGrid は、デフォルトのものを作成する代わりに指定された投影法で再投影するとき、使用されます。特定のケースで、これは(タイルサイズを調整することによる)パフォーマンスや(解像度を指定することによる)画質を最適化するために使用できます。


動作の仕方

再投影プロセはス三角形に基づいています--ターゲットラスタは、ol.proj 機能を使用する頂点変換を使用して、三角形の限られた数に分かれています。(proj4js は、カスタム変換の定義に通常利用されます。)三角形の内側のピクセルの再投影は、 (canvas 2d コンテキストによるハードウェア加速のレンダリングで) アフィン(affine)変換で近似されます。

このように、実際の変換の計算の数が比較的少ない(canvas 2d をサポートする)ほぼすべてのハードウェアの proj4js (またはカスタム変換関数) からの投影の広い範囲をサポートできます。

再投影の精度は、そのとき、三角形の数によって制限されます。

再投影プロセスは、ソース(png または gif)から供給されたラスタデータの透明度を維持し、再投影によって生成されたギャップとデータなしのピクセルは自動的に透明になります。


動的な三角形分割

上記の上のイメージは、元のイメージ(左;EPSG:27700)が限られた数の三角形だけで変換変換される(右のEPSG:3857)とき、顕著なエラー(特にエッジ上)を示します。エラーは、使用される三角形の数を増やすことで最小化できます。

いくつかの変換は、より詳細な三角分割ネットワークを必要とするので、動的な三角形分割プロセスは再投影誤差を自動的に測定し、特定のエラーしきい値に合わせて繰り返し細分化します。

デバッグのため、再投影エッジのレンダリングは、ol.source.TileImage#setRenderReprojectionEdges(true) で有効にできます。


高度(Advanced)

再投影の無効

OpenLayers のカスタムビルドを作成し、かつ、再投影コードは必要としない場合、ol.ENABLE_RASTER_REPROJECTION を false に設定し、再投影のサポートを完全に無効にすることによって、ビルドのサイズを減らすことができます。これを行う方法のカスタムビルド(Custom builds)チュートリアルを参照してください。


三角形分割精度のしきい値

ピクセル単位でデフォルトの三角形分割エラーしきい値は、ol.DEFAULT_RASTER_REPROJECTION_ERROR_THRESHOLD (0.5 ピクセル) で与えられます。異なるしきい値が異なるソースに定義される必要がある場合は、タイルイメージソースを構築するとき reprojectionErrorThreshold オプションが渡されます。


範囲による再投影されるマップの可視性の制限

再投影アルゴリズムは、(view の投影法からデータの投影法への) 逆変換を使用します。特定の座標系では、これはマップのソースデータの「二重出現」をもたらす可能性があります。たとえば、EPSG:21781 から EPSG:3857 へスイス連邦共和国のマップを再投影するとき、ヨーロッパの適切な場所に1回、しかし、地球の反対側のニュージーランド近くの太平洋にもう1回、計2回表示されます。


これは逆変換の数学的に正しい動作ですが、複数の場所でレイヤの表示はユーザに期待されていません。考えられる一般的な解決策は、すべての頂点の順変換を計算することですが、これは(特に計算コストの高い変換の場合)パフォーマンスを大幅に低下させます。

したがって、推奨される回避策は、view 投影の ol.layer.Tile に適切な表示の範囲を定義します。このような制限再の設定は、再投影デモの例(Raster Reprojection[reprojection.html])に示します。


解像度計算

読み込むソースタイルを決定するときは、理想的なソースの解像度を計算する必要があります。ol.reproj.calculateSourceResolution(sourceProj、targetProj、targetCenter、targetResolution) 関数は、再投影の間に 1:1 にできるだけ近いピクセルマッピングを達成するために最適な値を計算し、そのときソースから適切なズームレベルを選択するために使用します。

しかし、すべてのターゲットズームレベルのために同じソースのズームレベルを使うことは実用的ではありません--異なる投影法は、世界の異なる部分で大幅に異なる解像度を持つことができ(例えば極地 EPSG:3857 対 EPSG:4326 ) 、全体のズームレベルに単一の解像度を適用すると、いくつかのタイルが拡大/縮小され、ロードされる膨大な数のソースタイルを必要とする可能性があります。したがって、解像度マッピングは (タイル範囲の中央に) 再投影されたタイルごとに個別に計算されます。

0 件のコメント: