Skip to content

rhenerose/plateaupy

 
 

Repository files navigation

plateaupy

plateaupy
original sample multiple meshcode & basemap (roadmap) multiple meshcode & basemap (satellite)
-loc 52350309 51357398 51357399 --basemap --basemap_layer 1 --layer_zoom 18 -loc 53391530 53391531 53391540 53391541 --basemap --basemap_layer 0 --layer_zoom 18

PLATEAU(CityGML)のPython版パーサおよびビューア用モジュールです。
3D表示はOpen3DまたはBlender Python (bpy)で行います。

本リポジトリは AcculusSasao/plateaupy をベースにフォークしたものになります。
本家に比べて以下の点が異なります。
(上から順にインパクトが大きい)

  1. dem オブジェクトに対してベースマップをテクスチャとして貼るように修正しました
    テクスチャはTMS(Tile Map Service)を使用して衛星画像またはロードマップを取得します (キャッシュ機能付き)
  2. -loc オプションに複数のメッシュコードを指定できるように修正しました
  3. -loc オプションにて3次メッシュコード(8桁)指定した際に、 dem 及び tran オブジェクトが見つからなかった場合、
    2次メッシュコード(6桁)を使って該当オブジェクトを探すオプションを追加しました (--useLeargeArea)
  4. Windows環境でも使えるように cp, unzip, 7z などのコマンドを使用しないように修正しました
  5. ply ファイル出力機能の代わりに export 機能を追加しました
    ply 以外に obj , off , stl , glb 形式も出力できます (*1)
  6. データセット展開時に一時ディレクトリからコピーせずに移動するように修正しました (ディスク容量を節約)
  7. Plateauのデータセット定義を別ファイルに外出し、愛知県と静岡県のデータセットを追加しました

(*1) obj 出力は頂点が間引かれるようで、想定通りに動作しません <- open3d issue #1731

はじめに

本ソフトウェアは、東京23区から新しい世界を創るアイデアソン/ハッカソンで開発されたものです。
開発チーム: チーム名「影の功労者」,3名
-> ハッカソンでグランプリをいただきました。このREADMEの最後に作品を紹介します。
本リポジトリにPLATEAU(CityGML)のデータは含みません。
ハッカソン中は非公開データでしたが、G空間情報センターで正式公開されました。
この公開データでも動作するよう修正しました。データダウンロードスクリプトも用意しています。
公開データではFBXやOBJなどの3次元データも用意されましたが、本ソフトウェアはCityGMLのみから解析、3次元構築します。

機能一覧

  • bldg(建物)のLOD 0,1,2 のパース、表示、LOD2テクスチャ表示(遅い)、メタデータのパース
  • dem(地表)のパース、表示
  • tran(道路)のパース、表示
  • 一度パースしたデータをキャッシュしておき次回から高速読み込み
  • codelists定義のパース
  • Open3D TriangleMesh への変換
  • Blender Object への変換
  • .plyファイルへの出力

未対応

  • luse(建設予定値)のパース、表示
  • brid(橋)のパース、表示、テクスチャ表示
  • bldg(建物)のLOD3以上のパース、表示

動作環境

Python3 (Python 3.6.4, Ubuntu18.04 で確認)

インストール

取得

git clone --recursive https://github.com/rhenerose/plateaupy.git

モジュールインストール

cd plateaupy
pip install -r requirements.txt

PLATEAU(CityGML)データ

PLATEAU 公開データ

G空間情報センターで続々と公開されています。
まずは東京都23区CityGMLで確認します。データ構造が同じであれば他都市でも可能です。

データダウンロードスクリプト download_plateau.py

以下で東京都23区PLATEAU-CityGMLデータをダウンロードし展開します。

python download_plateau.py plateau-tokyo23ku-citygml-2020

第1引数(データセット名)の文字列はヘルプで一覧を確認できます。文字列ではなくインデックス番号 0~ を指定することもできます。

python download_plateau.py -h

