Densyakunのブログ

Qiitaもやってます: https://qiita.com/Densyakun

GISを活用したBve5路線データの作成方法

こんにちは、電車君です。

 

GISを活用してBve5路線データを作成する事で、GoogleMapの画像を貼り付けたり、手作業でやるよりも精密に作ることができます

 

一番良いのは、平面曲線や縦断曲線などの線形の情報があることですが、

本などの資料を購入するよりもコストがかからずにどんな路線でも出来ますので、その方法や手順について解説します。

 

手順が多いのですが、大まかに説明すると、Blenderに地理情報を入れて、Blenderで線形などのガイドとなるストラクチャを作り、それをBve5で読み込み、ガイドに合わせて路線を作成します。

 

注意

  • この記事ではBlender 2.79における操作について解説しています。2.8以降では操作が異なる場合があります。

 

 

GISOSMについて

GISとは、地理情報システムのことです。

 

今回はOpenStreetMapOSM)から地理情報をダウンロードして使用します。

OpenStreetMapとは、誰でも編集が可能なみんなで作る地図サービスです。

OpenStreetMapからダウンロードするデータは.osmファイルになります。

後述のBlenderGISを用いてダウンロードしますので、OpenStreetMapからダウンロードしなくて大丈夫です(.osmや、その他の地理情報データをインポートする事もできます)。

 

Blender

今回はBlenderと言う無料の3Dモデリングソフトを使用します。

こちらからBlenderをダウンロード、インストールして下さい。

https://www.blender.org/

 

Blenderの使い方については、ここでは解説しませんので、こちらを参考にして下さい。

https://blender-cg.net/

 

BlenderGIS

次は、Blenderで地理情報データを使用する為に、BlenderGISと言うBlenderアドオンをインストールします。

 

BlenderGISのインストール方法についてはこちらにあります。

https://github.com/domlysz/BlenderGIS/wiki/Install-and-usage

ですが少し難しいので、ここで解説をします。

 

まずBlenderGISを動作させるには、GDALと言うものが必要になります。

