Skip to content

Map convert class

OHTSUKA Ko-hei edited this page Aug 29, 2017 · 8 revisions

Maplatのマップ座標変換クラスについて説明します。

変換クラス

js/tin.jsが座標変換クラスです。

依存モジュール

AMD、CommonJS双方からの呼び出しに対応していますので、require.js経由でのブラウザサイド、Node.JSの双方で動きます。
ブラウザサイドでのStaticな呼び出し、及びCommonJSからのbrowserifyにも対応しているはずですが、テストがされていないのでrequire.jsでの利用を推奨いたします。

オブジェクト生成

var tin = new Tin({
    wh: [width, height],
    points: points
});

whは古地図/絵地図画像のピクセル幅/高さ、pointsは対応点セットの配列です。
対応点セットの配列は、Maplat標準データフォーマットgcps属性の値をそのまま読み込むことを想定しています。

wh, pointsとも省略可能です。
省略した場合、setWh / setPointsメソッドで指定可能です。
また、wh/pointsが差し替えられるたびに変換のための事前計算結果がリセットされるので、何度でも書き換えてオブジェクトの再利用が可能です。
points配列の一部追加/削除などには対応していません(常に全件差し替えになります)。

変換のための事前計算実施

wh, pointsを書き換えても、事前計算結果はリセットされますが自動で再計算開始はされません。
再計算の実施には、updateTinAsyncメソッドを実行します。
本メソッドはtrue/falseの引数を1つ取り、変換計算を必ずstrictモードで行うか(true)、strictモードでエラー発生時にlooseモードに切り替えるか(false)を指定します。
また、メソッドの戻り値はPromiseのため、thenで受けて非同期で処理結果を待機します。

tin.setPoints(points);

tin.updateTinAsync(true).then(function() {
    var illstXy = tin.transform(mapXy, true);
});

strictモードとlooseモード

Maplatは古地図/絵地図座標の変換において、双方向全単射変換を保証可能ですが、それを実現するには、事前計算で生成される三角形網が双方向でトポロジーを維持する必要があります。
トポロジーの維持できる三角形網を生成できた場合、エラーなしとしてオブジェクトはstrict_statusプロパティに文字列値"strict"をセットします。
この状態であれば、双方向変換で全単射が保証されます。
トポロジーの維持できる三角形網を生成できなかった場合の挙動は、updateTinAsyncメソッドの引数によって異なります。

  • 引数にtrueが指定された場合、strictモードでの動作となり、strict_statusプロパティに文字列値"strict_error"がセットされ、またkinksプロパティにトポロジーが維持されなかった結果発生した、三角形同士の辺の交点リストがエラー情報としてセットされます。この状態では、座標変換は正方向(絵地図から標準地図の方向)しか行えません。
  • 引数にfalseが指定された場合、looseモードでの動作となり、トポロジーは維持されないが双方向に全射可能な三角形網が再構築されます。strict_statusプロパティに文字列値"loose"がセットされ、この状態では座標変換は双方向変換できますが、全単射が保証されません。

変換

updateTinAsyncが完了すると、座標変換メソッドtransformの呼び出しが可能になります。
transformの第1引数は変換対象のXY座標です。
第2引数を指定しなかった際は、変換は正方向(絵地図から標準地図の方向)となり、第2引数をtrueで指定した場合は、変換は逆方向(標準地図から絵地図の方向)となります。

コンパイル済データ

setPointsからupdateTinsAsyncを実行すると、大きな地図データの場合、数秒程度事前計算にかかる場合があります。
そのため本クラスには、事前計算結果を取得設定するメソッドがあります。

getCompiled

getCompiledは、オブジェクトからコンパイル済みのデータを取得します。
Maplatの標準データフォーマットのJSONから、gcps属性を削除し、代わりに本メソッドからの戻り値をcompiled属性として加えてやったものが、Maplatのコンパイル済データフォーマットになります。

setCompiled

getCompiledの逆で、コンパイル済みのデータを直接セットします。
Maplatのコンパイル済データフォーマット内のcompiled属性の値をこのメソッドの引数として与えてやれば、updateTinsAsyncを実行することなく、即座に変換ができるようになります。
注: setCompiledを使う場合でも、地図のピクセル幅高さ(wh)の値は先に指定しておく必要があります。