emscripten版proj.4で、nadgridsファイルをネット越しに読めるようにする勇者を募集中。
これさえクリアできれば、JavaScript上で完全なproj.4+αを再現できるはず…なのだが、そもそもnadgridsファイルの意味も判ってないし、emscriptenのネット越しデータ取得ノウハウもないし、同期と非同期の差をどうクリアするかも考えてないし、前途多難。
freadの在処等を元に、今判ってる事…
nadgridsファイルにはいくつかフォーマットがあるっぽい、そのうち
ctable, ctable2については、nad_init.cの中で読んでいる。
ntv1, ntv2, gtxについては、pj_gridinfo.cの中で読んでいる模様。emscriptenで遠隔からファイルを取るには、emscripten_async_wgetを使えばよいっぽい。
https://groups.google.com/forum/#!topic/emscripten-discuss/MYdoVxKVY78
[追記1]
判らないなりにぼんやりと…
下手にfreadあたりをネット経由の読み込みに置き換える事を考えるよりも、JavaScriptでするにせよemscripten_async_wgetでするにせよ、ネット越しに読み込んできたファイルをemscriptenの仮想ファイルシステム上に置いて、そこから標準の処理で読み込ませた方が話が早そう?
emscriptenの仮想ファイルシステムの理解が必要そう…。
[追記2]
試しにサンプルプロジェクトで
$ ~/emscripten/em++ -o hello.html hello.cpp --embed-file data.txt --embed-file data2.txt
みたいな事やってみると、生成されたhello.jsの中で、
Module['FS_createDataFile']('/', 'data.txt', [72, 101, 108, 108, 111, 44, 32, 70, 105, 108, 101, 32, 83, 121, 115, 116, 101, 109, 33, 10, 10], true, true);
Module['FS_createDataFile']('/', 'data2.txt', [72, 101, 108, 108, 111, 44, 32, 70, 105, 108, 101, 32, 83, 121, 115, 116, 101, 109, 33, 10, 10], true, true);
みたいな記述が生成されることがわかった。
これを使えば、動的にnadgridを作成できるかも。
方針は見えたかな?
- 既存のままで、とりあえず静的にnadgridファイルを付加してコンパイルしてやって、nadgridつき投影法の投影がテスト通るか確かめる
- proj_text定義の中身をパースして、nadgrid定義が含まれていれば動的に取得して、FS_createDataFileで仮想ファイルシステムに加えてやる処理をJSで書く
でいけるかも…。
[追記3]
そんな単純なもんでもなかった。
エラーの出てるNAD27のnadgrids定義は、
+nadgrids=@conus,@alaska,@ntv2_0.gsb,@ntv1_can.dat
なので、単純にコンパイルしてやって、proj.4がnadgridsファイルを探しにいく仕様の/usr/local/shareの下に、
Module['FS_createPath']('/', 'usr', true, true);
Module['FS_createPath']('/usr', 'local', true, true);
Module['FS_createPath']('/usr/local', 'share', true, true);
Module['FS_createDataFile']('/usr/local/share', 'conus', [...], true, true);
Module['FS_createDataFile']('/usr/local/share', 'alaska', [...], true, true);
Module['FS_createDataFile']('/usr/local/share', 'ntv1_can.dat', [...], true, true);
と作って(ntv2_0.gsbだけはファイルが見つからなかったため省略、テストデータを作ってるのも同じ環境のため多分無問題)テストを走らせてみたが、エラー数減少せず。
試しに、ファイルを作るのを'/usr/local/share'下ではなく、'/'下にしてみたが特に変化なし。
とりあえず現状、お手上げ。
[追記4]
電車に乗ってる間に書いた、次手動かせるようになったらやってみることメモ:
- もしかしたらコンパイル環境での、環境変数値が定数としてコンパイルされてるのかもしれない。
/opt/localとか試してみる。 => 早速やったがダメだった - ダメだったら、cロジックの中でnadgridsファイル名生成してるところ洗い出してデバグ出力
- いきなり実践的な変換でなく、ダミー投影系でもいいので簡単なものから試す。ただのwgs84定義にconus読み込ませてみるとか。
それでテストケース作って、小さくデバグ。
[追記5]
projects.hから、グリッドシフト情報の構造体らしきもの。
typedef struct _pj_gi {
char *gridname; /* identifying name of grid, eg "conus" or ntv2_0.gsb */
char *filename; /* full path to filename */
const char *format; /* format of this grid, ie "ctable", "ntv1",
"ntv2" or "missing". */
int grid_offset; /* offset in file, for delayed loading */
struct CTABLE *ct;
struct _pj_gi *next;
struct _pj_gi *child;
} PJ_GRIDINFO;
こいつの中のfilename属性見てやれば、それを見に行ってるという事と思うので、それを仮想ファイルシステム内の名前にしてやれば何とかなるか?
[追記6]
奇麗なインタフェースの準備とかはまだですが、とりあえず読めるようにはなりました。
その調査中に覚えたemscriptenの小ネタ集作りました。