GDALをBlenderGISのほうで解説されている方法ではなく、Conda(Anacondaを用いた方法でインストールします(BlenderGISで解説されている方法ではインストールできない場合があります)。

 

BlenderPythonと言うプログラミング言語で出来ており、

Pythonではライブラリを入れる事で機能を増やす事ができるようになっています。

BlenderGISが必要としているGDALはPythonのライブラリです。

AnacondaはPythonのライブラリを簡単に管理する事ができます。

 

Anacondaはこちら

https://www.anaconda.com/

 

Anacondaをインストールしたら、GDALをインストールします。

コマンドを実行してインストールするのですが、

Windowsでは、スタートメニューボタンを右クリックして「コマンドプロンプト」を選択すると、コマンドプロンプトを開けます。

コマンドプロンプトでこちらの通りにコマンドを実行して下さい。

https://gdal.org/download.html#download

 

次にBlenderGISをインストールします。

先程のインストール方法に従って下さい。

 

BlenderGISの初期設定

BlenderGISを導入すると最初に初期設定が必要になります。

 

左側のメニューから GIS を開いて、

f:id:Densyakun:20200406010218p:plain

 

Preferences を押してアドオンの設定を開いてください。

f:id:Densyakun:20200406010353p:plain

 

Basemaps 内の Cache folder の右のボタンを押して、

キャッシュを保存するフォルダを指定します。

自分の好きなフォルダを指定できます。

空のフォルダを作成して、それを指定することをおすすめします。

f:id:Densyakun:20200406014024p:plain

以上の設定は初回起動時にのみ行います。

今後は不要です。

 

プロジェクトを作る時に

私の場合ですが、プロジェクトを作る時には、

デフォルトのプロジェクトにある Lamp 以外の、

Camera と Cube のオブジェクトを削除して、

Lamp を設定でポイントからヘミにします。

 

このオブジェクトはレイヤー1に置いたままで、

後で複数のレイヤーを使います

 

Basemapで作成したい場所に移動する

Basemap とはBlenderGISの機能で、

Blender上で地図を表示しながら編集する事ができます。

 

GISメニューから、 Basemap を押してください。

f:id:Densyakun:20200406081157p:plain

 

ソースGoogle 、 レイヤーMap 、 Tile matrix setWeb Mercator にして、

OK を押してください。

以前はOSMの地図が表示できたのですが、

20年2月現在ではGoogleMapしか表示できませんでした。

f:id:Densyakun:20200406083756p:plain

 

すると地図が表示されます。

f:id:Densyakun:20200406094434p:plain

3Dビューの下の方に Map view と表示されます。

この状態では地図の操作のみができます。

 

マウスドラッグ移動スクロールズームができます。

Google Mapではズームレベルが 0~22 まですべてサポートされていますが、

OSMなど、一部ズームレベルでは表示できない場合があります。

 

Gキーで検索もできますが、ぜんぜん違う場所に行ってしまう場合があり、おすすめできません。

 

ここ重要!

BlenderGISにはBlenderのプロジェクトに原点の経緯度が記録されます

Basemapを操作しようとすると、原点の経緯度が移動し、オブジェクトも移動します。

ただし、表示しているレイヤーの物体しか移動しないので、地図を移動する際は全てのレイヤーを表示して下さい

 

 

ですがBasemapの操作が反映されるのには少しクセがあるので、

小規模の移動などは、できる限りBlenderのカメラを移動するようにして下さい。

 

移動とズームで自分が作成したい場所を表示してください。

画像のように作成範囲の全体を収めるようにしてください。

f:id:Densyakun:20200406142007p:plain

ただし、一度に広範囲のデータを入れることはできません。

また、広いと環境によってはPCが重たくなってしまうため、

作成したい路線の各駅間または、3平方km程度に分割して入れることをお勧めします。

また、後でBve5上でデータを表示します。

 

Bve5では進行方向にあるものが表示されるため、

A駅からB駅に向かう区間の場合、B駅にストラクチャを設置するイメージとなります。

そのため、あまり距離があると描画距離を遠くしなければならない事にも注意して下さい。

 

範囲を表示したら、

Escキーで地図の操作を中止して、Blenderの操作に戻って下さい。

再度地図で移動したい場合は、Basemapを押してください。

 

地図に合わせてOSMデータを入れる

次に線路や道路、構造物などのOSMデータを入れます。

 

レイヤーを分けておく

ですが、OSMデータを入れると大量のオブジェクトが追加されます。

このオブジェクトを扱いやすくするため、ここでは

Lampなどの基本的なものをレイヤー1にして、

OSMデータをレイヤー2に入れるようにします。

 

Lampはすでにレイヤー1にあると思いますので、

数字の (3Dビュー上にカーソルを置いて)2キー(テンキーではありません) を押して、

レイヤー2を選択します。

この状態で追加されたオブジェクトは選択されているレイヤー2に追加されます。

ちなみにレイヤーは複数選択できます。複数選択している状態で追加されるオブジェクトは複数のレイヤーに含まれます。

 

なお、レイヤーでオブジェクトを分けない場合、Lampなどのオブジェクトを選択から省きたい、などといった場合に操作がめんどくさくなります。

 

GetOSMで地図に合わせてOSMデータを入れる

次に、GISメニューから GetOSM を押してください。

f:id:Densyakun:20200406142951p:plain

 

以下の画像のように Ways を選択します。

その下の building などは何も選択しないでください。

(複数選択ができます。選択してしまった場合は最初からやるか、 Ctrl+クリック で解除してください)

 

次に、 Separate objects にチェックを入れます。

これにチェックを入れることで一つ一つのデータが別々のオブジェクトになります。

 

OK を押してしばらくするとOSMデータがオブジェクトとして追加されます。

f:id:Densyakun:20200406143144p:plain

 

これでデータを入れることができました。

この状態で元に戻すと、Blender GISの仕様上、

データを入れる前ではなくさらにBasemapの移動も戻るので注意してください。

 

使いたい部分に絞り込む

入れたデータのうち、線路のみを使いたいので、不要な部分を消す作業をします。

 

今の状態ではすべてのオブジェクトが選択されているはずです。

なので、(3Dビュー上にカーソルを置いて)Aキーを押して選択を解除してください。

(この操作はオブジェクトが選択されていない状態では全てのオブジェクトが選択され、オブジェクトが選択されいる状態ではオブジェクトの選択が解除されます)

 

さらに手作業で線路に絞っていきます。

線路のオブジェクトを右クリックで選択して、

Ctrl+iで選択を反転して、Delキーで削除してください(確認が出るのでOKを押してください)

 

あるいはBキーで矩形選択を使う方法もあります。

この時、Blenderは範囲内に収まるオブジェクトを選択するのではなく、

範囲内に触れるオブジェクトが選択されるため、

不要なものを選択するのではなく、

必要なものを選択してから、選択を反転することで、

不要なものを選択すると良いです。

また、矩形選択は今選択されているものに追加して選択されますので、

範囲を分割して選択するほうが良いです。

 

Blender GISを使用すると、グリッドの間隔が広がり、

カメラが一定以上ズームできなくなることがあります。

これは、Nキーでメニューを開き、「表示」(または"Display")の、

グリッド」の中にある拡大縮小の値を1にすると直ります。

 

 

こんな感じになればOKです。

f:id:Densyakun:20200408101728p:plain

 

抜けている場所がある場合

範囲が広いと、画像のように抜けている場合があります。

f:id:Densyakun:20200408102331p:plain

 

Basemapで抜けている箇所にズーム(このとき、すべてのレイヤーを選択してください)し、

レイヤー3を選択して、Get OSMをします。

するとレイヤー3に抜けている箇所を含むデータが追加されます。

先ほど同様で、抜けている箇所のみに絞り込みます。

Mキーを押してから2キーを押して、レイヤー3にあるものをレイヤー2に移動します。

2キーを押してレイヤー2を表示して、抜けている箇所が直っていたら完成です。

 

線路のガイドを作成

ここで作るガイドは平面におけるガイドになります。

つまり勾配などのガイドにはなりません。

Get SRTMでスペースシャトル立体地形データを取得できるのですが、

これがだいぶ誤差があり当てにならないので、

勾配は後で、前面展望などを見ながら、合わせていくと良いと思います。

その場合は前面展望を早送りすることで勾配が分かりやすくなります。

 

線路を結合してまとめる

この状態ではオブジェクトが分かれており、編集するのに手間がかかってしまいます。

f:id:Densyakun:20200408104239p:plain

 

同じ線路(上り線や下り線など)のオブジェクトをすべて選択し、Ctrl+Jキーで結合します。

画像のように一つのオブジェクトになればOKです。

f:id:Densyakun:20200408104922p:plain

 

重複する頂点を削除

このデータは点が結合されていません。

オブジェクトを選択した状態でTabキーで編集モードに切り替え、

Aキーですべてを選択したあと、

左の「ツール」タブから削除の中にある「重複頂点を削除」をすると、

同じ場所にある複数の頂点を一つにできます。

Tabキーでオブジェクトモードに戻すと完了です。

 

不自然な箇所を修正

f:id:Densyakun:20200408105039p:plain

画像のように不自然な箇所がある場合があります。

編集モードで修正してください。

 

 

カーブに変換

オブジェクトモードでAlt+Cキーを押して、「メッシュ/テキストからカーブ」を選択して、メッシュからカーブに変換します。

f:id:Densyakun:20200408111130p:plain

 

円の作成(一回だけ)

ガイドとして表示するために、円のカーブを作成します。

左の作成タブからを選択します。

半径を0.5(m)にします。

 

この作業はストラクチャごとに一回だけ行います。

 

ベベルの設定

先程の線路のカーブのプロパティから、

先ほど作成したベベルをベベルオブジェクトに設定します。

f:id:Densyakun:20200408120213p:plain

 

ついでにマテリアルも設定します。

f:id:Densyakun:20200408120713p:plain

 

ホームのガイドを作成

f:id:Densyakun:20200408120914p:plain

 

画像のようなホームのオブジェクトがあります。

これも重複頂点の削除を行います。

 

そしたら、Fキーで面を作成します。

たまに面が反転しており、暗くなっていることがあります。

このような場合には、Ctrl+Fで面を反転を選択してください。

反転して明るくなればOKです。

 

また、こちらも線路と同様にマテリアルを適用します。

ただし、カーブにする必要はありません。

 

ホームのオブジェクトがない場合

ホームのオブジェクトがない場合があります。

この場合は、手作業で作成する必要があります。

 

Basemapのときにレイヤーを Satelite にすることで、

航空写真を表示できます。

航空写真に合わせてオブジェクトを手作業で作成します。

 

地下区間ではこの方法は使えません。

どうしても、基準が曖昧になってしまいます。

なので、終点までホームのオブジェクトがない、という場合を除いて、

例えば、A駅からB駅を作成しようする場合は、

B駅に完成したガイドのオブジェクトを設置するわけですが、

B駅のホームのオブジェクトがない場合は、

A駅からB駅を挟んだC駅の区間を作成することに変更します。

この時、C駅はホームのオブジェクトがある必要があります。

なので、A駅からホームのオブジェクトがあるC駅までの区間、ということになります。

ですが、距離が長くなってしまうといけないので、

それぞれの区間のズレを、経緯度などで位置を合わせるほうが良いです。

 

エクスポート用のピボットの設定とオフセット移動

次に、「ストラクチャを置く駅」の位置を決めます。

最終的に、駅にあるオブジェクト(無ければ作成してください)を原点するのですが、

その位置を決めます。

 

「ストラクチャを置く駅」のオブジェクトの原点が、

オブジェクトの内容とズレていると思います。

これを直す作業を行います。

 

「ストラクチャを置く駅」のオブジェクトを選択して、

編集モードですべてを選択している状態で、

Shift+Sでスナップ設定を開き、カーソル → 選択物を選択します。

次に、オブジェクトモードで選択物 → 3Dカーソルを選択します。

次に、編集モードで選択物 → 3Dカーソル(オフセット)を選択します。

これでオブジェクトの原点が内容に合わせることができました。

 

メルカトル図法の歪みを計算し記入しておく

この方法ではメルカトル図法の歪みが含まれており、

このままストラクチャとして入れてしまうと、

東京であれば1.2倍ほどの大きさになってしまいます。

なので、歪みを修正する必要があります。

地球は球体(正確には楕円体)なので、3DCGの空間に置き換えると、

どうしても歪みがありますが、

メルカトル図法における歪みをできる限り直します。

歪みについては詳しくはこちらの記事で解説しています。

densyakun.hateblo.jp

 

今回は、自作のページで歪みを自動的に計算します。

こちらのページを開いてください。

https://densyakun.github.io/MercatorScale/

メルカトル図法における歪みは 緯度 (latitude) に対して変化します。

 

f:id:Densyakun:20200408143622p:plain

Blenderの画面の左のGISタブから、GeosceneGeoを押して

左から、 経度 (longitude) 、 緯度 (Latitude) となっているので、

右の緯度の値をコピーします。

Blenderでは内部の値は細かいのですが、

小数点第二位までしか表示されませんので、

このまま設定してしまうと移動してしまいますので、

Escキャンセルしてください。

 

先程のページのlatに値を入れてEnterを押すと、

歪みの値が表示されます。

 

次に、1キーでレイヤー1にして、

Blender空のオブジェクトEmptyで構いません)を作り、

