チュートリアル 4: 道路データのインポート

チュートリアルデータ

チュートリアル データは、[Help] メニュー → [Download Tutorials and Examples…] を選択し、[CityEngine Tutorial] からダウンロードすることができます。

概要

チュートリアル 4 では、外部からインポートした道路データを扱う方法をご紹介します。外部のアプリケーションで作成、またはデータベースから導入された .dxf、.osm または *.shp ファイル フォーマット内にある道路ネットワーク データを CityEngine にインポートし、街作成のために初期データとして使用します。

演習
Part 1: DXF から道路データをインポート
Part 2: OpenStreet Map (OSM) から道路データをインポート
Part 3: シェープファイル (.shp) から道路データをインポート

Part 1: DXF から道路データをインポート

CityEngine 道路ネットワーク

CityEngine StreetNetwork (道路ネットワーク) は、Graph Node (交差点) と Graph Edge (道路セグメント) からなる属性付きの Graph (CityEngine ではライン データを Graph と呼びます) です。これは、CiyEngine 内で作成できる道路作成フィーチャから生成、または DXF などの外部ファイルからインポートすることができます。

CityEngine で使用するための道路データの準備

今回の例では、海岸沿いの主要道路をイラストレーターでジオメトリ ツールとパスを使用してスケッチしたものを用意しました。

外部アプリケーションである CAD から .dxf ファイルをエクスポート

道路ネットワークをエクスポートする際、CityEngine の単位システム (インポートされたファイルは常にメートルとして解釈されます。) と単位が一致していることをご確認ください。どの寸法で書かれているかを確認するには、data フォルダーの sesame_streetsketch.dxf を右クリック → [Open with…] → [Text] エディターで *.dxf を開き、頂点データを探します (Ctrl + F キーで検索ウィンドウを表示できます)。今回の例では、必要な寸法を取得するためにエクスポート スケールを 1 ピクセル = 10 単位として設定しています (エクスポート オプション画像参照)。

DXF ファイル エクスポートから生成された頂点データ:
頂点データ

...
AcDb2dVertex
 10
1244.99951171875
 20
234.998046875
 30
0.0
  0
VERTEX
...

.dxf ファイルの CityEngine へのインポート

  1. sesame_01.cej シーン ファイルを開きます。

  2. data フォルダーで [sesame_streetsketch.dxf] を選択します。

  3. ファイルを右クリックし、[Import] を選択します。ここでは既にデータ Layer2 がグラフ レイヤーとしてインポートするために追加されています。

  4. [Run Graph Cleanup Tool after Import] のチェック ボックスがオンになっていることを確認して [Next] をクリックします。

  5. [Intersect Segment]、[Snap Nodes to Segments] および、[Merge Nodes] のチェックボックスをオンにします。

  6. Horizontal および Vertical Snapping Distance を両方とも 1 に設定します。Horizontal および Vertical Merge Distance を 5 に設定します。

  7. [Finish] をクリックします。

新しいグラフ レイヤー sesame_streetsketch が [Scene Editor] ウィンドウに表示されます。 sesame_02.cej を開いて、インポートされたシーンを確認することもできます。

マイナー道路の生成

主要道路をインポートしたら、道路ネットワークを微調整して、マイナーな道路を生成します。 CityEngine の道路生成アルゴリズムは既存の閉鎖ブロック (街区) を埋めようとするので、反復的に道路ブロックを生成すると同時に道路も生成されます。

  1. マイナー道路を生成したいブロックにズームします。
  2. [Polygonal Street Creation] や [Freehand Street Creation] ツールなどを使用して、短い道路を 2 本作成します。これは (a) ブロック内の道路の一般的な方向を指定します。そして (b) 道路生成アルゴリズムの開始ノードを定義します。
  3. 手動で道路セグメントをいくつか作成します。
  4. 選択ツールをクリックし、新規に生成した道路セグメントを選択します。
  5. [Graph] メニュー → [Grow streets] をクリックし、[Grow Streets] ダイアログを起動します。
  6. 任意のパターンを選択し、[Finish] をクリックします。 以上の手順を繰り返すと道路ブロックが生成できます。

    sesame_03.cej を開くと、道路ネットワークの設定が完了した模範のシーンを確認できます。

最終結果

シーン ファイル sesame_12.cej を開くと、以下の画像のように抽出され、分割された区画 (lots) を含む道路ネットワークを見ることができます。

Part 2: OpenStreet Map (OSM) から道路データをインポート

“OpenStreetMaps は道路マップなどの大衆向けのフリー ジオグラフィック データを作成、提供することを目的としたプロジェクトです。" –openstreetmap.org

OpenStreetMap

