はじめに
国土交通省からオープンデータとして公開された3D都市モデルPLATEAUは、G空間情報センターの3D都市モデル(Project PLATEAU)ポータルサイトからダウンロードすることが出来ます。
しかし、G空間情報センターに登録されているデータのフォーマットは CityGMLや3DTiles, MVTがメインとなっており、その他の FBX, OBJ, FGDBといったフォーマットのデータが用意されているのは2020年度に公開された都市だけで、2022年度のデータには用意されていません。
また、PLATEAUの公式サイトに書かれているCityGMLから各種データ形式へのコンバートする方法は、有償のソフトウェアであるFMEを使う方法しか記述されていません。
ここではGISソフトウェアで利用するための2Dのデータフォーマットに変換する方法を説明します。
QGISのプラグイン
単にQGISにCityGMLデータをインポートするだけであればプラグインを使う方法が簡単です。ただしファイルが大量にある場合、対象のファイルやオプションを画面上のUIで一個ずつ設定するのは面倒です。
GDALのogr2ogrコマンド
2023年12月時点でGDALはバージョン3.8.2がリリースされており、CityGMLにも対応しています。
2Dでベクター形式のジオデータにフォーマットを変換する場合には ogr2ogrコマンドが使えます。例えば、GeoPackageフォーマットに出力する場合には -g GPKG
を指定します。
ogr2ogr -f GPKG -t_srs EPSG:4326 xxx.gpkg -s_srs EPSG:6668 xxx.gml -skipfailures
上記のコマンドで変換した場合、LoD2の地物を含んだgmlファイルを変換した場合に正しく変換できません。このような場合、変換時にどのレベルのLoD要素のジオメトリを使うかは GFS_TEMPLATE オプションで指定することができます。
まず何も指定せずに ogr2ogrコマンドを実行すると自動的に xxx.gfsファイルが作られます。そのファイルを編集して <GeometryElementPath>lod1Solid</GeometryElementPath>
という行を追加します。
<GMLFeatureClassList>
<GMLFeatureClass>
<Name>Building</Name>
<ElementPath>Building</ElementPath>
<GeometryElementPath>lod1Solid</GeometryElementPath>
......
</GMLFeatureClass>
</GMLFeatureClassList>
このファイルを指定することで gmlの中に LoD2の要素が含まれていたとしても、LoD1のジオメトリを使ってファイルを変換することが出来ます。
ogr2ogr -f GPKG -t_srs EPSG:4326 xxx.gpkg -s_srs EPSG:6668 xxx.gml -skipfailures -oo GFS_TEMPLATE=xxx.gfs
※ 詳しい説明はGDALのGMLの説明を参照してください(英語ですが)
複数ファイルを並列処理する
LinuxやMacOSなどでは xargsコマンドを使うことで引数をコマンドに渡して並列実行させることができます。
- lsコマンドでワイルドカード(*)を使ってディレクトリ内のgmlファイルを列挙する
- パイプラインで xargsコマンドにファイル名を渡します。
- xargsコマンドでは
-n 1
を指定することで引数を一つずつ受け取ります。-P 4
で実行するプロセスの個数を指定します。CPUのコア数に応じて適当な数値を指定してください。-I{}
は引数の値を格納するプレースホルダを指定しています。 - 後ろにある
{}
にはソースとなる gmlファイルのパスが格納されています。その前にある{}.gpkg
でソースファイルに拡張子.gpkgを追加したファイルを出力先として指定しています。
ls ./udx/bldg/*.gml | xargs -n 1 -P 4 -I{} ogr2ogr -f GPKG {}.gpkg {} -skipfailures -oo GFS_TEMPLATE=xxx.gfs
上記のコマンドを実行すると .gmlファイルと同じディレクトリ内に .gpkgファイルが作られます。複数のファイルを一つにまとめるにはGDALの ogrmerge.pyコマンドが利用できます。
ogrmerge.py -f GPKG -o xxx_merged.gpkg ./udx/bldg/*.gpkg
おまけ
GDALの古〜いバージョンでは座標参照系の処理に不具合があり、XYの順番がひっくり返って読み込まれるなど不具合がありました。
この不具合に関してはバージョン3.4.0では解決されています。