デフォルトのダウンロード/展開先は「CityGML2020/」ですが、コマンド引数 --basedir で指定することもできます。
今後ダウンロードアドレスが変わるかもしれませんが、変更になった場合は download_plateau.py 内のアドレスを変更してください。
以下のようなディレクトリ構成となります。

CityGML2020/
  |
  plateau-tokyo23ku-citygml-2020/   ← appviewerの-pathsで指定するパス
    |
    archive/
      .zip, .7z, ..
    codelists/
      
.xml, ..
    metadata/
      
.xml, ..
    specification/
      *.png, ..
    udx/
      bldg/,brid/,dem/,frm/,luse/,tran/, ..

ビューアアプリ appviewer の使い方

以降のコマンド実行で、上記PLATEAUデータの場所をコマンド引数 -paths で指定する必要があります。
例: -paths CityGML2020/plateau-tokyo23ku-citygml-2020
または、appviewerはデフォルトでパス path_to_citygml を参照するため、リンクを作成することで -paths の指定が不要になります。

ln -s CityGML2020/plateau-tokyo23ku-citygml-2020 path_to_citygml

  1. 区画番号(メッシュコード)一覧を表示します。

python appviewer.py -cmd locations

以下が表示されます。

locations: [533925, 533926, 533934, 533935, 533936, 533937, 533944, 533945, 533946, 533947, 533954, 533955, 533956, 533957]

  1. 区画番号 533925 の、建物(bldg)・道路(tran)・地面(dem) を表示します。-locを指定しなければ全区画を対象としますが時間がかかります。

python appviewer.py -loc 533925

読み込みにしばらく時間がかかります。
成功するとOpen3Dの3D画面が起動し、マウス操作できます。ESCキーで終了します。

-loc には複数のメッシュコードを指定できます。

python appviewer.py -loc 53392500 53392501

  1. --basemap を指定すると、地面(dem)をに対して地図画像を表示します。
    地図画像は GoogleMaps の TileMapService から取得します。
    このオプションが有効な場合、 --basemap-layer で表示する地図画像を選択できます。
    (0: 衛星画像 1: ロードマップ)
    また、 --basemap-zoom で地図のズームレベルを指定できます。
    あまり大きすぎると大量のタイルのダウンロードが必要になるため、地図データの取得に時間がかかります。 (1タイル1秒程度の時間制限付き ← サーバ制限対策)

一度取得したタイル画像はファイルとしてキャッシュされ、同じタイルを読んだ場合には再利用されます。

python appviewer.py -loc 53391540 53391541 -basemap -basemap_layer 0 -basemap_zoom 15

  1. 一度読み込んだデータはキャッシュファイルに保存し、次回以降はコマンドオプション -c を使用することで高速に起動します。

python appviewer.py -loc 533925 -c

  1. オプション -k で、gml種類 0:bldg, 1:dem, 2:luse, 3:tran 4:brid を指定できます。

python appviewer.py -loc 533925 -c -k 0

  1. オプション -lod2texture でLOD2のテクスチャを表示します。ただし動作が非常に遅いため場所を限定したほうが良いです。

python appviewer.py -paths ../CityGML_02 -k 0 -loc 53392633 -lod2texture

  1. オプション -export_path [ディレクトリ] で、[ディレクトリ]に .ply ファイルを保存します。

python appviewer.py -loc 533925 -c -export_path ./export

-export_type で出力形式を指定できます。 (ply,obj,off,stl,glb)

python appviewer.py -loc 533925 -c -export_path ./export -export_type stl

  1. コマンドdumpmetaで、bldg内のメタデータを表示します。

python appviewer.py -loc 533925 -c -cmd dumpmeta

  1. コマンドcodelistsで、codelists定義を表示します。

python appviewer.py -cmd codelists

Blender-Python

blender

Blender-Python インストール

blender/blendertest.shを参考にしてください。
Blender 2.91.2 で確認しています。2.8以降bpyの仕様が大きく変わったため、少なくとも2.8以降である必要があります。
Blender-Python(bpy)はBlender内のPythonで実行されるため、このPythonに必要モジュールをインストールする必要があります。
Blenderのインストールディレクトリを $BLENDER とすると、まずはpipと必要モジュールをインストールします。