OSM はマップで使用されるベクター データを表現する XML ベースのフォーマットです。そしてNodes、Ways、および他のすべてのエレメントを意味する Closed Ways の 3 つに分類されます。

  • Nodes: セグメント間を示すポイントです。
  • Ways: ノードの順序リストです。エディターでライン セグメントで接続されて表示されます。
  • Closed Ways: Closed ways は完全にループで行われ、公園や湖、島などのエリアを表現します。

OpenStreetMap から OSM ファイルをエクスポート

  • CityEngine プロジェクトの data フォルダーに .osm ファイルがあることを確認します。

OSM ファイルの CityEngine へのインポート

  1. [File] メニュー→ [New…] → [CityEngine] → [CityEngine Scene] をクリックし、新規シーン ファイルを開きます。

  2. [Navigator] ウィンドウの data フォルダーから、[3D View] ウィンドウに [map.osm] ファイルをドラッグします。

  3. OSM インポート ダイアログ内で、インポートするレイヤーを選択します。基本的にすべての道路は highway レイヤー、建物は building レイヤーにあります。

  4. その他のオプションは以下の図のように設定します。

  5. [Finish] をクリックします。

  6. 提案された座標系の [WGS 1984 UTM Zone 33N] を選択します。

  7. [OK] をクリックします。

    [Scene Editor] ウィンドウに 2 つの新規レイヤー (道路ネットワークとシェープ) が表示されています。[3D View] ウィンドウでは OSM データが表示され、インポートされた道路のセンターラインの上に自動的に生成された道路シェープが表示されています。

  8. [Graph network] レイヤーの名前を 「OSM_Streets」 に変更します。

  9. [Shape] レイヤーの名前を 「OSM_Shapes」 に変更します。

道路幅

生成された道路シェープを拡大すると、各道路の幅が異なるのが分かります。Map OSM tags を有効にした状態で OSM データをインポートすると、CityEngine は OSM 道路タイプの道幅を定義したレイヤー属性を作成します。

  1. [3D View] ウィンドウ内で道路を 1 つ選択し、[Inspector] ウィンドウの Segment タブでパラメーターを確認します。 下図の例では、インポートした OSM Layer OSM_Streets からレイヤー属性マッピングに応じて、道路と歩道幅パラメーターに高速道路のタイプをアサインしました。

    新しい幅の値を [streetWidth] パラメーター (値はユーザーが設定した値に変更可能) に設定、またはツールバーにある Street Edit ツールを使用して、手動で道路幅を変更することもできます。

OSM 属性のマッピング

  1. [Scene Editor] ウィンドウで新規 [Graph Network] レイヤーを選択し、[Inspector] ウィンドウでレイヤーの属性コードを確認します。 下図の道路セグメントは tertiary タイプの道路で、streetWidthByClass 関数で 6 メートルに設定されています。そして、マッピングを任意のままに変更することができます。
//------------------------- 
// Example OSM Tag Mapping

streetscale = 1 // street width scale factor

width = getFloatObjectAttr("width", false)
lanes = getFloatObjectAttr("lanes", false)

attr streetWidth = // street width dependeding on available attributes
    case width > 0 : width       * streetscale
    case lanes > 0 : lanes * 3.5 * streetscale
    else           : streetWidthByClass * streetscale * oneway

class = getStringObjectAttr("highway", false)

streetWidthByClass =
    case class == "primary"     : 8
    case class == "secondary"   : 7
    case class == "tertiary"    : 6
    case class == "motorway"    : 12
    case class == "trunk"       : 11
    case class == "road"        : 6
    case class == "residential" : 5
    case class == "footway"     : 2
    case class == "cycleway"    : 2
    case class == "steps"       : 2
    else                        : 4

oneway = // oneway width correction
    case getStringObjectAttr("oneway", false) == "yes" : 0.5
    else                                               : 1

sidewalkscale = 1 // sidewalk width scale factor

sidewalkWidth =
    case class == "primary"     : 2
    case class == "secondary"   : 2
    case class == "tertiary"    : 2
    case class == "residential" : 2
    else                        : 0

attr sidewalkWidthLeft  = sidewalkWidth * sidewalkscale
attr sidewalkWidthRight = sidewalkWidth * sidewalkscale

データの競合

インポートした OSM データには不要なものが含まれていることがあり、これが道路の重複等の競合を起こすことがあります。ブロックができていない箇所や赤い点線の箇所は、セグメントが接続されていなかったり、道路が重複してブロックが作成できないなどの状態を表します。競合を解消するには以下のようにいくつか方法があります:

  • [Graph] メニュー → [Cleanup Graph…] から、Cleanup Graph ツールで、パラメーターを変更する方法。
  • インポート ダイアログで、高速道路レイヤーの道路を間引いて選択する方法。
  • 道路同士の重複を減らすために、道路と歩道幅をより小さい値に設定する方法。
  • インポート後に交差点や平行している道路を、結合または除去して手動で道路ネットワークの競合を解消する方法。

