7章 3D地形図エンジン
著者:梅谷 武
語句:3D地形図エンジン, ITRF, WGS84, ジオイド, GRS80, 地域メッシュ, 1次メッシュ, 2次メッシュ, 2万5千分1地形図, ウォッちず, GML, 標高データ, 場所移動法
ToposNoteの3D地形図エンジンについて述べる。
作成:2010-03-11
更新:2011-10-14
 測地系とは地球上の位置を表すための空間座標系です。原点を地球の中心にとり、X-Y平面は赤道面、Z軸は地球の自転軸に一致するように定められます。現在の日本では測量法において、ITRF国際地球基準座標系に準拠した世界測地系を使うことが定められていますが、これは米国のGPSGlobal Positioning Systemで採用されているWGS84との差がcmのオーダーであり、実質的には同じものと考えることが出来ます。ToposNoteはこの世界測地系を採用しています。
 地球の形は回転楕円体として近似できます。地表面の形をより正確に近似するためにガウスJohann Carl Friedrich Gauss, 1777-1855は平均海水面と一致する重力の等ポテンシャル面で近似する方法を提案し、これをジオイドgeoidと名付けました。地球内部の密度分布が一様で無いことから、ジオイドは回転楕円体にはなりません。そこでジオイドを回転楕円体で近似することが必要になってきます。このジオイドを近似する回転楕円体として、さまざまなものが提案されています。現在では1979年の国際測地学地球物理学連合(IUGG)総会で採用されたGRS80が最もよい近似であるとされています。WGS84で採用している回転楕円体とGRS80との差は1mm以下であり、これも実質的には同じものと考えることが出来ます。
 日本では2002年3月31日まで、東京湾平均海面を基準としたベッセル楕円体を使って、独自の天文観測により測定された日本測地系が使われていましたが、これは世界測地系と比較すると東京付近で400m程度の差があります。現状、日本国内においては、旧日本測地系による地図と世界測地系による地図が混在しており、完全に世界測地系に移行するまでにはまだ時間がかかるものと予想されます。
 国土地理院発行の地図においても、世界測地系と旧日本測地系の違いは、新図郭と旧図郭の違いとなって現れます。ToposNoteではこれらが混在する問題に対しては、旧図郭の地図を新図郭に変換する機能で対応しています。
 ToposNoteは便宜上、幾何座標系(Cx,Cy,Cz)と測地座標系(Lat,Lng,Alt)を次の変換式により対応させています。
Lng
=
Cx
360.0
+ K0
Lat
=
Cy
360.0 × Rik
+ I0
Alt
=
250.0 × Cz
                    K0
=
139.75
I0
=
35.666666666666667
Rik
=
1.2254309136009816
この変換により世界座標系の原点に対応する場所は、測量法における日本経緯度原点とは異なり、日本経緯度原点に最も近い2次メッシュの基準点となります。
 曲面を平面に写していますから、角度や距離が正確に保たれませんが、数十kmの範囲の局所的な領域を考えている分には、一般的な利用には十分な近似になっています。但し、測量目的で利用することはできません。より広範囲の領域を考えるときには、Google Earthのような電子地球儀が必要になってきます。
地域メッシュとは、日本国内各地域を統計的に取り扱うために、緯線・経線によりほぼ同じ面積になるように網目状に区分したもので、 それを符号付けしたものが地域メッシュコードです。昭和48年の行政管理庁(現総務省)告示「統計に用いる標準地域メッシュおよび標準地域メッシュ・コード」が1976年にJIS化されて現在に至っています。
 面積が大きい順に1次メッシュ、2次メッシュ、3次メッシュと細分されますが、ToposNoteにおいては1次メッシュと2次メッシュのみを利用しています。1次メッシュは国土地理院発行の1/200000地勢図一枚に対応する4桁の数字で、2次メッシュは同じく1/25000地形図一枚に対応する6桁の数字です。
 日本の領土範囲は、東西が東経122度から154度まで、南北が北緯20度から46度までとなっています。1次メッシュはこの範囲を東西は1度単位で32に、南北は40分単位で39に分割します。これにより、日本の領土は1248区画に分割されますが、各区画の南西端の緯度を1.5倍すると2桁の整数になり、経度から100を引いた数も2桁の整数となります。これらの数を緯度経度の順に並べて作った4桁の数を、この区画の1次メッシュコードと定義します。
 Pythonを使った計算例を示します。
算譜7.1.3.6 1次メッシュコード
# coding: utf-8
 
def LatLng2FirstMeshCode( lat, lng ):
if ( ( lat < 20.0 ) or ( lat >= 46.0 ) ):
print "エラー:緯度が範囲を超えています。"; return;
if ( ( lng < 122.0 ) or ( lng >= 154.0 ) ):
print "エラー:経度が範囲を超えています。"; return;
latd = int( lat * 1.5 );
lngd = int( lng - 100.0 );
print "%d%d" % ( latd, lngd )
 