BLENDER_PYTHON=$BLENDER/2.91/python/bin/python3.7m
$BLENDER_PYTHON -m ensurepip
BLENDER_PIP=$BLENDER/2.91/python/bin/pip3
$BLENDER_PIP install --upgrade pip
$BLENDER_PIP install lxml open3d opencv-python

Blender-Python 実行

$BLENDER/blender --python blender/blendertest.py --python-use-system-env

内容はblender/blendertest.pyを参考にしてください。
args を必要に応じて修正します。
またBlender表示時にオブジェクト座標をCityGMLのXYZ[meter]そのままだと見づらいため、
中心位置を vbase という変数に示す値に移動して、表示しています。

課題

既知の不具合・課題 (取消線は解決済)

  1. 緯度経度->直交座標変換が、おそらく正確ではない plutils.py 内 convertPolarToCartsian()
  2. 1.と関係するかもしれないが、おそらく、建物・地面・道路の位置が微妙にずれている。(気のせいかもしれない)
  3. 建物のポリゴンの法線方向が逆のものがあり、建物の壁が表示されないものがある。
  4. 道路(tran)の位置情報は高さが全てゼロで、地面(dem)の情報を引っ張ってこなければならない。

あると良さそうなもの

  1. 衛星画像をテクスチャとして地面に貼り付ける
  2. 動作高速化 (ポリゴン読み込みコードの最適化、ポリゴン数の削減など)
  3. 東京公共交通オープンデータAPIの利用

plateaupyモジュール の説明

  1. plparserで与えられたパスから.gmlを検索します。この時点では解析は行いません。
import plateaupy  
pl = plateaupy.plparser(paths=['path_to_citygml'])  
  • pl.locations にメッシュコード一覧がリストとして格納されます。
  • pl.codelists にcodelists定義が辞書として格納されます。
  1. .gmlを解析します。引数で解析対象を変更できますので、appviewer.pyの使用法を参考にしてください。
pl.loadFiles()
  • pl.bldg に建物情報が辞書として格納されます。
  • pl.dem に地表情報が辞書として格納されます。
  • pl.tran に道路情報が辞書として格納されます。

bldg, dem, tran のクラスである plbldg, pldem, pltran は plobjクラスを親クラスとしています。plobjのメンバmeshesには、クラスplmeshのリストとして、解析したポリゴンデータが格納されます。このplmeshにはOpen3DのTriangleMeshや、BlenderのObjectに変換するメンバ関数があります。

  1. 読み込んだ.gmlの全てをOpen3DのTriangleMeshに変換して取得することができます。
meshes = pl.get_Open3D_TriangleMesh()
  1. Open3DのVisualizerをラップした表示用クラスを用意しています。
from plateaupy.plvisualizer import Visualizer3D  
vi = Visualizer3D()  
for mesh in meshes:  
	vi.vis.add_geometry(mesh)  
while True:  
	key = vi.wait(1)  
	if key == 27:	# ESC  
		break  

ライセンス

MIT License

使用している外部モジュールは各々のライセンスに従ってください。

各都市の表示例

大阪 513573
plateaupy
大阪 523503
plateaupy
横浜 533915
plateaupy
川崎 533925
plateaupy
横須賀 523975
plateaupy
箱根 523960
plateaupy

Appendix : ハッカソンで開発した作品「都市SYM」

PLATEAU 3D people flow

plateaupyを用いた大規模3D人流シミュレータです。建物は黒のワイヤーフレーム、人は色の付いたキューブで表されています。以下のようにPLATEAU情報を利用しています。応用例として例えば、災害避難時の経過時間やボトルネックの場所分析、をすることができます。

  • 道路(tran)を画像解析して交差点と道を認識し、最短経路探索。
  • 建物用途(usage)ごとに色を変え、人が現在いる建物、あるいは向かっている建物の用途の色を、人の色として表示。
  • 建物の床面積や階数情報から、建物の各階に入室可能な人の容量を制限。

About

PLATEAU parser and viewer in Python

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • Python 99.2%
  • Shell 0.8%