IU Tips

Plateauデータを使って市街モデルを作る② Grasshoperモデリング編【Plateau】【Grasshopper】

2024.12.02

こんにちは。
IU BIM STUDIO原田です。

前回に引き続き、国土交通省のPlateauのデータを使って簡易な市街モデルを作成したいと思います。前回はPlateauのデータをJSONに保存しました。

前回の内容はこちらをご覧ください。

今回は書き出したJSONをGrasshopperで読み込んでモデルを作成していきます。

GrasshopperでJSON処理

GrasshopperでJSONを処理するにはJSwanというプラグインを使います。
ダウンロードはFood 4 Rhinoからすることができます。

https://www.food4rhino.com/en/app/jswan

こちらをインストールしてください。

基本的なJSwanの使い方

JSwanはリスト部分の変換はDeserialize Jsonを使い、キーバリュー型部分の変換はDeserialize Keys and Valuesを使います。

これらを組み合わせることで、欲しい情報を取り出していきます。

JSONデータの解析

まず、前回書き出したJSONのデータ構造をおさらいしておきます。
Plateauのデータを抽出・変換して下記のようなモデルに必要なデータだけを取り出しました。

[
    {
        "coords": [
            [
                -46869.83000000091,
                -146672.14000010333,
                0.0
            ],
            [
                -46868.329999997906,
                -146652.1400001045,
                0.0
            ],
            [
                -46880.07999999935,
                -146651.1400001031,
                0.0
            ],
            [
                -46881.779999999766,
                -146671.0600001041,
                0.0
            ],
            [
                -46869.83000000091,
                -146672.14000010333,
                0.0
            ]
        ],
        "height": 35.8
    },
	……
]

データには底面の頂点座標と建物の高さが格納されています。

それではGrasshopperでスクリプトを作成していきます。

JSwanを使って座標と高さを取り出します。
Data Damは一時的に処理をせき止めるために使うコンポーネントです。処理が重い時に使うと良いでしょう。

キーを指定して座標と高さを取り出します。座標はさらに入れ子のリストになっているため、Desrialize Jsonをつないでデータを抽出していきます。

ポリラインの作成

データを抽出できたら加工をしていきます。
まず頂点を作成し、頂点を結ぶポリラインを作成します。

List Itemで座標データからx,y,zの値を取り出し、
Construct Pointで点を作成、
Path Mapperで建物ごとに組になるようツリーを整理し、PolyLineでポリラインを作成します。

建物形状の作成

ポリラインができたら、ポリラインで囲まれた範囲の面を作成します。
通常、閉じたポリラインから面を作るにはBoundary Surfaceを使います。
そしてできた面を高さ分垂直方向に押し出してあげればよいです。

ただ、ここで困ったことが起きました。 

作成した底面と高さから作成したベクトルの数が合っていません。

おそらくBoundary Surfaceの処理でエラーが起きていると思われますが、どの形状でエラーが起きているかわからないと面と高さとの対応がずれてしまう可能性があります。

そこで、今回はPythonスクリプトを使うことにしました。
Pythonコンポーネントを使うと、PythonでGrasshopperの要素を操作することができます。

コードは次の通りです。

import rhinoscriptsyntax as rs

a =[]

for polyline in polylines:
    result = rs.AddPlanarSrf([polyline])
    if result:
        a.append(result[0])
    else:
        a.append(None)

AddPlanarSrfは平面を作成する関数で、基本的にBoundary Surfaceと同じようなものです。
これは複数のポリラインを一括で処理できるのですが、どれがエラーになっているか知りたいためポリラインをひとつずつ作成し、エラーが起きたらNoneを結果に追加するようにしました。

こうすれば、どこでエラーが起きているか調べられますし、最悪エラーの部分はダメでも他は正しく作成することができます。

Pythonコンポーネントに変えてみると、底面とベクトルの数が合いました!!
これで少なくともずれることはなさそうです。

ただ、ざっと中身を調べてみたところエラーはなく、これがなぜなのかは謎のままです…

色の変更

建物形状の色を変えてみましょう

Color Pickerで色を決めて、Custom Previewで変更します。

これで市街モデルが完成しました。

今回のまとめ

Grasshopperの全体は下記の画像の通りです。

処理が重かったのでData Damをところどころ挟んでいますが、処理が重くなければなくても問題ありません。

今回、面の作成にPythonコンポーネントを使いました。Grasshopperだけで解決する方法もあるかもしれませんが、Pythonが使えるとGrasshopperのちょっとした面倒なところを補完できるので便利です。

また、たいした処理でもないけどコンポーネントをたくさん使わないといけないような場合はPythonでまとめてあげた方が可読性が上がります。Grasshopperはコンポーネントがぐちゃぐちゃになりがちなので適度にまとめると良いでしょう。

まとめ

以上のような方法でPlateauのデータを使ってGrasshopperで市街モデルを作成できました。
ベイクすればRhinoモデルとして使うこともできます。

これでPlateauのデータを活用することができますね。

最後までお読みいただきありがとうございました。