緯度と経度を使用した計算

  • 地球の大きさ
  • 緯度と経度
  • 地球上の2点間の距離を計算

今回は計算がメインになります。
地図上の絶対位置を表すのに「緯度」「経度」「標高」が使用されます。
また、地図上の距離は地球の大きさがわかると計算することができます。
これらの理解に必要な知識を順番に追いかけていきます。

計算方法については国土地理院の「測量計算サイト」( https://vldb.gsi.go.jp/sokuchi/surveycalc/main.html )の
「距離と方位角の計算」( https://vldb.gsi.go.jp/sokuchi/surveycalc/surveycalc/bl2stf.html )で計算式が示されています。

地球の大きさ

参考 : https://ja.wikipedia.org/wiki/%E5%9C%B0%E7%90%83

地球の半径は6356.752 kmになります。
地球は厳密には球ではなく楕円体となり、赤道半径のほうがわずかに大きいです。
赤道半径は6378.137 kmになります。
これは「GRS80」として定義されているものです。

なお、上記画像はShade3Dでレンダリングしています。
地球のテクスチャはNASAのvisible earth ( https://visibleearth.nasa.gov/collection/1484/blue-marble )を使用しています。
ライセンスは「 https://visibleearth.nasa.gov/image-use-policy 」を参照しました。
自由に使用できるライセンスになっています。

緯度と経度

地球の赤道の周囲ぐるっとを「経度」、南北のぐるっとを「緯度」で表現します。

「緯度」は北に向かって0~90度の範囲の「北緯」。南に向かって0~90度の範囲の「南緯」で表します。
赤道廻りの「経度」は、起点となる経度0を「本初子午線」(ロンドンの旧グリニッジ天文台跡)とし、東側に0~180度の範囲の「東経」、西側に0~180度の範囲の「西経」で表します。
今は「本初子午線」ではなく「IERS基準子午線」が使用されます。

参考 : https://ja.wikipedia.org/wiki/%E5%AD%90%E5%8D%88%E7%B7%9A

この緯度と経度により、地球上の絶対位置を指定することができます。

度分秒から10進法へ変換

緯度経度を指定する場合、「度分秒」で表現されている場合があります。
この表現では、1度は60分になります。1分は60秒になります。
1度は60*60=3600秒になります。
これは、時計と同じで60進法です。
例えば、「139度46分02秒」という表記を10進法に変換します。
一度、秒に変換します。

139 * 3600 + 46 * 60 + 2 = 500400 + 2760 + 2 = 503162

計算結果を3600で割ります。

503162 / 3600 = 139.76722222

計算された「139.76722222」が10進法での度数になります。

地球上の2点間の距離を計算

楕円体の場合は計算が複雑になるため、
国土地理院の「測量計算サイト」( https://vldb.gsi.go.jp/sokuchi/surveycalc/main.html )の
「距離と方位角の計算」( https://vldb.gsi.go.jp/sokuchi/surveycalc/surveycalc/bl2stf.html )の計算式を使わせていただきました。

緯度と経度の度数を次のようにルール付けしました。
緯度は北緯(0~90度)と南緯(0~90度)で表されます。
北緯を正、南緯を負として、0 ~ ±90度で指定するようにしました。
経度は東経(0~180度)と西経(0~180度)で表されます。
東経を正、西経を負として、0 ~ ±180度で指定するようにしました。

「始点位置の緯度経度」を(lat1, longi1)としました。
「終点位置の緯度経度」を(lat2, longi2)としました。

これらを入力情報として、Shade3DのPythonスクリプトで計算を行いました。
ソースコードを以下からダウンロードできます。

ダウンロード : DistanceOnEarth.zip

解凍すると、Pythonのソースファイルが展開されます。
これをShade3Dのスクリプトウィンドウにコピーして実行すると、
メッセージウィンドウに「測地線長 : 58.6435569964 (km)」と表示されます。

Pythonソース上の(lat1, longi1)と(lat2, longi2)を変更することで、
始点と終点位置を指定したときの距離(測地線長)を計算することができます。
「測地線長」とは、地球上の2点を結ぶ最短距離を表します。
地球は丸いですので、離れた2点では曲線上の距離が与えられることになります。

なお、「距離と方位角の計算」( https://vldb.gsi.go.jp/sokuchi/surveycalc/surveycalc/bl2stf.html )のページで緯度経度を指定したときの2点間の距離は計算できるため、
別途スクリプトを用意する必要もないかもしれません。

では、これを使用して2点間の距離を実際の緯度経度より求めてみます。

東京駅から新橋駅までの距離を計算

「地理院地図」( https://maps.gsi.go.jp/ )を開き、東京駅から新橋駅までの距離を計算してみます。

東京駅にズームします。
このとき、ウィンドウ上の検索枠で「東京駅」のように検索すると、東京駅周辺の地図に移動します。
「+」のカーソルを東京駅の中心に持ってきました。
このとき、URLでは「35.680952/139.767230」のように表示されています。
この場合は緯度が「35.680952」、経度が「139.767230」になっています。
この数値は、度数で10進法の緯度経度が表示されています。

次に新橋駅に移動します。
新橋駅は、東京駅から1駅離れています。南に移動すると発見できます。

この場合は緯度が「35.666275」、経度が「139.758217」になっています。

以上で、緯度経度は以下のように取得できました。

場所名 緯度 経度
東京駅 35.680952 139.767230
新橋駅 35.666275 139.758217

これを「距離と方位角の計算」( https://vldb.gsi.go.jp/sokuchi/surveycalc/surveycalc/bl2stf.html )に入れると、
「1,821.454(m)」と計算できました。
前述のShade3Dのスクリプトで計算すると「測地線長 : 1.82145419695 (km)」と計算できました。
同じ値になっていると確認できました。

なお、地理院地図で「ツール」で「計測」を選択して2点を指定することにより、
2点間の距離を計算することができます。

Googleマップで確認

では、この緯度経度が他の地図サービスと互換性があるか確認してみます。
「Googleマップ」(https://www.google.co.jp/maps/)で、東京駅と新橋駅の緯度経度を入れて確認します。
左上の検索枠に「緯度 経度」と、緯度と経度の間にスペースを1つ入れて指定します。
「35.680952 139.767230」と東京駅の緯度経度を入力しました。

きちんと東京駅が中央に表示されるのを確認しました。
新橋駅も同様に確認できます。

緯度経度や距離は3DCGではどのように扱う?

以上で、地球上の緯度経度を指定した場合にそこから距離を計算することができるのを確認できました。
では、この情報は3DCGのどこで使用できるのでしょうか?
実際に、Shade3Dに地図と実寸の距離を取り込んでみます。

地理院地図で「設定」-「グリッド表示」を選択し、「緯経度グリッド」をONにします。

グリッドが表示され、それぞれの緯度経度が「度分秒」で表示されています。

隅田川と築地付近を選びました。

それぞれの「緯度/経度」を10進法に変換しました。

度分秒 10進法
35度40分00秒 / 139度46分00秒 35.66666 / 139.76666
35度40分00秒 / 139度47分00秒 35.66666 / 139.78333
35度39分00秒 / 139度46分00秒 35.65000 / 139.76666
35度39分00秒 / 139度47分00秒 35.65000 / 139.78333

この場合グリッド1つのサイズは以下のように、1.509328(km) x 1.848472(km)と計算できました。

これは2点間の距離をそれぞれ計算しました。

地図を画像ファイルとして保存し、グリッド範囲内をトリミングしました。

Shade3Dにイメージをインポート

保存した地図画像をShade3Dにインポートして、ポリゴンメッシュの四角にマッピングしました。
今は、画像のピクセル数をポリゴンメッシュのサイズに割り当てています。

ポリゴンメッシュを選択し、形状情報ウィンドウのバウンディングボックスの「サイズ」で
XとZに1509328と1848472を入力しました。
単位はmmです。
地理院地図のグリッドとして計算した「1.509328(km) x 1.848472(km)」の値を使用しています。

表示幅が足りないため「####」と表示されています
Windowsの場合は[Ctrl]キー(Macの場合は[Option]キー)を押しながら数値入力ボックスをクリックすると、
数値入力を行うダイアログボックスが表示されるため、そこで値を入力します。

これで実寸になりました。

透視図でテクスチャの解像度が低い場合

もし、透視図で表示されるテクスチャの解像度が低い場合、
環境設定ダイアログボックスを表示し「ビュー」タブの「テクスチャサイズ」の値を上げるようにします。

ただし、読み込んだテクスチャイメージの解像度が元々低い場合は
それ以上の解像度にはならないためご注意くださいませ。

Shade3D : 隅田川の「築地大橋」の幅を確認する

Shade3D上では地図は実寸で表示されているため、隅田川にかかる「築地大橋」の幅を確認してみます。
コントロールバーで「メジャーツール」を選択し、透視図で築地大橋の両端をクリックしました。

229720 mmと表示されています。
メートルに変換すると「229.720 (m)」になります。

地理院地図 : 隅田川の「築地大橋」の幅を確認する

地理院地図を開き、築地周辺の墨田川を見ます。
「ツール」で「計測」を選択して築地大橋の両端の2点を選択すると、
Shade3Dと同じ229-230(m)付近となりました。

これで、地図側と3DCG側で情報をやり取りする準備が整いました。
地理院地図で実寸のサイズを確認して3Dモデルとして橋をモデリング、Shade3D側で橋を配置、などなんとなくやることが見えてきたかと思います。
グリッドの4隅の緯度経度より距離としての範囲も確認できましたので、
左上の隅からの相対位置で、指定の緯度経度の位置にある建物を正確に配置する、ということもできそうです。

今回はここまでです。
緯度経度は楕円体上の極座標になり複雑な計算が必要です。
ここから距離を計算し3Dシーンと照らし合わせる、という糸口をつかみました。
次回、地図(平面)に対して立体化された3Dモデルを配置していきます。

カテゴリー: 地形データを活用