下図は、接続されていない Graph Node を解消する例の前と後を表しています。

OSM 道路データは標高データ (level 属性) を含んでいますが、誤っている場合があります。Run Generate Bridges ツール オプションを有効にすると、CityEngine が自動で解決策を提示してくれます。

衛星画像マップ レイヤーの追加

  1. [Fileメニュー] → [Import…] → [CityEngine Layers] → [Texture Import] をクリックします。
  2. Texture file の参照ボタンから、maps フォルダーにある [pompeii_satellite.tif] ファイルを参照します。
  3. 画像の座標系にはすでに設定されてある WGS 1984 UTM Zone 33N を使用します。
  4. World ファイル pompeii_satellite.jgw にある情報からサイズ (bounds) とオフセット (Location) が自動的に設定されます。詳細については ラスター データセットのワールド ファイル をご参照ください。
  5. [Finish] をクリックし、新規テクスチャ マップ レイヤーを作成します。

CityEngine はインポートで画像を再投影することはありません。画像のインポートで座標系を選択するのは、正確な位置情報を計算するためです。そのため、画像を準備する前に CityEngine のシーンで使用された投影法を用意することが必須となります。 (上記の例では、ポンペイ衛星画像は ArcMap 上で WGS 1984 UTM Zone 33N に再投影しています (本チュートリアルのシーンでは、シーンの地理座標系が使用されています) 。

モデルの生成

  1. [Scene Editor] ウィンドウ 内の [OSM_Shapes] レイヤーにあるすべてのシェープを選択します。
  2. [Navigator] ウィンドウの rules フォルダーから [osm_generic.cga] ファイルを選択したシェープにドラッグ & ドロップします。シェープのいくつかは既に有効なスタート ルールのセットを持っているので、以下のダイアログが表示されますが、[Skip] をクリックします。
  3. [Generate] ボタンをクリックして、生成します。 お気づきの通り、道路だけが生成されていて、一見建物シェープは生成されていないように見えます。建物シェープを 1 つ選択し、Inspector ウィンドウで確認してみると分かりますが、Start Rule がアサインされていません。
  4. これを修正するには、[3D View] ウィンドウで選択したシェープを右クリックし、背景メニューから、[Select] → [Select Objects with Same Start Rule] をクリックし、Start Rule が定義されていないすべてのシェープを選択します。
  5. [Inspector] ウィンドウで Shapes (344) のタブを開きます (もう 1 つの Shapes タブは道路ネットワーク用です) 。Start Rule フィールドの隣にある [Select] ボタンをクリックします。[Set Start Rule] ダイアログで、[Lot] を選択します。
  6. 再度 [Generate] ボタンをクリックします。

Part 3: シェープファイル (.shp) から道路データをインポート

シェープファイルとジオデータベースからインポートする道路はほとんど同じです。そのため、ここでは ジオデータベースからのデータのインポートについては省きます。

シェープファイル データ

  1. プロジェクトの data フォルダーにある streets.shp のファイルをインポートします。 シェープファイルには、インポートする際に正確なジオリファレンスをする「.prj」ファイルが入っています。今回使用するデータは CityEngine に道路セグメントとしてインポートするポリラインです。データセットには属性情報として、CityEngine 内でコントロールできる道路幅 (width) の情報が入っています。

ArcMap で表示したシェープファイルの属性テーブル:

データのインポート

  1. CityEngine で空の新規シーンを作成します。
  2. [Navigator] ウィンドウから [3D View] ウィンドウに [Streets.shp] シェープファイルをドラッグします。ドラッグ & ドロップはデフォルト設定で使用します。
  3. インポート作業の過程で、シーンの座標系を設定します。シェープファイルに投影する座標系はデフォルトで自動的に提案されています。

この例では道路幅を調整するために、シェープファイルに width (幅) 属性が入っています。インポートするシェープファイルにこのような属性が入っていなければ、道路幅はデフォルトの設定になります。この道路幅はインポート後に手動で設定することもできます。また、属性マッピングを使用して他の属性名にマッピングすることもできます。

  • クリーンアップ インポートした道路シェープは道路シェープ同士で競合することがあり、赤い点線で示されます。これは、[Cleanup Graph] ツールの [Resolve Conflicting Shapes] を有効にして、自動的に修正することができます。また、[Simplify Graph] ツールを使用して、Graph Segment の不必要な複雑な個所を、不必要なグラフ設定を削除し、接線を設定することで減らすことができます。 詳細は Help マニュアルの street network セクションをご参照ください。

ルール ファイルの適用

  1. 道路シェープをすべて選択します。
  2. [Navigator] ウィンドウで、プロジェクト ルール フォルダーから [sesame_01.cga] ルール ファイルを [3D View] ウィンドウ内の選択したシェープ上にドラッグします。 簡易道路モデルが生成されます。