TOPIC 3|3D都市モデルデータの基本[4/4]|CityGMLの座標・高さとデータ変換
【目次】
3.5 座標と高さの取り扱い
3.5.1 空間参照系
3.5.2 日本測地系2011における経緯度座標系
3.5.3 平面直角座標系
3.5.4 高さ
3.5.5 データの変換・加工の方法
3.6 まとめ
3.5 座標と高さの取り扱い
次に、座標と高さに焦点を当てます。
例えば<gml:posList>は、頂点の座標を示す、代表的な要素の1つであり、複数の頂点を列記することができます。それぞれの頂点の座標は、「緯度」「経度」「高さ」で示されています。高さについては、改めて「3.5.4 高さ」で説明しますが、東京湾平均海面を基準とする標高です。
【メモ】
土地利用や都市計画区域など、高さを必要としないデータにおいて、高さは「0」に設定されています。
<gml:posList>
43.061285701747266 141.35419378529105 19.763 1点目の緯度、経度、高さ
43.06128569987977 141.35419377672426 19.763 2点目の緯度、経度、高さ
…略…
</gml:posList>
経緯度で示す方法は、GISで扱う場面ではよいのですが、長さや面積を定規で計測できません。そのため「ビルの幅は、どのぐらいか」「面積や体積は、どのぐらいか」などを調べたいときは、あらかじめメートルへ換算しておいたほうが扱いやすくなります。また、ゲームなどで利用したい場面も、経緯度ではなく、XY座標のメートル単位のほうが扱いやすいことが多いです。
この項では、こうした座標の取り扱いについて説明します。
3.5.1 _ 空間参照系
地球上の位置を示すには、いくつかの方法があり、その方法を定めたものを「空間参照系」と呼びます。空間参照系は、測量する際に地球をどのような回転楕円体に見立てるか、そして、原点をどこに置くのかを定めた「測地系」と、どのような方法で位置を決めるのかを定めた「座標系」の組み合わせです(図 3-20)。
3.5.2 _ 日本測地系2011における経緯度座標系
3D都市モデルにおいて、座標がどの空間参照系で示されているのかは、<gml:Envelope>で示されています。空間参照系には、たくさんの種類がありますが、PLATEAUの3D都市モデルで使われているのは、EPSGコードの6697(もしくは高さを必要としないときは6668)です(表 3-7)。
「日本測地系2011における経緯度座標系」であり、図 3-24中で、右上から2つ目のところに相当します。
【メモ】
GPSでは、図3-24の上部で示した測地系について、日本測地系2011ではなくWGS84が使われています。そのため理論的には、スマホのGPSなどで取得した位置情報をPLATEAUに重ねたい場合は変換が必要です。しかしWGS84と日本測地系2011はほぼ同一であるため、そのまま重ねられます(ただし、高さは異なります。詳しくは「3.5.4 高さ」で説明します)。
<gml:Envelope srsName="http://www.opengis.net/def/crs/EPSG/0/6697" srsDimension="3">
EPSGコード | 空間参照系 |
---|---|
6697 | 日本測地系2011における経緯度座標系と東京湾平均海面を基準とする 標高の複合座標参照系 |
6668 | 日本測地系2011における経緯度座標系。この座標系には高さの定義がない |
3.5.3 _ 平面直角座標系
経緯度で表現される3次元の地球を2次元の地図として表現したものが、投影座標系です。投影座標系には、さまざまな方式のものがありますが、日本の国土を投影座標系に変換する場合は、測量法で定められている「平面直角座標」と呼ばれる座標系が、よく使われます。平面直角座標はメートル単位に変換されており、距離や面積などが簡易に計測できます。
平面直角座標系には、基準点(原点)が異なる19種類の変換方法が定義されていて、それを「系」と言います(図 3-21)。それぞれには表 3-8に示すEPSGコードが付与されています。
19の基準点が存在するのは、誤差を小さくするためです。投影座標系では、地球という球面を平面に投影するため、原点とした座標から遠いとズレが大きくなります。ですから利用したい区域に近い基準点の系を利用するようにします。例えば関東圏ならば、平面直角座標9系を使います。
【メモ】
どの区域で、どの系を利用するのかは、「平面直角座標系(平成十四年国土交通省告示第九号)」として定められています(https://www.gsi.go.jp/LAW/heimencho.html)。平面直角座標系については、「わかりやすい平面直角座標系」(https://www.gsi.go.jp/sokuchikijun/jpc.html)も参考にしてください。
系番号 | EPSG コード | 原点の位置(経度) | 原点の位置(緯度) | 適用区域 |
---|---|---|---|---|
1 | 6669 | 129度30分0秒0000 | 33度0分0秒0000 | 長崎県すべてと鹿児島県の一部 |
2 | 6670 | 131度 0分0秒0000 | 33度0分0秒0000 | 福岡県 佐賀県 熊本県 大分県 宮崎県 鹿児島県の一部 |
3 | 6671 | 132度10分0秒0000 | 36度0分0秒0000 | 山口県 島根県 広島県 |
4 | 6672 | 133度30分0秒0000 | 33度0分0秒0000 | 香川県 愛媛県 徳島県 高知県 |
5 | 6673 | 134度20分0秒0000 | 36度0分0秒0000 | 兵庫県 鳥取県 岡山県 |
6 | 6674 | 136度 0分0秒0000 | 36度0分0秒0000 | 京都府 大阪府 福井県 滋賀県 三重県 奈良県 和歌山県 |
7 | 6675 | 137度10分0秒0000 | 36度0分0秒0000 | 石川県 富山県 岐阜県 愛知県 |
8 | 6676 | 138度30分0秒0000 | 36度0分0秒0000 | 新潟県 長野県 山梨県 静岡県 |
9 | 6677 | 139度50分0秒0000 | 36度0分0秒0000 | 東京都(島しょ部を除く)福島県 栃木県 茨城県 埼玉県 千葉県 群馬県 神奈川県 |
10 | 6678 | 140度50分0秒0000 | 40度0分0秒0000 | 青森県 秋田県 山形県 岩手県 宮城県 |
11 | 6679 | 140度15分0秒0000 | 44度0分0秒0000 | 北海道の一部 |
12 | 6680 | 142度15分0秒0000 | 44度0分0秒0000 | 北海道の一部 |
13 | 6681 | 144度15分0秒0000 | 44度0分0秒0000 | 北海道の一部 |
14 | 6682 | 142度 0分0秒0000 | 26度0分0秒0000 | 小笠原村 |
15 | 6683 | 127度30分0秒0000 | 26度0分0秒0000 | 沖縄県の一部 |
16 | 6684 | 124度 0分0秒0000 | 26度0分0秒0000 | 沖縄県の一部 |
17 | 6685 | 131度 0分0秒0000 | 26度0分0秒0000 | 沖縄県の一部 |
18 | 6686 | 136度 0分0秒0000 | 20度0分0秒0000 | 沖ノ鳥島 |
19 | 6687 | 154度 0分0秒0000 | 26度0分0秒0000 | 南鳥島 |
■ 平面直角座標への変換
平面直角座標に変換するには、変換式を使います。
国土地理院の「測量計算サイト」(https://vldb.gsi.go.jp/sokuchi/surveycalc/main.html)では、実際に値を入力して変換できます。また変換式も掲載されています(図 3-22)。
■ プログラムから座標変換する
変換式を見ながら自分でプログラムを作るのは複雑なので、プログラムから座標変換したい場合は、何らかのAPIやライブラリを使うとよいでしょう。例えば、次の方法があります。
・OSSのGDAL(https://gdal.org/)のAPI(https://gdal.org/api/ogrspatialref.html)を用いる
・その内部で利用されている座標変換ライブラリPROJ(https://proj.org/)を用いる
・PythonからPROJを利用するためのpyproj(https://github.com/pyproj4/pyproj)を用いる
pyprojは、次のようにpipコマンドでインストールできます。
pip install pyproj
pyprojを使って変換するには、Transformerオブジェクトを使います。実際に、日本測地系2011における経緯度座標系(EPSG:6697)から平面直角座標系の9系(EPSG:6677)に変換するプログラムをリスト 3-5に示します。実行すると、次のように、9系の原点を基準としたメートル単位に変換された座標が得られます。
(6823.187558995912, 19662.534363112867)
from pyproj import Transformer
# 日本測地系2011における経緯度座標系(6697)
# ↓
# 平面直角座標系の9系(6677)
# に変換するTramsformerを作る
transformer = Transformer.from_crs(6697, 6677)
# 経緯度を変換
print(transformer.transform(36.0613, 140.0516))
リスト 3-5 EPSG:6697からEPSG:6677に変換する例
■ 平面直角座標の注意点
3Dソフトで扱う場合は、FBX形式やOBJ形式などに変換しますが、その際、平面直角座標に変換して扱います。
平面直角座標で扱う場合は、次の点に注意してください。
① 座標軸の向き
X軸が南北(真北が正)、Y軸が東西(真東が正)です。通常、私たちは北がY軸で上を向いた地図になじみがありますが、その感覚で言うと、そのまま3Dソフトで表示すると90度回転し、さらに左右反転した向きになるので注意してください。
② 原点が目的の地物から遠いことがある
系によっても異なりますが、図 3-23に示したように、地域によっては原点が遠いことがあります。例えば、東京都は9系に変換しますが、この系の原点は経度139度50分0秒/緯度36度0分0秒で、千葉県の川間駅の近辺です。現実世界で、この位置から東京方向を見ても、建物はとても小さくてほとんど見えないはずです。3DソフトにFBX形式やOBJ形式のデータをインポートしたときに、建物が見えないことがあるのはこれと同じ理由で、カメラ位置は原点に設定されているけれども、表示した3D都市モデルが原点から遥か遠くにあるからです。
このような場合、モデルの原点を調整するか、カメラ位置を地物の近くに移動すると見えるようになります。
③ 扱う数値と精度
平面直角座標における単位は「メートル」です。100キロメートルは100,000メートルであることからもわかるように、この値は、意外と大きな値になります。アプリケーションで扱うときは、桁あふれに注意してください。またプログラミングでは、小数を扱う場合にfloat型とdouble型がありますが、float型では約7桁の精度しかありません。その倍の精度を持つdouble型で演算するのがよいでしょう。
3.5.4 _ 高さ
PLATEAUでは、EPSGコード6697の「日本測地系2011における経緯度座標系と東京湾平均海面を基準とする標高の複合座標参照系」が採用されており、これに記載のとおり、高さは、「東京湾平均海面を基準とする標高」で表現されています。例えば、「3.4.1 LOD0」では、LOD0のデータ構造例を見ましたが、そこには、次のデータがあります。
<bldg:lod0RoofEdge>
<gml:MultiSurface>
<gml:surfaceMember>
<gml:Polygon>
<gml:exterior>
<gml:LinearRing>
<!-- 屋根を構成するポリゴンの頂点 -->
<gml:posList>
43.061285701747266 141.35419378529105 19.763
43.06128569987977 141.35419377672426 19.763
…略…
</gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
</gml:MultiSurface>
</bldg:lod0RoofEdge>
この高さ「19.763」は、東京湾平均海面を基準とする標高です。平均海面は、ジオイド面とも呼ばれます。
■ 標高と楕円体高
他の空間参照系では、標高ではなく楕円体高と呼ばれる高さが使われることがあります。楕円体高は、地球を回転楕円体と見なして、回転楕円体表面からの距離(高さ)を示したものです(空間参照系によって、回転楕円体の形状や中心座標にいくつかのバリエーションがあります)。
例えばGPSで採用されているWGS84では、この楕円体高が採用されています。そのためGPSの高さとPLATEAUの3D都市モデルの高さとは基準が違うので合致しません。
地球は、場所によって水面の盛り上がり(平均海面)に差があり、でこぼこしています。このでこぼこした面のことをジオイドと言います。楕円体高からジオイド高を引き算すると、PLATEAUの3D都市モデルの高さ(標高)と一致します(図 3-24)。
【メモ】
ジオイドや楕円体高についての詳細は、国土地理院の「ジオイドとは」(https://www.gsi.go.jp/buturisokuchi/grageo_geoid.html)などのドキュメントを参照してください。
■ 地形と地物
地物は、地面に建築されていますが、その地面は平坦ではなく地面自体に起伏があります。この起伏を無視してフラットな平面に地物だけを置くと、地物が浮きます。
PLATEAUの3D都市モデルには、地形の起伏が接頭辞「dem」のデータとして提供されています。浮かないようにするには、こうしたデータで高さを補正します。ゲームなどの利用で、起伏を無視してフラットな地面に配置したいなら、床の高さが0になるように移動して、フラットに揃えてしまうのもよいでしょう。
【メモ】
WebGISの「Terrian.js」で利用する場合は、PLATEAUが配信している地形データを利用できます(https://github.com/Project-PLATEAU/plateau-streaming-tutorial)。
コラム LOD1モデルの建物の高さ
LOD1のモデルは、低コスト・簡易な3D都市モデルの構築を実現するため、建物の平面図形を測量によって取得した高さで立ち上げた直方体で構成されています。このときの高さは、建築物の中央値を採用しています。ここで言う中央値とは、測量した点群の高さを小さい順に並べたときの中央に位置する値です。
全体の形状が直方体に似た建物であれば誤差が少ないのですが、低層部と高層部が分かれているような建築物では、低層部の屋上面が中央値となることがあるため、実際の高さよりもモデルの高さが低くなる傾向にあります。
【直方体に近い建築物であれば、近い高さになる】
【低層部と高層部からなる建築物は、実際より低くなることがある】
3.5.5 _ データの変換・加工の方法
ここまで説明してきたように、3D都市モデルのデータフォーマットであるCityGML形式のデータには、さまざまな情報が含まれています。いわば、「全部入りのデータ」です。
そのためアプリケーションの目的に応じて、データをマージしたり、削減したり、変換することが必要になる場合があります。
変換するには、主に2つの方法があります。
① プログラムを作って加工する
CityGMLはXML形式のデータであるため、XMLを読み書きするプログラムを作れば、データを加工できます。例えばPythonなどで、特定の要素や属性のものだけを抜き出すツールを作る方法が挙げられます。
② データ変換ソフトウェアを使う
もうひとつの方法は、CityGML形式ファイルを扱えるデータ変換ソフトウェアを使う方法です。
PLATEAU SDKを利用すれば、UnityやUnreal Engineにインポートされた3D都市モデルをOBJ、FBX、glTFの形式でエクスポートできます。(【TOPIC 17 PLATEAU SDKでの活用】参照)
そのほか「3D都市モデルのデータ変換マニュアル」では、データ変換エンジンのFME Formを使った、座標系やファイル形式の変換が説明されています。この方法については、次の【TOPIC 4 CityGMLから各種データ形式へのコンバート】で説明します。
3.6 まとめ
・3D都市モデルは、「G空間情報センター」(https://www.geospatial.jp/)からダウンロードできます。
・CityGML、FBX、OBJなど、いくつかの形式で配布されていますが、基となるのはXML形式で定義されているCityGMLです。これには属性のデータと幾何形状のデータが含まれています。
・CityGMLのファイルは、建築物、道路、土地利用など、地物ごとに別のフォルダに格納されています。また各ファイルは、標準地域メッシュと呼ばれる単位で区切られています。
・CityGMLの座標は、「日本測地系2011における経緯度座標系」で記録されています。経緯度から、特定の場所を原点としたメートル単位に変換するには、「平面直角座標系」を使います。平面直角座標系には原点が異なる19の系があり、関東圏では9系を使用します。
・3D都市モデルの高さは、東京湾平均海面を基準とする標高です。一方、GPSで使われるWGS84では楕円体高が採用されており、高さにズレがあります。
・地形の起伏を考慮せず、フラットな地面に建物を置くと、起伏の分だけ沈みます。
【文】
大澤文孝
【監修】
石丸伸裕(OGC CityGML仕様策定WG副議長)
黒川史子(アジア航測株式会社)
小林巌生(インフォ・ラウンジ株式会社)
於保俊(株式会社ホロラボ)