def FirstMeshCode2LatLng( code ):
latd = int( code[0:2] );
lngd = int( code[2:4] );
if ( ( latd < 30 ) or ( latd >= 69 ) ):
print "エラー:緯度が範囲を超えています。"; return;
if ( ( lngd < 22 ) or ( lngd >= 54 ) ):
print "エラー:経度が範囲を超えています。"; return;
lat = latd / 1.5;
lng = lngd + 100.0;
print "(%f,%f)" % ( lat, lng )
 
LatLng2FirstMeshCode( 34.1, 136.1 );
FirstMeshCode2LatLng( "5136" )
 
LatLng2FirstMeshCode( 19.1, 136.1 );
FirstMeshCode2LatLng( "5160" )
5136
(34.000000,136.000000)
エラー:緯度が範囲を超えています。
エラー:経度が範囲を超えています。
2次メッシュは、1次メッシュの一区画を、東西に7分30秒単位、南北に5分単位で、それぞれ8等分し、64区画に分割します。これはいわゆる八佾はちいつの並び方です。南北の行に南から北に向かって0から7までの数を割り当て、東西に西から東に向かって0から7までの数を割り当てることにより、各区画をこれらをこの順に並べた2桁の数で表し、1次メッシュコードにこの2桁の数を加えた6桁の数を、この区画の2次メッシュコードと定義します。
 Pythonを使った計算例を示します。
算譜7.1.3.11 2次メッシュコード
# coding: utf-8
 
def LatLng2SecondMeshCode( lat, lng ):
# 範囲検査
if ( ( lat < 20.0 ) or ( lat >= 46.0 ) ):
print "エラー:緯度が範囲を超えています。"; return;
if ( ( lng < 122.0 ) or ( lng >= 154.0 ) ):
print "エラー:経度が範囲を超えています。"; return;
# 緯度・経度を秒単位の整数で表す。
latd = int( lat );
tmp  = ( lat - latd ) * 60.0;
latm = int( tmp );
lats = int( int( ( tmp - latm ) * 60.0 * 1000.0 ) / 1000.0 );
lngd = int( lng );
tmp  = ( lng - lngd ) * 60.0;
lngm = int( tmp );
lngs = int( int( ( tmp - lngm ) * 60.0 * 1000.0 ) / 1000.0 );
I = latd * 3600 + latm * 60 + lats;
K = lngd * 3600 + lngm * 60 + lngs;
# 2次メッシュコード表示
print "%d%d%d%d" % ( (I/2400)%100, (K/3600)%100, \
(I%2400)/300, (K%3600)/450 )
 
def SecondMeshCode2LatLng( code ):
# 2次メッシュコード文字列分解
lat1 = int( code[0:2] );
lng1 = int( code[2:4] );
lat2 = int( code[4:5] );
lng2 = int( code[5:6] );
# 範囲検査
if ( ( lat1 < 30 ) or ( lat1 >= 69 ) ):
print "エラー:緯度が範囲を超えています。"; return;
if ( ( lng1 < 22 ) or ( lng1 >= 54 ) ):
print "エラー:経度が範囲を超えています。"; return;
# 緯度・経度を秒単位の整数で表す。
I = lat1 * 2400 + lat2 * 300;
K = ( lng1 + 100 ) * 3600 + lng2 * 450;
# 度単位に変換し、表示する。
lat = I / 3600.0;
lng = K / 3600.0;
print "(%f,%f)" % ( lat, lng )
 
