LoginSignup
2
2

More than 5 years have passed since last update.

emscripten版proj.4で、nadgridsファイルをネット越しに読めるようにする勇者を募集中

Last updated at Posted at 2014-04-18

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の中で、

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の下に、

emproj4.js
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から、グリッドシフト情報の構造体らしきもの。

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の小ネタ集作りました。

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2