Googleアースに使われるKMLとは?
地理情報を扱うKMLファイルを解きほぐす
はじめに
Google Earth(グーグルアース)は、地球上のあらゆる場所を3D画像で観察できるバーチャル地球儀ソフトウェアです。
引用:Google Earthとは
とか、
ウィキペディアには、
引用:Google Earth
とあり、「
今回の記事もその を使っています。
このGoogleEarthにKMLファイルを適用することによって、更に便利に地理情報を活用することができます。
KMLは、Google EarthやGoogleマップの地図上で、位置の情報をもったデータを表示するためのファイル形式です。KMLを使うと、3次元的な位置に任意の情報を付け加えて表示することができます。例えば、旅行先で撮影した写真に自分の感想をつけて地図上の撮影地点に表示することができます。」
引用:J-SHISの地図をGoogle Earthで見てみよう
など、Net検索すれば沢山の活用事例が見つかります。
KMLファイルの紹介記事も数多くあり、用途に応じて作成方法が紹介されているので、便利に活用できると思います。
KMLファイルはGoogleによって拡張タグも新たに定義されており、当然のことながらKMLファイルの機能がGoogleEarthの機能に連動しています。
ここでは、GoogleEarthの機能を紹介するのではなく、KMLファイルがデータをどのように扱っているかという仕組みに焦点を当てて、KMLファイルを分かり易く具体的に解きほぐしてみることにしました。
KMLファイルフォーマットの仕様
KMLファイルは、
KML には、ポイント、ライン、ポリゴンのフィーチャ要素、画像などのラスター要素の他、グラフィックス、ピクチャ、属性、HTML などの関連コンテンツも含めることができます。」
引用:KML とは
とあり、
そのOGCのKMLファイルフォーマットの仕様については、OGC KML 2.3などに書かれています。
KMZファイルという圧縮されたファイルもあり、
引用:KMZ
と書かれています。
KML リファレンスに書かれている には、「Google 拡張名前空間」としてGoogleによって拡張されたタグも記載されています。
KMLファイルフォーマットの構造は、Google Earth とKML(1)に書かれているように、
「KML ドキュメント全体は XML ヘッダー,KML 名前空間,オブジェクトの定義部から構成」されています。
KMLファイルをGoogleEarthに適用する目的は種々あるのですが、
が重要ではないかと思います。
それらに的を絞って以下に具体的に示します。
視点データ
<LookAt>タグか<Camera>タグで視点が指定されます。
〈Camera〉と〈LookAt〉の違いには、
と書かれています。
具体例1(傾斜ありの場合)
上記KML リファレンスの<LookAt>タグの項に掲載されているサンプルコードを具体例1として使わせてもらいます。
そのサンプルコードは以下のように書かれています。
<?xml version="1.0" encoding="UTF-8"?>
<kml xmlns="http://www.opengis.net/kml/2.2"xmlns:gx="http://www.google.com/kml/ext/2.2">
<Placemark>
<name>LookAt.kml</name>
<LookAt>
<gx:TimeStamp>
<when>1994</when>
</gx:TimeStamp>
<longitude>-122.363</longitude>
<latitude>37.81</latitude>
<altitude>2000</altitude>
<range>500</range>
<tilt>45</tilt>
<heading>0</heading>
<altitudeMode>relativeToGround
</altitudeMode>
</LookAt>
<Point>
<coordinates>-122.363,37.82,0
</coordinates>
</Point>
</Placemark>
</kml>
このサンプルコードをそのままコピーしてサンプル1.kmlとして保存します。
このサンプル1.kmlをGoogleEarthで開いた表示例を【図1】に示します。
下部の緯度経度などの地点データは見えないので拡大して【図2】に示します。
この表示例はGoogleEarthを表示サイズ852x480(DVD)に設定しています。
この具体例1のデータをKMLリファレンスの図を参考にして図示すると【図3】のようになっています。
具体例2(傾斜なしの場合)
具体例1は45゜のTilt(傾斜角)になっていますが、そのTiltのタグだけを
<tilt>0</tilt>
に変更して傾斜角を0にしたファイルをサンプル2.kmlとして保存します。
このサンプル2.kmlをGoogleEarthで開いた表示例を【図4】に示します。
下部の緯度経度などの地点データは見えないので拡大して【図5】に示します。
この表示例も表示サイズは同じ852x480(DVD)に設定しています。
この具体例2のデータをKMLリファレンスの図を参考にして図示すると【図6】のようになっています。
具体例1と具体例2の解説
longitude(経度)=-122.363
latitude(緯度)=37.81
altitude(高度)=2000
これら経度、緯度、高度で指定される点をここでは注視点としておきます。
range(注視点から視点までの距離)
=500
tilt(視点方向と地表面の法線の間の角度)
=45(具体例1の場合)
=0 (具体例2の場合)
heading(東西南北の方向)=0(北)
altitudeMode(高度の解釈方法)
=relativeToGround(altitude の値を地面からの距離(メートル)として解釈)
altitudeやrangeがこのサンプルではぴったりした値になっているので、これらの値は任意であって、ある地物の高度ではないことが分かります。
経度-122.363は、西経122゜21’ 46.80”
緯度37.81は、北緯37゜48’ 36.00”
ですので、【図5】に示されている地点データが、具体例2の緯度経度に一致しています。
また、【図5】に示す高度は2.55kmになっていますが、これは注視点にあたる地形の標高47mとaltitude2000mとrange500mの合計を示しています。
視野角については、
「Google Earthの画角を調整できない」
引用:空撮同定
とか、
「カメラの画角等(視野角・視距離)の調整ができないため,現況写真と同じアングルにすることが困難である」
引用:Google Earthに代替する実用的な景観シミュレータを構築するためのデータ活用に関する研究
などの視野角調整ができない旨の記事があります。
一方、「Google Earth はその地図画面の横方向に片側 30 度の視野角を持つように設計されている」
引用:Google Earth を用いた野生生物観測データの地図化
という記事もありました。
上記KMLファイルフォーマットの仕様書やKMLリファレンスには片側 30 度の視野角などの規定は見当たりませんでした。
実際の動作を確認するため、【図4】の状態でマウスを動かして上下左右の緯度経度を調べました。
余り精度の良い方法ではありませんが、
左側経度境界 -122゜22’ 47.66”= -122.37990555555555
右側経度境界 -122゜20’ 46.49”= -122.34624722222222
上側緯度境界 37゜49’ 02.80”= 37.81744444444445
下側緯度境界 37゜48’ 09.12”= 37.802533333333336
が得られました。
左右の経度間の距離を2地点間の距離と方位角のツールを用いて計算すると、2.960174kmになります。
視点は2.55km上方にありますので、左右(経度)方向の視野角をhFOVとすると、hFOV/2=arctan(2.960174/2/2.55)=30.132゜
となって、片側30゜になっていることが分かりました。
上下の緯度間の距離は1.659897kmになりましたので、上下(緯度)方向の視野角をvFOVとすると、vFOV/2=arctan(1.659897/2/2.55)=18.029゜
となって、片側18゜になっていることが分かりました。
現在の表示サイズは852x480(アスペクト比852:480)ですので、上下(緯度)方向の距離をアスペクト1:1として換算すると、
1.659897x852/480=2.94632km
になって、当然ではありますが経度間距離に近くなります。
すなわち、視野角はhFOV=60゜に設定されており、vFOVはアスペクト比分だけ狭くなってvFOV=36゜になっていることになります。
FOVとアスペクト比については、でも触れていますので参考にしてください。
視野角変更の問題について、
映画『天気の子』の画づくりを支える「Google Earth」の活用などで、Google Earth Studio
を使えば視野角変更ができると紹介されています。
また、KMLリファレンスに、
「<gx:horizFov>ツアー中の AbstractView の水平方向の視野を定義します。」
とあり、GoogleEarthのツアー機能の場合には視野角を変更できる<gx:horizFov>が使えそうな記載があります。
地理データ
<GroundOverlay>タグで地図や画像をGoogleEarthの地形に貼り付けることができます。
KMLリファレンスには、「この要素は、地形に貼り付けるイメージ オーバーレイ(地面オーバーレイ)を描画します。」
と書かれています。
具体例3(GroundOverlay)
上記KML リファレンスの<GroundOverlay>タグの項に掲載されているサンプルコードを具体例3として使わせてもらいます。
KML リファレンスのサンプルコードは、Googleが作成した典型的な例となると思うので今回も具体例に採用しました。
そのサンプルコードは以下のように書かれています。
<?xml version="1.0" encoding="UTF-8"?>
<kml xmlns="http://www.opengis.net/kml/2.2">
<GroundOverlay>
<name>GroundOverlay.kml</name>
<color>7fffffff</color>
<drawOrder>1</drawOrder>
<Icon>
<href>http://www.google.com/intl/en/images/logo.gif</href>
<refreshMode>onInterval
</refreshMode>
<refreshInterval>86400
</refreshInterval>
<viewBoundScale>0.75
</viewBoundScale>
</Icon>
<LatLonBox>
<north>37.83234</north>
<south>37.832122</south>
<east>-122.373033</east>
<west>-122.373724</west>
<rotation>45</rotation>
</LatLonBox>
</GroundOverlay>
</kml>
このサンプルコードをそのままコピーしてサンプル3.kmlとして保存します。
このサンプル3.kmlをGoogleEarthで開いた表示例を【図7】に示します。
下部の緯度経度などの地点データは見えないので拡大して【図8】に示します。
この表示例もGoogleEarthの表示サイズは、具体例1や2と同様に852x480(DVD)に設定しています。
自動傾斜の設定は無効にして分かり易くしています(ツール>オプション>ナビゲーションで設定)。
このサンプルコードはGoogleのロゴを貼り付けているのですが判別できるでしょうか?
GoogleEarthのズーム機能を使って少し拡大してみた図を【図9】に示します。中央部にそのロゴがあります。
具体例4(高度の動作)
具体例3は45゜のrotation(回転角)になっていますが、そのrotationのタグを
<rotation>0</rotation>
に変更し、
<north>と<south>の緯度をそれぞれ0.001だけ拡げ、<east>と<west>の経度をそれぞれ0.004だけ拡げて
<north>37.83234</north>
<south>37.832122</south>
<east>-122.373033</east>
<west>-122.373724</west>
に変更したファイルをサンプル4.kmlとして保存します。
このサンプル4.kmlをGoogleEarthで開いた表示例を【図10】に示します。
下部の緯度経度などの地点データは見えないので拡大して【図11】に示します。
この【図11】は下記座標値の説明のために緯度経度を十進表記に変更しています。
サンプル4.kmlの<north><south><east><west>の中央値は
緯度 37.832231
経度 122.373379
ですので、【図11】の緯度経度表示に一致しています。
<LatLonBox>で指定されたGoogleロゴの中心座標が表示画像の中心に位置していることが分かります。
【図11】の高度は1.00kmで【図8】の値と変わっていません。
このGoogleロゴを更に大きくなるように
<GroundOverlay>の大きさに応じて<GroundOverlay>の貼り付け画像が画面内に収まるように、GoogleEarthが自動的に高度を変更しているようです。
貼り付け画像の大きさが小さい場合には、1.00kmに設定されていると思われます。このため【図7】のように判定しにくくなっていたのでした。
この動作についての規定が規格書に見当たらないので初め混乱しました。
rotationが45゜の場合と0゜の場合の比較のために合成画像を【図12】に示します。
<north><south><east><west>の値はサンプル4.kmlと同じです。
この【図12】から<north><south><east><west>の値はrotationが0゜の場合の値であることが分かります。
具体例5(GroundOverlayと視野)
具体例3のサンプル3.kmlに、具体例2のサンプル2.kmlの<LookAt>を追加して、具体例2の視野の中にGoogleログを表示してみます。
サンプル3.kmlの<north><south><east><west>の値を、具体例2の中心座標に合わせて、具体例3の同じ緯度間隔と経度間隔になるように変更します。
そして、サンプル2.kmlの<LookAt>をコピーして追加します。
<?xml version="1.0" encoding="UTF-8"?>
<kml xmlns="http://www.opengis.net/kml/2.2">
<GroundOverlay>
<name>GroundOverlay.kml</name>
<color>7fffffff</color>
<drawOrder>1</drawOrder>
<Icon>
<href>http://www.google.com/intl/en/images/logo.gif</href>
<refreshMode>onInterval
</refreshMode>
<refreshInterval>86400
</refreshInterval>
<viewBoundScale>0.75
</viewBoundScale>
</Icon>
<LatLonBox>
<north>37.811109</north>
<south>37.808891</south>
<east>-122.358643</east>
<west>-122.367357</west>
<rotation>0</rotation>
</LatLonBox>
<LookAt>
<longitude>-122.363</longitude>
<latitude>37.81</latitude>
<altitude>2000</altitude>
<range>500</range>
<tilt>0</tilt>
<heading>0</heading>
<altitudeMode>relativeToGround</altitudeMode>
</LookAt>
</GroundOverlay>
</kml>
に変更したファイルをサンプル5.kmlとして保存します。
このサンプル5.kmlをGoogleEarthで開いた表示例を【図13】に示します。
下部の緯度経度などの地点データは見えないので拡大して【図14】に示します。
【図13】の高度は2.55kmで【図4】や【図5】と変わっていません。
所望の位置に地図や画像を貼り付ける際には<GroundOverlay>タグだけで済みますが、見える画像範囲を指定する場合には<LookAt>タグが必要と思われます。
具体例6(GeoTIFFとの連携)
GoogleEarthでGeoTIFFファイルをインポートし、それをKMLファイルに変換して出力することができます。
この場合にKMLファイルはどのようになっているのでしょうか?
で調べたGeoTIFFファイルのcea.tifをGoogleEarthにインポートします。
そして、GoogleEarthの「名前を付けて保存」でKMLファイルを指定してサンプル6.kmlとして保存します。
このサンプル6.kmlをGoogleEarthで開いた表示例を【図15】に示します。
下部の緯度経度などの地点データは見えないので拡大して【図16】に示します。
サンプル6.kmlのコードは以下のようになっていました。
<GroundOverlay>
:<name><description><Icon>は省略
<LatLonBox>
<north>33.94381725898198</north>
<south>33.66506022807546</south>
<east>-117.307771034788</east>
<west>-117.6408468875628</west>
<rotation>0</rotation>
</LatLonBox>
</GroundOverlay>
で述べたように、cea.tifにはコーナー4隅の点に対応する緯度経度は示されていません。
「gdalinfo コマンドを使用した解析結果」と同じように、GoogleEarthがGeoTIFFファイルに格納されている測地系データなどを解読して<LatLonBox>の値を設定しています。
その測地系データなどの地理情報はKMLファイルにコピーされていません。
地図貼り付け方法の例
<GroundOverlay>を使わないで地図を貼り付けるKMLファイルがあります。
NetworkLinkで提供される例
「国土地理院が地理院地図で公開している桧原湖の「湖沼図」は1967年に測量したデータである。」
引用:Google Earth再発見の旅(国土地理院さ~ん、湖沼図よろしくお願いします!)
で紹介されている、gsi_lake1.kmlファイルは、
<NetworkLink>
<name>湖沼図</name>
<open>1</open>
<description></description>
<Url>
<href>http://kmlnetworklink.gsi.go.jp/wskmlnetworklinkgsi/?XYTYPE=2&ZMIN=0&ZMAX=17&IMAGETYPE=png&BASEURL=https%3A%2F%2Fmaps.gsi.go.jp%2Fxyz%2Flake1%2F</href>
<viewRefreshMode>onStop</viewRefreshMode>
<viewRefreshTime>0.1</viewRefreshTime>
</Url>
</NetworkLink>
という<NetworkLink>タグでネットワーク上のKMLファイルをGoogleEarthが読み取っています。
このファイルはGoogleEarthで自動的に配置されないので、檜原湖を探すと【図17】のように表示されます。
このような<NetworkLink>タグでKMLファイルが提供されている例は他にも多くあります。
元のKMLファイルを入手する方法は不明でしたので、貼り付け画像の領域座標などを知ることはできませんでした。
おわりに
GoogleEarthの機能の紹介ではなく、KMLファイルがデータをどのように扱っているかという仕組みを調べたかったので、視点データの扱いと地理データの扱いに絞って調べることにしました。
この便利な機能が今回の調査では何度も障害になってしまいました。
視野角が60゜に設定されていることや高度設定値などは規格書に明記して欲しいと思いました。
今回は限られたタグだけを調べましたが、他のタグでも似た混乱があるのではないでしょうか?
その出力されたKMLファイルを開くと、その画像領域の緯度経度値に基づいて画像が表示されています。
地図を貼り付けられれば良いのでしょうけど、不都合な場合もあるのではないでしょうか?
何か方法があるのかも知れませんが、現時点では不明です。
特別なツールを用いないで無料で簡単に利用できる活用法が広まることを期待しています。
KMLファイルをクリックするとGoogleEarthが自動的に立ち上がってその画像を表示するという機能が、そういう活用法の普及に役立つだろうと思います。
GoogleEarthと連携する際にキーとなる技術をこれからも調べていきたいと考えています。