名前に先程計算した値を書いておきます。

(私の場合はlat: 35.54, scale: 1.225と書いておきます)

値は小数点第六位、そんなに気にしないのであれば小数点第三位までで大丈夫です)

 

後でこの値を使用して歪みを修正します。

 

ここで保存(ここから先は保存してはいけない)

ここで.blendファイルを保存します。

ここから先はエクスポート用の設定をするので、

ここから先は保存しないでください。

 

エクスポート用に編集

次に、オブジェクトを一つにします。

このとき、ストラクチャとして使用するためにメッシュにする必要があります。

 

2キーレイヤー2を表示して、

「ストラクチャを設置する駅」のオブジェクトを選択し、

次に2回Aキーを押してすべてのオブジェクトを選択します。

このとき、「ストラクチャを設置する駅」のオブジェクトがアクティブ(デフォルトのテーマでは、オレンジではなく黄色になっているオブジェクトです)になるようにしてください。

 

次に、Alt+Cを押して「カーブ/メタ/サーフェス/テキストからメッシュ」を選択します。

次に、Ctrl+Jオブジェクトを統合します。

すると、すべてのオブジェクトが統合され、

「ストラクチャを設置する駅」がオブジェクトの原点になっていると思います。

 

次に、オブジェクトの原点をワールドの原点に移動します。

