TOPIC 28|Pythonで活用する:基本編|PlateauKit+PlateauLabで始めるPLATEAU[2/2]|PLATEAUの処理や分析、エクスポート
このトピックでは、PlateauKitとPlateauLabを使って、3D都市モデルから得られるさまざまなデータを処理・分析したり、CSVやExcel形式、またGeoJSONやCityJSONといった形式でエクスポートする方法を解説します。
このトピックでは、PlateauKitとPlateauLabを使って、3D都市モデルから得られるさまざまなデータを処理・分析したり、CSVやExcel形式、またGeoJSONやCityJSONといった形式でエクスポートする方法を解説します。
【目次】
28.5.1 Pandasを使ったPLATEAUデータの処理
28.5.2 データの操作とデータセット(3D都市モデル)への反映
28.5 _ PLATEAUデータの処理と操作
PlateauKit+PlateauLabの特色は、選択した範囲の都市モデルのデータをPythonコードからも処理・操作できる点です。実際の処理や操作では、Pythonの代表的なデータ分析ライブラリであるPandasや、PandasにGIS機能を加えたGeoPandasというライブラリを活用することができます。
28.5.1 _ Pandasを使ったPLATEAUデータの処理
まず、選択範囲のデータを実際に取得してみましょう。選択範囲(Area)の内部データには、.gdfプロパティからアクセスできます。取得できるデータは、「データフレーム(DataFrame)」と呼ばれる、表形式のデータ構造です。セルを追加して、次のコードを実行します。
area.gdf
実行すると、データフレームが図28-15のように表示されます。表の1行がひとつの建築物オブジェクトに対応しています。最下部には、データセットオブジェクトに含まれる範囲内の建築物オブジェクトの総数が表示されています。
【メモ】
PlateauKitでは、PLATEAUデータセットに含まれるすべての属性値のうち、PlateauKitが対応している一部の属性値のみがデータフレームに読み込まれます。対応する属性値は今後拡大予定ですが、もし対応していない属性値で利用したいものがある場合はGitHubなどからリクエストをお送りください。
PLATEAUデータセットのインストール時に、建築物(bldg)以外の都市オブジェクトである橋梁(brid)や道路(tran)のデータも事前変換している場合は、それらのデータも取得できます。例えば、道路のデータを取得するには以下のようにします。
area.layers["tran"].gdf
■ 2Dグラフや2Dマップに表示する
GeoPandasの簡易プロット機能(.plot())やマッピング機能(.explore())を利用すると、選択範囲を2Dグラフや2Dマップ上に表示することもできます。
【メモ】
以下でインストールしているパッケージのfoliumは地図表示ライブラリ、mapclassifyはfoliumで内部的に利用されている、階級区分図を作成するためのライブラリです。
%pip install -q mapclassify folium # 依存パッケージのインストール
area.gdf.explore()
コラム:Pandas(GeoPandas)のデータフレームの活用
PandasやGeoPandasのデータフレームは、CSVやMicrosoft Excelなどのファイル形式で保存することも可能です。
■ CSVファイルとして保存
area.gdf.to_csv("area.csv")
■ Microsoft Excelファイルとして保存
%pip install -q openpyxl # 依存パッケージのインストール
area.gdf.to_excel("area.xlsx")
PandasやGeoPandasの詳しい利用方法については、下記のページなどを参考にしてください。
【Pythonプログラミング入門:7.1 pandasライブラリ】(東京大学 数理・情報教育研究センター)
https://utokyo-ipp.github.io/7/7-1.html
【Pandas公式ドキュメント】(英語)
https://pandas.pydata.org/docs/
【GeoPandas公式ドキュメント】(英語)
https://geopandas.org/en/stable/
■ 属性値を条件とした抽出例
ここでは例として、データフレーム内の項目のうち、「用途情報」(usage)を使った分析処理を行ってみましょう。
まず、「用途情報」の値の一覧と、用途情報ごとの行数(建築物の数)を取得します。セルを追加して、次のコードを実行します。
area.gdf["usage"].value_counts()
さらに、用途情報が「宿泊施設」である建築物を抽出してみましょう。
gdf = area.gdf[area.gdf["usage"] == "宿泊施設"]
gdf
■ 属性値の分布データを作る
取得したデータを使って、グラフなどを作成することも可能です。例として、範囲内の建築物の地上階数(storeysAboveGround)の分布をプロットしてみましょう。
ここでは、Google Colabにあらかじめインストールされている、Plotly(Plotly Express)というグラフライブラリを利用します。
【Plotly Express】(英語)
https://plotly.com/python/plotly-express/
セルを追加して次のコードを実行すると、横軸を地上階数としたヒストグラムとしてプロットできます。
import plotly.express as px
fig = px.histogram(area.gdf, x="storeysAboveGround", title="渋谷駅周辺の建築物の地上階数の分布")
fig.show()
複数の属性値を組み合わせた統計やプロットにも挑戦してみましょう。土地の利用目的に応じた建築物の高さなどのルールを定めている区域分類として、地域地区や、その一種である用途地域があります。
【地域地区と用途地域】
先ほどの建築物の地上階数別のカウントを、これらの区域分類ごとに集計してみます。
このような集計(クロス集計)は、Pandasのピボットテーブル機能を使うことで簡易に行うことができます。セルを追加して、次のコードを実行します。
area.gdf.pivot_table(
index="storeysAboveGround", # 地上階数の項目名
columns="districtsAndZonesType", # 用途地域(または地域地区)の項目名
aggfunc="size", # 地上階数と用途地域(または地域地区)の組み合わせ毎に集計
fill_value=0, # 組み合わせが存在しない場合、0として扱う
)
また、Plotlyでも、ヒストグラムのバーを分類ごとに簡易に色分けできます。セルを追加して、次のコードを実行します。
import plotly.express as px
fig = px.histogram(area.gdf, x="storeysAboveGround", color="districtsAndZonesType", title="渋谷駅周辺の建築物の地上階数の分布(用途地域別)")
fig.show()
コラム:他のデータと組み合わせる
外部のデータをデータフレームとして読み込み、座標情報などを用いてマッチングすることで、PLATEAUのデータとその他のデータを組み合わせて利用することが可能です。
以下のコードは、施設の位置情報(経緯度)でマッチングすることで、オープンデータとして提供されている渋谷区の「公立図書館情報」に対して、渋谷区の3D都市モデルが持つ建築物データを付与する例です。実行結果を見るとわかるように、usageやdistrictPlanなどの各種属性のほか、geometryとして建物の形状が付与されています。
【東京都オーブンデータカタログ:公立図書館情報(渋谷区)】
https://catalog.data.metro.tokyo.lg.jp/dataset/t131130d3100000005
import geopandas as gpd
import pandas as pd
pd.set_option("display.min_rows", 20) # 表示設定
area = dataset.get_area() # 全範囲を取得
gdf = area.gdf.copy()
library_data_url = "https://www.opendata.metro.tokyo.lg.jp/shibuya/131130_shibuyaku_library.csv"
library_df = pd.read_csv(library_data_url)
library_gdf = gpd.GeoDataFrame(
library_df, geometry=gpd.points_from_xy(library_df["経度"], library_df["緯度"])
)
overlay_df = library_gdf.overlay(gdf)
overlay_df = overlay_df.merge(
gdf[["buildingId", "geometry"]], on="buildingId", suffixes=("_old", None)
)
overlay_df = overlay_df.drop(columns=["geometry_old"])
overlay_df = overlay_df.dropna(how="all", axis=1) # 値のない列を削除
overlay_df.iloc[0] # 1件目を表示
28.5.2 _ データの操作とデータセット(3D都市モデル)への反映
データフレームの内容を変更することで、データセット(3D都市モデル)のデータを直接操作できます。
ここでは例として、PLATEAUの属性値に基づいて、建築物の色を変更してみましょう。範囲オブジェクトのshow()メソッドで表示する際の色は、fill_color列で指定できます。セルを追加して、次のコードを実行すると、図28-23のように、宿泊施設に対して表示色を変更できます。
# "宿泊施設" に紫色のカラーコードを対応づける
color_map = {"宿泊施設": [255, 0, 255]}
# 用途情報(usage)をもとに列fill_colorの値を割り当て
area.gdf.loc[:, "fill_color"] = area.gdf["usage"].map(color_map)
area.show()
発展的な例として、先ほどの用途地域ごとに建築物を色分けしてみます。この場合、用途地域の種類ごとに色を割り当てる必要があります。まず、現在の範囲の用途地域の種類一覧を確認しましょう。セルを追加して、次のコードを実行します。
area.gdf["districtsAndZonesType"].value_counts()
上記の結果では、6種類の用途地域があるので、それぞれにカラーコードを対応づけます。今回は先ほどのヒストグラムと色を合わせるため、Plotlyのデフォルトの色分け(パレット)を使って種類ごとに色を割り当てます。セルを追加して次のコードを実行すると、色分けされた3D都市モデルが表示されます。
import plotly.express as px
# Plotlyのデフォルトの色分けを利用
colors = list(map(px.colors.hex_to_rgb, px.colors.qualitative.Plotly))
# 種類ごとの色の割り当てを作成
color_map = dict(zip(area.gdf["districtsAndZonesType"].unique(), colors))
# 用途地域(districtsAndZonesType)をもとに列fill_colorの値を割り当て
area.gdf.loc[:, "fill_color"] = area.gdf["districtsAndZonesType"].map(color_map)
area.show()
28.6 _ PLATEAUデータのエクスポート
PlateauKitで処理したデータセット(3D都市モデル)のデータを外部にエクスポートすることで、他のプログラムやアプリケーションでも、そのデータを利用できるようになります。PlateauKitは、広く使われているJSON形式をもとにしたGeoJSON形式 とCityJSON形式のファイルのエクスポートに対応しています。
28.6.1 _ GeoJSONとCityJSON
GeoJSONとCityJSONの特徴は、以下のとおりです。
① GeoJSON
GeoJSONは、JSON形式で地理的な空間データを表現するためのフォーマットです。空間データ(ジオメトリ)に加えて、属性をもつことができます。属性の一部として高さ情報を持たせることで、LOD1相当の3D建築物データをGeoJSONで表現できます。
GeoJSONの詳細については、例えば下記のWebページを参考にしてください。
【GIS実習オープン教材】
https://gis-oer.github.io/gitbook/book/materials/web_gis/GeoJSON/GeoJSON.html
② CityJSON
CityJSONは、CityGML(PLATEAUの標準フォーマットであるXML形式のデータ)のサブセットと互換性のあるJSON形式のフォーマットです。OGC(Open Geospatial Consortium)の標準のひとつとしても定められています。XML形式のCityGMLに比べて構造がシンプルで、ファイルサイズもコンパクトで処理しやすいという特徴があります。GeoJSONと異なり、LOD2以上の詳細な3D都市モデルの表現にも対応しています。
CityJSONの詳細については、CityJSONの公式サイトを参照してください。
【CityJSON公式サイト内の解説】
チュートリアル
https://www.cityjson.org/tutorials/getting-started/
CityJSONにおけるジオメトリの表現の解説
https://www.cityjson.org/dev/geom-arrays/
28.6.2 _ GeoJSONのエクスポートと利用
PlateauKitでは、範囲(Area)オブジェクトのto_geojson()メソッドを使って、データをGeoJSONとしてエクスポートできます。セルを追加して、次のコードを実行します。
from google.colab import files
json_data = area.to_geojson("shibuya_sta.geojson")
files.download("shibuya_sta.geojson") # Colabからダウンロード
処理が終了すると、shibuya_sta.geojsonという名前のファイルが作成され、実行しているPC上にダウンロードされます。
このファイルは、GeoJSONに対応したWebサービスやアプリケーションで開くことができます。このファイルを、国土地理院の電子地図上に表示してみましょう。
まず、国土地理院の電子地図(電子国土Web)にアクセスします。
【地理院地図(電子国土Web)】
https://maps.gsi.go.jp/
地図の画面が開いたら、先ほどダウンロードしたファイルをドラッグ&ドロップします。すると、エクスポートした範囲の平面図が地理院地図上に表示されます。クリックして属性等の詳細を表示することもできます。
他にも、PLATEAU VIEWの[Myデータ]からアップロードして確認したり、QGISなどのGISアプリケーションや、Deck.glなどのライブラリでも直接読み込めます。Deck.glでは、高さを反映するように設定することでLOD1相当の3D表示が可能です。
28.6.3 _ CityJSONのエクスポートと利用
CityJSONファイルも、同様に選択範囲(Area)のto_cityjson() メソッドを呼び出すことでエクスポートできます。セルを追加して、次のコードを実行します。ここでは、引数にtarget_epsg=3857(EPSGコード3857)を指定することで、一般に「Webメルカトル図法」と呼ばれる、Web地図で用いられる座標系に3D都市モデルの座標を変換(再投影)しています。
【メモ】
EPSGコードについては「TOPIC 3|3D都市モデルデータの基本[4/4]|CityGMLの座標・高さとデータ変換」などが参考になります。
from google.colab import files
area.to_cityjson("shibuya_sta.city.json", target_epsg=3857)
files.download("shibuya_sta.city.json") # Colabからダウンロード
CityJSONの強みは、CityGMLとほぼ互換の表現力を持ちながら、JSON形式であるため、比較的容易にエディタで編集したりプログラムで処理したりできることです。
地図やGIS関連のライブラリやアプリケーションでCityJSONにデフォルトで対応しているものはまだ多くありませんが、citygml-toolsなどのツールを使って、CityJSONから別のファイル形式に変換することができます。
【citygml-tools】
https://github.com/citygml4j/citygml-tools
またCityJSON公式のビューアであるCityJSON Ninjaを使って、CityJSONファイルの3D都市モデルをブラウザ上でプレビューすることができます。
実際にCityJSONファイルの都市モデルを表示してみましょう。まず、CityJSON Ninjaのページにアクセスします。
【CityJSON Ninja】
https://ninja.cityjson.org/
ファイルの選択欄から先ほど作成したファイルを選択するか、選択欄の上にファイルをドラッグ&ドロップします。すると、選択範囲の3D都市モデルが表示されます。
28.7 _ まとめ
このチュートリアルでは、PlateauKit+PlateauLabを使ってPLATEAUの3D都市モデルを読み込み、分析したり可視化したりする方法を説明しました。
PLATEAUの3D都市モデルはCityGML形式で配布されているため、初心者がそのまま扱うには少し難しいですが、このチュートリアルで説明したように、PlateauKit+PlateauLabを使えば比較的簡易に読み込んで扱うことができます。住所や施設名での範囲選択もできるため、切り出しのために経緯度を調べる必要もありません。また読み込んだデータを3D表示する際、スクロールや拡大縮小のほか、マウスで選択することもできるため、インタラクティブな操作にも対応できます。
そして読み込んだデータはPandas/GeoPandasのデータフレームとして扱えるため、さまざまな分析、そして、ライブラリを用いた可視化も容易です。このチュートリアルで説明した属性に基づく色分け表示をはじめ、PLATEAUが持つ幅広い属性を活用する場面で活躍することでしょう。
【文】
小関 健太郎
【協力】
大澤文孝