昨日のエントリで、「平面直角座標系で、X軸の値のみ、またはY軸の値のみを変更したのに、緯度・経度の片方ではなく両方変わってしまうのは、おかしい」という意味のことを書きました。
すかさず「それで正しいのだ」と とーかさんからご指摘をいただき、幾度かのやりとりに加えて自分でも考え調べて、少しだけですが理解が進んだ気がするので、ここにまとめておきます。いつもありがとうございます。
やりとりについて眺めてみたい方は、以下のポストから始まるツリー(ちょっと複雑に枝分かれしています)を追いかけると良いでしょう。
(-10000, 0) の変換は、 axis order が横軸、縦軸の順で解釈されていますが、結果自体は間違っていないと思いますよ。地理院の測量計算サイトなどで検算してみてください https://t.co/yk47CJMMRZ
— とーか (arita) (@tohka383) 2023年9月9日
私がおかしいと思った挙動
前のエントリで書いた内容の繰り返しになりますが、私が当初「こおかしい」と判断した挙動を書いておきます。
平面直角座標系II系の原点位置を緯度経度に変換します。小数点以下深い部分で数値誤差を無視することにして、原点なのでこんな緯度経度が得られます。正しいです。
mysql> SELECT ST_AsText(ST_Transform( ST_GeomFromText('POINT(0 0)', 6670), 6668)); +---------------------------------------------------------------------+ | ST_AsText(ST_Transform( ST_GeomFromText('POINT(0 0)', 6670), 6668)) | +---------------------------------------------------------------------+ | POINT(33.00000000000004 131.0000000000001) | +---------------------------------------------------------------------+
MySQL 8.1.0現在の平面直角座標系変換にはどうも挙動に誤りがあるようで、平面直角座標系の座標を北-東の順に (X Y) で与えるべきところ (Y X)で与えないといけない(誤った動作)があります。今回の実験はこの挙動をいったん受け入れて先に進むことにします。
先のエントリで私が「おかしい」と書いた挙動(今は正しいと理解している)は以下のもの。
平面直角座標系で Y のみを動かしてXは動かしていないのに、Xに対応する緯度も変化してしまっている、というのがその(勘違いの)おかしな挙動です。
mysql> SELECT ST_AsText(ST_Transform( ST_GeomFromText('POINT(-10000 0)', 6670), 6668)); +--------------------------------------------------------------------------+ | ST_AsText(ST_Transform( ST_GeomFromText('POINT(-10000 0)', 6670), 6668)) | +--------------------------------------------------------------------------+ | POINT(32.99995413312006 130.8929839645656) | +--------------------------------------------------------------------------+
原点からXのみを変更した場合は
ちなみに、原点から X(緯度方向)のみを変更した場合はどうなるか。
この場合は、予想通りに緯度のみが変化し、経度は変化しません。
mysql> SELECT ST_AsText(ST_Transform( ST_GeomFromText('POINT(0 10000)', 6670), 6668)); +-------------------------------------------------------------------------+ | ST_AsText(ST_Transform( ST_GeomFromText('POINT(0 10000)', 6670), 6668)) | +-------------------------------------------------------------------------+ | POINT(33.090176066766794 131.0000000000001) | +-------------------------------------------------------------------------+
横メルカトルは緯線経線が直交しない
私が漠然と勘違いし続けていたことがあります。横メルカトルが「メルカトル」という聞き慣れた響きを含むことから、緯線と経線が直交したあの見慣れた図が脳内に浮かんでいました。(縦)メルカトル図法で直交するのは、赤道付近に紙を巻くイメージで考えた時、隣(というのも変ですが5度離れた、とか10度離れた、という程度の意味に捉えてください)の緯線は赤道と平行に存在しています。
一方の横メルカトル。ある子午線に紙を巻くイメージで同様に考えて見えると、隣の子午線は軸となる子午線と並行になりません。南北の極点でぶつかるのが隣の子午線です。だからこれは平面に落としたときに軸となる子午線とは平行にならない。このことを理解できるまでに、随分時間がかかりました。。アタマ堅いなぁ。。 でも沢山のヒントをいただいて考える時間を取ってひとつずつ理解できる内容が増えていく過程は、本当に楽しいものですね。
平面直角座標系と緯度との関係
そんなわけで自分なりに整理した図が、以下のもの。
平面直角座標系II系を例にしています。原点は NE(33.0 131.0)です。
原点からこのまま北方向に、つまりX値のみを加えた場合、緯度のみが変化し経度は変化しません。「Xのみを・・・」の節で示した結果と一致します。
一方、Y値のみを加える場合、つまり平面直角座標系に於いては座標上を右に移動する場合は、図に示したとおりどんどん緯度が小さくなっていきます。(クエリ例では -10km つまり西方向に10km移動させましたが、同じことです)
これが、平面直角座標系で X、Yの片方のみを変更したのに緯度も経度も変化してしまったという事象のカラクリです。正しいのです。
原点以外の場所からの X, Yそれぞれの移動は?
話をシンプルにするために原点からの移動を話題にしましたが、ここで原点以外の地点からの移動を考えてみたいと思います。
Y軸に沿った方向への移動は図からも明らかなとおり、X軸よりも右側ではYが大きくなるほど緯度は小さくなり、Yが小さくなれば緯度が大きくなります。X軸の左側でも同様に考えることができます。
では原点以外の場所から X のみを変化させた場合はどうなるでしょうか。細かい調査と確認過程の説明は省略しますが、図にするとこんな感じになります。北半球、特に具体的に言えばII系を念頭に書いています。この図を見れば Yを固定してXを上下に動かしたときに経度がどのように変化するかイメージできるかと思います。