LatLng2SecondMeshCode( 34.345, 136.234 )
SecondMeshCode2LatLng( "513641" )
513641
(34.333333,136.125000)
 ToposNote Ver.2の3D地形図エンジンは、国土地理院が公開している電子国土基本図閲覧サービス「ウォッちず」で公開されている地図画像を直接リンクして、基盤地図情報数値標高モデルのダウンロードサービスで提供されている10mメッシュ標高データにより作成した地形ポリゴンに貼り付けて、立体的に見ることを目的として設計されています。
 そのため、地図画像を閲覧するにはインターネットに接続されていることが条件となります。地形ポリゴンのみであればオフライン状態でも見ることができます。
 地図閲覧サービス「ウォッちず」が2011年2月1日より、電子国土基本図(地図情報)に変更されたことにより、2.0.9版において2万5千分1地形図から電子国土基本図へ切り替えました。2万5千分1地形図のサービスは2011年7月末で打ち切られますので、それ以降2.0.8版では地図を参照できなくなります。
 プログラム起動後に表示した領域の地図画像と10mメッシュデータは、実行環境に依存した容量のメモリキャッシュ内に一時的に保存され、プログラム終了時に破棄されます。
 オンラインで見たい場所を閲覧してから、プログラムを起動したままパソコンをスリープ状態にしておけば、オフラインでもキャッシュに残っているデータを閲覧することができます。
 メモリキャッシュアルゴリズムは物理メモリ量3Gバイトを境として変わります。3Gバイト未満の場合はメモリを節約して表示領域をやや狭くし、3Gバイト以上の場合は、より多くのメモリを使い表示領域を広くします。
 3D地形図エンジンは、[メニュー]→[表示]→[地理空間]によりONされ、 [メニュー]→[表示]→[幾何空間]によりOFFされます。
 標高データは国土地理院が基盤地図情報として、無料で提供されているGML形式の10mメッシュデータを利用します。*1 これは次のURLからダウンロードすることができます。
 例えば三重県の場合、次の11個のファイルがダウンロードできます。
  • FG-GML-5035b-DEM10B.zip
  • FG-GML-5035d-DEM10B.zip
  • FG-GML-5036c-DEM10B.zip
  • FG-GML-5136a-DEM10B.zip
  • FG-GML-5136b-DEM10B.zip
  • FG-GML-5136c-DEM10B.zip
  • FG-GML-5136d-DEM10B.zip
  • FG-GML-5236a-DEM10B.zip
  • FG-GML-5236b-DEM10B.zip
  • FG-GML-5236c-DEM10B.zip
  • FG-GML-5236d-DEM10B.zip
これらをToposNoteへドラッグ&ドロップすると、解凍し、中身を解析し、GML形式に準拠する10mメッシュ標高データが含まれていれば、プログラム実行ディレクトリのDEM10下に専用データ形式で格納されます。
 あるいは[メニュー]→[ヘルプ]→[標高]を選択すると次のダイアログボックスが表示されます。
上記のzip形式データをフォルダに格納し、変換元フォルダとしてそのフォルダを指定し、[変換実行]ボタンを押すと、そのフォルダ内のすべてのデータを処理します。変換実行時に、[変換中止]を押すと現在処理中のファイルを変換後、終了します。
 すべてを変換するにはかなりの時間がかかります。必要なデータだけを得るには、見たい場所が属する1次メッシュコードを調べ、ファイル名にその1次メッシュコードが含まれるものだけを変換します。
 ToposNoteにおいて目的地に移動する方法は、次の7種類あります。
原点復帰 原点復帰ボタンにより、世界座標系の原点に移動する。
GPS GPSモニタ(第8章参照)を起動し、GPSと連動させる。
場所データ 場所コンボボックスにより、事前に定義された場所に移動する。
Lua Lua拡張命令のtnCursorあるいはtnCursorGeoにより移動する。
写真 GPSデータ付き写真をドラッグ&ドロップする。
GPX GPX形式GPSデータをドラッグ&ドロップする。
Google Earth Google Earthと連携し、 Google Earthで場所を指定する。
 6つある場所コンボボックスは、上から順にインストールフォルダにある次のCSV形式ファイルにより定義されています。
  • place1.csv(主要都市データ)
  • place2.csv(百名山データ)
  • place3.csv(世界遺産データ)
  • place4.csv(未定義)
  • place5.csv(未定義)
  • place6.csv(未定義)
 これらはユーザーが自由に場所データを定義して使えるようになっています。データ定義は次のような形式で行ないます。
題名
地名1,緯度,経度
地名2,緯度,経度
地名3,緯度,経度
:
:
:
 [メニュー]→[場所]→[Google Earth]のチェックボックスをチェックするとGoogle Earthと連携します。このためには事前にGoogle Earthをインストールしておかなければなりません。
 Google Earthと連携した状態では、ToposNote側の空間操作により変化したカメラパラメータがGoogle Earth側に設定されます。
 Google Earth側のカメラパラメータをToposNote側に設定するには[GE]ボタンを押します。カメラパラメータの視野角だけは範囲が異なるので設定されません。
 カメラパラメータの視参照点に関して、ToposNoteとGoogle Earthでは取り扱い方が異なっています。ToposNoteは標準では、視参照点が必ず地表から2mの位置に固定されます。これに対してGoogle Earthは視参照点を自由に動かすことができます。
 [メニュー]→[表示]→[標高調節]のチェックボックスをはずすと視参照点の制約が無効になります。これにより、視参照点を自由に動かすことができます。
注  記
*1GML形式以外のデータには対応していません。
人  物
ガウス Johann Carl Friedrich Gauss, 1777-1855
 
場  所
地域メッシュ
地域メッシュコード
1次メッシュ
1次メッシュコード
2次メッシュ
2次メッシュコード
 
自  然
ITRF 国際地球基準座標系
GPS Global Positioning System
WGS84
ジオイド geoid
GRS80
 
社  会
八佾 はちいつ
古代中国の周代の天子のための舞楽。八行八列に整列した64人が舞う。論語の第三編の題となっている。
 
Published by SANENSYA Co.,Ltd.