Section 1
東京都オープンデータの歩き方
まずは「どこに何があるか」と「使うときの作法」を押さえます。
カタログサイト
東京都のオープンデータは 東京都オープンデータカタログサイト(CKANベース)に集約されています。防災・暮らし・健康医療・観光・産業など十数分野に分類されたデータセットが並び、各データセットのページから CSV / GeoJSON / Shapefile などの実データファイルへ直接リンクされています。検索は分野・組織(局・区市町村)・タグの3方向から絞り込めるので、まず分野タグで当たりをつけてから個別データセットの説明文(更新頻度・粒度・カラム定義)を読むのが早道です。
action API(後述)でデータセットのメタデータ一覧をプログラムから取得することもできます。手作業でのデータセット探索がつらくなったら試す価値があります。
CC BY 4.0ライセンスと出典表記の書き方
東京都オープンデータの多くは クリエイティブ・コモンズ 表示4.0国際(CC BY 4.0) で提供されています。CC BYは「出典を明記すれば、商用利用・改変・再配布が自由」というライセンスです。裏を返せば、出典表記を欠くと利用条件違反になるので、成果物(スライド・README・アプリのフッターなど)に必ず一文を入れます。
出典:東京都オープンデータカタログサイト(https://catalog.data.metro.tokyo.lg.jp/)
「<データセット名を記載>」を加工して作成(CC BY 4.0)
出典:国土交通省 Project PLATEAU「3D都市モデル(<対象自治体名>)」
(https://www.mlit.go.jp/plateau/)を加工して作成
PLATEAU利用規約に基づく(CC BY 4.0 相当)
データセットごとに個別のライセンス(利用規約リンク)が明記されている場合はそちらが優先されます。カタログのデータセットページ下部の「ライセンス」欄を必ず確認してください。
API vs CSV/GeoJSON — どちらを使うか
CSV / GeoJSON ダウンロード
更新頻度が低い(月次・年次)マスタ系データに向く。事前にファイルを取得してローカル/R2にキャッシュし、ビルド時に処理するだけで済む。依存が少なく壊れにくい。
API(CKAN Action API等)
頻繁に更新される・大きすぎてダウンロードが非現実的・検索/絞り込みをサーバ側に任せたいケースに向く。CKANのpackage_searchなどのActionを叩けばメタデータをJSONで取得できる。気象庁XML/JSONやe-Statも同様にAPI提供。
Section 2
PLATEAU 3D都市モデル実践
国交省 Project PLATEAU の3D都市モデルを、実際にブラウザで表示・解析する視点でひも解きます。
3D Tiles と CityGML の違い
CityGMLはPLATEAUの正本フォーマットで、建物・道路・都市計画情報などをXMLで厳密にモデリングした国際標準(OGC)です。属性が豊富で解析用途に向く一方、ファイルが大きく、そのままブラウザで描画するのには向きません。3D TilesはCesiumが策定した、Web配信・ストリーミング表示に最適化されたフォーマットで、PLATEAUではCityGMLから3D Tilesへの変換済みデータが配布されています。ジオメトリは.b3dm(バッチ化3Dモデル)という形式のタイルに分割され、カメラ距離に応じて必要なタイルだけを段階的に読み込む(LOD=Level of Detailのツリー構造)ため、ブラウザで直接扱うなら3D Tilesが現実的な選択です。
認証不要で直接使える
plateau.geospatial.jp が配信する3D TilesのCDNは認証不要で、tileset.jsonやb3dmファイルにブラウザ・スクリプトから直接 fetch できます。例えば江東区の建物データは次のURLから取得できます(実在するURLで、2026年7月時点で到達確認済み)。
https://plateau.geospatial.jp/main/data/3d-tiles/bldg/13100_tokyo/13108_koto-ku/notexture/tileset.json
URLパターンは .../3d-tiles/bldg/<都道府県コード>_<都道府県名>/<市区町村コード>_<区名>/notexture/tileset.json。他区も同様のパターンでアクセスできます。
b3dm の中身 — glTF + batch table
.b3dmは「28バイトの固定長ヘッダ+feature table+batch table+glTF(GLB)ジオメトリ」という単純なバイナリレイアウトです。ヘッダはリトルエンディアンの符号なし32bit整数7個で、それぞれ magic(b3dm固定)・version・byteLength・featureTableJSONByteLength・featureTableBinaryByteLength・batchTableJSONByteLength・batchTableBinaryByteLengthを表します。この長さ情報を使ってファイルを4つのセクションに機械的に切り分けられます。
batch tableには、そのタイルに含まれる各建物(フィーチャ)ごとの属性がJSON配列として入っています。数値属性の一部(計測高さ、中心座標など)はJSON本文ではなく後続のバイナリ領域に{"byteOffset": N, "componentType": "DOUBLE", "type": "SCALAR"}のようなポインタ形式で格納されており、オフセットからdoubleを読み出してデコードします。重要なのは、浸水想定深(例:〇〇水系〇〇洪水浸水想定区域_想定最大規模_浸水深)のような防災属性もbatch tableに直接埋め込まれている点です。これはCityGMLのuro:disasterRisk拡張がPLATEAUの3D Tiles変換時にbatch table属性として引き継がれているためで、CityGMLを別途ダウンロードしなくても3D Tilesだけで浸水リスク値にアクセスできます。
Three.js / CesiumJS / deck.gl — どれを使うか
| ライブラリ | 3D Tiles対応 | 向いているケース |
|---|---|---|
| CesiumJS | ネイティブ(Cesium3DTileset)。地球儀ベースの表示が組み込み済み。 | PLATEAU公式ビューア相当の地図・地形連携が必要、最短で3D Tilesを表示したい場合。バンドルサイズは大きめ。 |
| deck.gl | Tile3DLayer(loaders.gl経由)。 | 他のGISレイヤ(ヒートマップ、点群、パス等)と重ね合わせたい、Reactアプリに組み込みたい場合。 |
| Three.js | 非公式ローダ(例:3d-tiles-renderer)を追加導入。 | 既存のThree.jsシーンに建物データを混ぜたい、バンドルを最小限にしたい、独自のレンダリング制御が必要な場合。 |
最小コード例 — tileset.json を取得して子タイルを一覧表示
特定のライブラリに依存しない、素のfetchだけのコピペ用スニペットです。認証ヘッダは不要です。
// PLATEAU 3D Tiles: ルートのtileset.jsonを取得して子タイルの概要を出す最小例
const url = "https://plateau.geospatial.jp/main/data/3d-tiles/bldg/13100_tokyo/13108_koto-ku/notexture/tileset.json";
fetch(url)
.then((res) => res.json())
.then((tileset) => {
console.log("asset.version:", tileset.asset.version);
console.log("root.geometricError:", tileset.root.geometricError);
console.log("root.boundingVolume.region:", tileset.root.boundingVolume.region);
// 子タイルを列挙(各tileはさらに子を持つ階層構造=LODツリー)
(tileset.root.children || []).forEach((child, i) => {
console.log(
`child[${i}] uri=${child.content?.uri} geometricError=${child.geometricError}`
);
});
});
Section 3
データ品質の注意点
「属性がある」と「値が入っている」は別問題です。使う前に必ず欠損チェックをしましょう。
PLATEAUのCityGML/3D Tilesは、tileset.jsonのpropertiesブロックにデータセット全体で宣言されている属性キー(例:計測高さ、地上階数、地下階数、住所、各種浸水深など)が並んでいますが、キーが存在すること=全建物に値が入っていることを意味しません。属性の充足率(non-null率)はデータセットや区、さらには同じデータセット内のタイルによっても大きくばらつきます。地上階数のように測量・登記情報との突合が必要な属性は欠損が多く、逆に計測高さや座標のようにLiDAR/写真測量から直接得られる属性はほぼ100%埋まっている、という傾向があります。分析やアプリのロジックを組む前に、対象データセットの充足率を自分で計測することを強く推奨します。
欠損チェックの最小スニペット(Python標準ライブラリのみ)
b3dmのbatch table JSONを取り出し、各属性キーごとに非null値の割合を出すだけの汎用スクリプトです。特定区・特定データセットの数値を語るのではなく、どのデータセットでも同じ手順で確認できる「方法」として使ってください。
import json
import struct
import urllib.request
def read_batch_table_json(b3dm_bytes: bytes) -> dict:
# 28バイト固定ヘッダ: magic, version, byteLength,
# featureTableJSONByteLength, featureTableBinaryByteLength,
# batchTableJSONByteLength, batchTableBinaryByteLength
(_magic, _version, _byte_len,
ft_json_len, ft_bin_len,
bt_json_len, _bt_bin_len) = struct.unpack_from("<4sIIIIII", b3dm_bytes, 0)
offset = 28 + ft_json_len + ft_bin_len
bt_json_bytes = b3dm_bytes[offset:offset + bt_json_len]
return json.loads(bt_json_bytes)
def report_null_rate(batch_table: dict) -> None:
for key, values in batch_table.items():
if not isinstance(values, list):
continue # バイナリ参照({"byteOffset": ...})はここでは対象外
total = len(values)
non_null = sum(1 for v in values if v not in (None, "", "NULL"))
rate = non_null / total if total else 0
print(f"{key}: {non_null}/{total} ({rate:.0%})")
url = "https://plateau.geospatial.jp/main/data/3d-tiles/bldg/13100_tokyo/13108_koto-ku/notexture/data/data3.b3dm"
b3dm_bytes = urllib.request.urlopen(url).read()
report_null_rate(read_batch_table_json(b3dm_bytes))
data0.b3dm〜dataN.b3dm)にループさせ、キーごとの充足率を集計してから「このキーは使える/使えない」を判断すると、後工程で無駄な欠損対応コードを書かずに済みます。
Section 4
よく組み合わせられる公的API・データ
東京都オープンデータ/PLATEAUと相性の良い、代表的な公的データソースです。
| データソース | 何が取れるか | ライセンス/注意点 |
|---|---|---|
| 気象庁防災情報XML/JSON xml.kishou.go.jp |
注意報・警報、地震、津波、気象通報などのリアルタイム配信フィード(XML/一部JSON)。 | 気象庁の公開データ。二次利用可だが商用配信時は気象庁の「气象等の情報の利用に関する注意事項」を確認。 |
| 国土数値情報 nlftp.mlit.go.jp/ksj |
行政区域、土地利用、都市計画、洪水浸水想定区域など全国の地理空間データ(Shapefile/GeoJSON)。 | 国土交通省の利用規約に基づき提供。多くはCC BY相当(出典表記が条件)。 |
| e-Stat(政府統計の総合窓口) e-stat.go.jp |
国勢調査・人口推計・経済センサスなど各府省の統計データ。API(e-Stat API)でも取得可。 | 政府統計の二次利用ルールに基づく。出典明記の上、加工・再配布が可能な統計が多い。 |
| OpenStreetMap openstreetmap.org |
道路網、POI、建物フットプリントなど世界規模のクラウドソース地図データ。 | ODbL(Open Database License)。CC BYと異なりShare-Alike(同一条件での再配布)義務がある点に注意。 |
| 重ねるハザードマップ(国交省ハザードマップポータル) disaportal.gsi.go.jp |
洪水・土砂災害・高潮・津波などの浸水想定区域を、タイル画像(WMTS)として配信。 | 国土地理院・国交省の公開データ。出典表記の上で利用可能(各レイヤのページに個別規約あり)。 |
Section 5
Cloudflareでのホスティング Tips
PLATEAUのb3dmやCityGMLはファイルサイズが大きくなりがちです。置き場所の使い分けだけ押さえておきます。
Pages — フロント一式
HTML/JS/CSSなどアプリ本体はCloudflare Pagesで静的配信。GitHub連携でpushするだけで自動デプロイされます。
R2 — 大きめのデータ
ダウンロード済みのb3dm/CityGML/加工済みGeoJSONなど数十MB〜数GB級のファイルはR2(S3互換オブジェクトストレージ)に置くのが定石。下り転送料が無料な点もタイル配信と相性が良い。
Cloudflareスタックの詳細ガイド
Workers・D1・KV・Vectorize・Images/Streamなど、ハッカソンで無償提供されるCloudflareの各サービスの使いどころは別ガイドにまとめています。
本ページは1参加者(門戸良介)が個人の立場で作成した非公式の技術ガイドです。東京都・GovTech東京・ハッカソン事務局の公式資料ではありません。内容の正確性には注意を払っていますが、最新のライセンス条件・URL・仕様は各データ提供元の一次情報をご確認ください。掲載URLは2026年7月時点で到達確認済みです。