ol.source.GeoTIFFについて
待望のOpenlayersでGeoTIFFを直接呼び出す手段
しかし
Get a promise for view properties based on the source. Use the result of this function
as theviewoption in a map constructor.
https://github.com/openlayers/openlayers/blob/main/src/ol/source/GeoTIFF.js#L734
とあるようにviewがシーンごとに固定でないと表示ができなさそう。
別々のUTMのシーンをEPSG:3857上で同時に表示するようなことはできない?
できる
ol.source.GeoTIFFはgeotiffのboundingboxとoverviewsの数からtilegridを作る。
- extentはboundingboxから算出される。
- resolutionsはoverviewsごと(geotiff.jsのimageごと)に算出される。
- tileSizesはgeotiff.jsのimageのgetTileWidth,getTileHeightから算出される。
分解能が高い、範囲が広い、overviewsが用意されていないgeotiffはtilegridが次のようになる。
LC82302482014260LGN00_B1.tiff サンプル
extent_: [414000, 8906070, 667230, 9157500]
fullTileRanges_: [TileRange {minX: 0, maxX: 16, minY: 0, maxY: 16}]
maxZoom: 0
minZoom: 0
tileSizes_: [[512, 512]]
グリッドはz=0のみで、16 * 16個に分けられている。
これがキツくて、画面内にgeotiffの範囲が全て含まれるような表示をした場合、瞬間的に大量のリクエストが走る(このケースでは256リクエスト、なおブラウザの同時接続数は6)。
リクエストが返ってくるのにそこそこ時間がかかる場合さらに悲惨なことになる。
ol.source.GeoTIFFはローカルファイルに対応していないため、blobを引数で渡せない。
URL.createObjectURLでurlに直して使えというスタンス。
しかし、ある程度以上のサイズのファイルでは、createObjectURLには長さか容量か何かの制限があるようで、ファイルが欠けてしまいレイヤーの読み込み中にエラーが出る。
ol.source.GeoTIFFがサポートしていないgeotiff
- 投影系のcode(ProjectedCSTypeGeoKey または GeographicTypeGeoKey)が設定されていないもの
- 内部で回転しているもの(依存ライブラリのgeotiff.jsがModelTransformationに対応していないため)
geotiff.jsでは以下のいずれかの場合しかboundingboxが求められずエラーとなる。
- ModelTransformationが定義されている
- ModelPixelScaleが定義されている かつ ModelTiepointが1点(lengthが6)定義されている。
tiePoints
[ x0, y0, z0, x’0, y’0, z’0, x1, y1, z1, x’1, y’1, z’1, …]
値を保つ場合は必ず長さ6以上となる。
modelTransformation
[
00, 01, 02, 03,
04, 05 ,06, 07,
08, 09, 10, 11,
12, 13 14, 15
]
4*4のアフィン変換行列を1次元の配列にしている。
各ピクセルの座標はアフィン変換行列 * [x, y, 0, 1]^Tで求まる。
03と07は[0, 0]ピクセルの座標となる。
サンプル
[
9.77914566241685, -2.090050249445637, 0, 552023.9275999999,
-2.0900502374999945, -9.779145674999997, 0, 2672462.3852999997,
0, 0, 0, 0,
0, 0, 0, 1
]
GeoTIFFImage.getOrigin
原点(左上)の投影座標系での位置[x, y, z]を返す。
基本的にzは0になる。
- tiePointsを持つ(かつ長さが6)のとき、[tiePoints[3], tiePoints[4], tiePoints[5]]を返す。
- modelTransformationを持つときは[modelTransformation[3],modelTransformation[7],modelTransformation[11]]を返す。
tiePoints.length === 6 という判定を入れている。
6以上としてないのはなぜだろう?
おそらく6より多いときは回転しているからmodelTransformationの値を使うべきという判断なのだろう。
GeoTIFFImage.getBoundingBox
画像の四隅の投影座標系での位置[x, y]を返す。
- getOriginで左上の座標を得る。
- getResolutionで1ピクセルあたりの距離を得る。
- 画像のwidthとheightにresolutionをかけて四隅の座標を得る。
つまりmodelTransformationで画像が回転している場合、それが考慮されない。

GeoTIFFImage.readRasters
画像の辺に平行な矩形で取得範囲を指定する。
modelTransformationで画像が回転している場合回転は考慮されない。

座標系早見表
