-
-
Notifications
You must be signed in to change notification settings - Fork 54
Map convert class
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);
});
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
は、オブジェクトからコンパイル済みのデータを取得します。
Maplatの標準データフォーマットのJSONから、gcps
属性を削除し、代わりに本メソッドからの戻り値をcompiled
属性として加えてやったものが、Maplatのコンパイル済データフォーマットになります。
getCompiled
の逆で、コンパイル済みのデータを直接セットします。
Maplatのコンパイル済データフォーマット内のcompiled
属性の値をこのメソッドの引数として与えてやれば、updateTinsAsync
を実行することなく、即座に変換ができるようになります。
注: setCompiled
を使う場合でも、地図のピクセル幅高さ(wh
)の値は先に指定しておく必要があります。