Shift+Sカーソル → 原点を選択し、

次に、Shift+S選択物 → 3Dカーソルを選択します。

 

次に、メルカトル図法の歪みを修正します。

画像のようにピボットポイント3Dカーソルに設定します。

f:id:Densyakun:20200408150044p:plain

次に、オブジェクトを選択している状態で、

Sキーを押して、/キー(スラッシュ)を押して、

先程の歪みの値をペーストして、Enterを押します。

(値をペーストするとそのまま入力されますが、/を押すと値が逆数になります。先程の値は1より大きいですが、今回は小さくしたいので逆数の値を使います)

 

これで、エクスポートできる状態になりました。

 

.xファイルでエクスポート

Blenderでエクスポートできるようにするためには、

アドオンを有効にする必要があります。

上のメニューバーからファイル>ユーザー設定...を選択し、

アドオンタブを開いて、左上の検索に「x 」と入力します。(xのあとに半角のスペースを付けます)

Import-Export: Direct X Format」というアドオンにチェックを入れ、有効にします。

次に、下の「ユーザー設定の保存」を押します。

この作業は一回だけです。

 

次に、メニューバーからファイル>エクスポート>DirectX (.x)を選択します。

路線データのストラクチャフォルダを選択し、

お好みのファイル名を入力し、Export DirectXを押します。

