LoginSignup
2
1

More than 5 years have passed since last update.

cs2csにおいて、towgs84は飾りではなかった

Last updated at Posted at 2014-02-22

Proj.4のcs2csにおいて、前記事の投影系関連の疑問氷解。
要するに、こういう事でした。

$ cs2cs -f %.10f +proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs +to +proj=longlat +ellps=clrk80 +no_defs
-61.35 15.42 0
-61.3500000000  15.4200000000 0.0000000000

これが変換前後一致するのは前記事の通りですが、

$ cs2cs -f %.10f +proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs +to +proj=longlat +ellps=clrk80 +towgs84=0,0,0,0,0,0 +no_defs
-61.35 15.42 0
-61.3500000000  15.4216146170 -87.5112862904

こうすると(全部0指定でtowgs84を与える)結果が変わる!
ところが、

$ cs2cs -f %.10f +proj=longlat +ellps=WGS84 +no_defs +to +proj=longlat +ellps=clrk80 +towgs84=0,0,0,0,0,0 +no_defs
-61.35 15.42 0
-61.3500000000  15.4200000000 0.0000000000

こうすると(WGS84側のdatum指定を削除)また変換されなくなる。
最後に確認のため、

$ cs2cs -f %.10f +proj=longlat +ellps=WGS84 +towgs84=0,0,0,0,0,0 +no_defs +to +proj=longlat +ellps=clrk80 +towgs84=0,0,0,0,0,0 +no_defs
-61.35 15.42 0
-61.3500000000  15.4216146170 -87.5112862904

WGS84側にdatumの代わりに全部0指定でtowgs84を与えると、datum指定と同じ結果になります。

投影系でのtowgs84指定は、電子回路でGNDを取るようなもの

これで疑問は氷解しました。
towgs84無指定と、towgs84ゼロ指定は、全く意味の異なるもの だったのです。
ゼロ指定であろうと towgs84指定がされてはじめて、異なる楕円体を用いた相対的な2座標系は、地球中心を原点とした絶対座標系にバインド されるようです。
datum指定は、Proj.4ソースコード内に定義されている通り、よく使う楕円体/towgs84セット等に名前をつけたもののようで、つまりは datumが指定されていれば、towgs84が指定されているのと等価 のようです。

たとえていうなら、これは電子回路でGNDが描かれているか描かれていないか、に近い感じではないでしょうか。
GNDの描かれていない電子回路同士は、たとえ片方には描かれていても、絶対的な電圧値で議論する事はできません。
2つの電子回路両方にGNDが描かれていて初めて、絶対値で議論できるようになると思います。
それと同様、投影系も、towgs84設定が為されていてはじめて、地球中心という絶対座標ベースで結びつけられて変換できますが、towgs84が設定されていなければ、楕円体同士の絶対的関係が定義できないため、経緯度+高度という本来相対的な値を仮に一致していると考えて変換するのでしょう。

[追記]
Proj.4のWikiのFAQの方に、関連ある情報が載っていました

The default datum application behavior changed with the 4.6.0 release. PROJ.4 will now only apply a datum shift if both the source and destination coordinate system have valid datum shift information.

Proj.4のバージョンが4.5.0から4.6.0になった際に、測地系の原点ズレ情報が変換前、後両方の定義に設定されていなければ、ズレを適用しなくなったようです。

proj、cs2csといったコマンドラインの動作は理解できた、次はpj_transform関数の動作を検証

これで、proj、cs2csといったコマンドラインの動作は理解できました。
次回以降は、ではなく、c APIのpj_transform関数の挙動を確かめたいと思います。
というのも、これまでの経験上、pj_transform関数は関数で、projコマンド、cs2csコマンドどちらとも一味違う挙動を示しているようであるからです。
まだ精査しては未検証なのでどんな結果が出るか判りませんが、何か判ればここに書きます。

2
1
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
1