これでエクスポートができました。

 

そしたら、Blenderを保存せずに閉じます。

 

次に、Blenderでエクスポートした.xファイルをBve5で使用するために、

以下の記事を参考に修正してください。

densyakun.hateblo.jp

 

ガイドに線形を合わせる

次に、Bve5で作成したストラクチャを読み込みます。

駅間の距離などを記入しておいてください。

私の場合はWikipediaなどを参考にしますが、

50mまではずれがあると思いますので、

線形を合わせたあとにガイドに合わせて駅の位置も合わせてください。

 

何回も言ってますが、A駅からB駅に向かう区間の場合、

B駅にストラクチャを設置します。

ストラクチャのY軸を回転して向きを調節してください。

すると、ガイドが表示された状態になります。

 

次にガイドに線形を合わせます。

この時、手前から線形を合わせると、ストラクチャが動いてしまいます。

なのでストラクチャを設置している駅から、

進行方向とは逆の方向に向かって線形を合わせていきます。

線形の合わせ方は、配線などを把握してから、

曲線を挿入したり、半径を調整するなどします。

 

最後に駅の位置を合わせて、完成です。

 

寸法通りに構造物も作りたい場合

ちょっと複雑ですが、

この方法で構造物(道路の幅や建物の寸法など、相対的な位置関係を必要とするもの)を寸法通りに作りたい場合は、

構造物を作った後に歪みを修正すると、逆に元々の寸法が歪んでしまいますので、

その点に注意する必要があります。

 

私であれば、

歪みを修正する前に構造物の基準となるデータ(点群など)を作り、

それを線形などのデータとは別に分け、歪みを修正して、

それから構造物を作成して、

線形などのデータ(歪みを修正する前)と、

構造物のデータ(歪みを修正したもの)の、

同じ経緯度にあるオブジェクトを作成してそれで位置を合わせるなど、

歪む前のデータと歪む後のデータを分けて作成して、

後で合わせる、という方法が良いかと思います。

 

おわりに

以上です。お疲れさまでした。

工夫することで資料のない未成線や、架空路線なども作りやすくなります。

手順が多いので大変ですが、じゃんじゃん路線を作成していきましょう!

ご覧いただきありがとうございました。

質問などあればご自由にコメントください。