立体地図を作る -補足1 パズルのピースとして形を整える-
都道府県ごとに立体地図をモデル化したのは各県をピースとしてジグソーパズルにするという目論見がありました。正確な行政区画のとおりに輪郭を作ってしまうと県境が細かく互いに入り組んでしまってピース同士をはめ合わせることが難しくなってしまいます。そこで、行政区画を参考にしながら、もっと単純化した図形でポリゴンを手作業で作成しこのポリゴンに従って標高メッシュを切り分けることにしました。
参考にするのは「その2 行政区画情報の準備」でQGISにとりこんだ国土地理院の行政区画情報です。フィールド計算機を使って新しいフィールド都道府県を追加してうえで参考にしやすいよう県別に地図を色分けしておきます。
(1)行政区画のレイヤを選択した状態でレイヤパネル左上の「レイヤスタイルドックを開く」アイコンをクリックしてレイヤスタイルドックを開く
(2)レイヤの種類で「分類された」を選択
(3)カラムをクリックして都道府県のフィールドを選択
(4)分類ボタンをクリック
以上の操作により都道府県ごとの色分けが行われます(下図参照)。
色分けされた行政区画を見ながら新たに自分で都道府県の輪郭を示すポリゴンを作成していきます。まず、ポリゴン作成用のレイヤを新規作成します。
(1)レイヤ->レイヤの作成->新規シェイプファイルレイヤをクリック
(2)ダイアログでタイプ:ポリゴンを選択、新規フィールドとしてテキスト型の「都道府県」というフィールドを追加
(3)OKをクリック、シェイプファイルの格納場所を聞かれるのでファイルパスを指定してOKをクリック
新しく作ったレイヤを選択した状態でポリゴンを作成するのですがその前にスナップの設定をしておきます。これを設定しておくと隣り合う県のポリゴンの境目部分をぴったり合わせることができます。設定->スナップオプションをクリックします。
表示されたダイアログ上で該当レイヤに対してスナップの許容範囲(0より大きい値)と交差の禁止を指定します。このとき他のレイヤに対して交差の禁止が指定されていないことを確認しておいてください。他のレイヤに対して交差禁止を指定しますとポリゴン作成時に「交差回避によりジオメトリが壊れているので地物を追加できません」というエラーが頻繁に発生してしまいます。
ポリゴンの作成にはQGISウィンドウの左上にアイコンがある3つの機能(青枠で囲った左から「編集モード切替」、「地物の追加」、「ノードツール」)を使用します。
(1)編集モード切替アイコンをクリックしてポリゴンの入力・編集を可能にする
(2)地物の追加アイコンをクリック後、都道府県のかたちに沿って点をクリックしてポリゴンを定義する
(3)右クリックで形の定義を終了させ、idと都道府県名を入力する。
実際には(2)の操作だけで所望のかたちに作るのは難しいので四角形など単純なポリゴンをいったん作ってから、ノードツールを使って複雑な形状に編集していきます。ノードツールのアイコンをクリックすると、ポリゴンに対して頂点の追加・削除や頂点の移動ができるようになるので、これらの操作を行って都道府県を示すポリゴンをレイヤに追加していきます。
各ポリゴンには属性として都道府県名が付加されているので「その3 標高メッシュの作成」に記載されているようにベクタ->データマネジメントツール->属性の結合によって行政区画のベクタレイヤの属性を標高メッシュのベクタレイアの属性に結合します。このときのダイアログで
ジオメトリの述語で「範囲内」のみを指定しておくと行政区画のポリゴンの線と交差・接触する境界上のマス目はは結果から除外されるので、都道府県をピースとしたときのはめ合わせに一定のクリアランスを確保しています。
この結果の属性テーブルの情報をExcel経由でOpenSCADにとりこみ(その4 3Dモデルの生成に記述したように)3Dモデルを作成することができます。
立体地図を作る -その4 3Dモデルの生成-
4.3Dモデル(STLファイル)の生成
前節(3.標高メッシュの作成)で得られた奈良県のメッシュのマスの数は58,000弱ありました。モデリングツールのユーザーインターフェースで1個ずつマス目ごとの高さを指定していくわけにはいかないのでデータから自動的にモデルを生成する仕掛けが必要です。今回はOpenSCADというプログラミングで3Dモデルを作成するツールを使いました。
OpenSCAD - The Programmers Solid 3D CAD Modeller
OpenSCADではテキストエディタで
translate([0.25,21.25,0]) cube([0.25,0.25,30.84]);
といった1行のコードを記述すると、このコードで指定された場所(0.25,21.25,0)で指定された大きさ(0.25,0.25,30.84)の直方体の3D情報を作成することができます(数字の単位はmm)。人がコード(条件分岐や繰返しなどの論理構造も記述可能)を書いていくのが通常のOpenSCADでのモデリングのやりかたなのですが、今回はExcelのマクロを使ってコード列を自動で発生させることにします。
まず、奈良県のメッシュの属性テーブルの全行のデータからxmin(各マス目の左下隅の経度)とymin(各マス目の左下隅の緯度)のそれぞれの最小値を求めてこれをOpenSCADで座標を指定する際の原点とします。原点座標を(135.5405,33.8596)としてある行(1個のマス目)の情報が以下であったとすると
xmin(マス目の左下隅の経度)=135.5430
ymin(マス目の左下隅の緯度)=34.0721
標高mean(マス目内の標高平均値)=1025.0
translate([(135.5430-135.5405)*100,(34.0721-33.8596)*100,0]) cube([0.0025*100,0.0025*100,1042/50+10]);
として青色部分を計算すれば底辺をこのマス目として標高平均に対応した高さを持つ直方体を生成するコードになります。上記の式で100は横方向の縮尺、50は縦方向の縮尺、10は地図の土台部分の高さを指定するパラメータになります。
標高メッシュの属性テーブルの値をExcelに取り込んでからマクロで上記のようなコマンド列を発生させOpenSCADのエディタにCopy&Pasteに貼り付けて実行すればSTL形式で出力可能な3Dデータが生成されます。
ただし、OpenSCADは一度にあまり大量のデータを処理できない(19,000行ぐらいを超えると異常終了してしまう)ので、前節で作成した奈良県のメッシュデータについては10,000行ずつに分けてSTLファイルを生成し後からそれらを結合しました。
コードを貼りつけたら画面上部のアイコンをプレビュー(1)、レンダリング(2)、STL出力(3)の順番でクリックして3Dデータを生成、格納します。プレビューはすぐに表示されるのですが、2番目のレンダリング処理には少し時間がかかります。私の環境((Intel i5-6500@3.2GHz, Memory 16GB))だと、10,000個のメッシュのレンダリングに20分ぐらいかかりました。
OpenSCADが出力するファイルの形式はSTLだけですが、このファイルを例えばMeshLabを使ってOBJ形式など別の形式に変換することができます。
MeshLabで取り込んだ奈良県の立体地図モデルは下の図のようになります。
この地図のメッシュは緯度・経度を0.0025度ずつのマス目で分割しており、それを1辺0.25mmの正方形としてモデル化しています。縮尺としては111万分の1くらいで奈良県を上から見たとき縦横の一番長い部分で縦9cm、横6cmぐらいになります。一方、垂直方向は5万分の1の縮尺で高さを計算しているので、標高の変化をかなり強調したモデルとなっています(ここで説明に用いたモデルの縮尺は「その1」で写真を載せたモデルとは異なっています)。
たいていの3DモデリングソフトはOBJ形式の3Dモデルを読み込むことができます。私の場合、OBJ形式になった3DモデルをZBrush(有料ですがプロも使っている高機能ソフトとしては安価なほうだと思います)で編集して、底面に都道府県名を彫り込んだり、細かい凹凸にスムージングをかけたりしています。今回のような作り方だと、山の峰の先端部分が厚みがなくなって3Dプリンタだと造形できない部分が発生したりするのですが、ZBrushのスムーズブラシで全体を軽く処理することで造形できるようになりました。
立体地図を作る -その3 標高メッシュの作成-
3.標高メッシュの作成
Jaxaのデータは30m×30m単位で標高が記録されていますが、そのままでは3Dプリントするのには細かすぎるのでもう少し大きめのメッシュを生成しその領域内の標高の平均値を割り当てます。ベクター>調査ツール->ベクタグリッドコマンドでメッシュを生成します。下記の例ではメッシュのサイズは緯度と経度それぞれで0.0025度ずつにしています。私の環境(Intel i5-6500@3.2GHz, Memory 16GB)ではあまり広い範囲に対して一度にメッシュを生成しようとすると(おそらくリソース不足で)ハングしてしまったので部分的に(奈良県を覆う程度の)範囲を指定してメッシュを作成しています。メッシュの情報も1つのレイヤとして生成されますのでこの時点で標高データを表すラスタレイヤと行政区画を表すベクタレイヤ、今作成したメッシュを表すベクタレイヤの3つのレイヤが存在することになります。
次にラスタ->地域統計->地域統計コマンドでメッシュごとの標高の情報(平均値や最大、最小、最頻値などを指定可能)を抽出しメッシュレイヤに属性として追加します。地域統計がメニューにでてこない場合はプラグイン->プラグインの管理とインストールの機能で活性化してください。
処理が終わるとメッシュのレイヤのマス1つ1つにラスタレイヤから抽出された標高の情報が属性として追加されます。下の属性一覧表で青色の枠部分はレイヤ生成時に付加されたメッシュの位置、大きさの情報、赤枠の部分は地域統計コマンドによってラスタレイヤから抽出された標高情報を示しています。属性の情報はCopy & PasteでExcelなど表計算ソフトに取り込むことができます。
続いて標高メッシュの属性に行政区画情報をマージします。ベクタ->データマネジメントツール->属性の結合によって2つのベクタレイヤの属性を結合します。この機能は2つのベクタレイヤに属する図形間の位置関係(「交差する」とか「重なりがある」)にもとづいて対応がとれた図形がもつ属性をもう一方にコピーします。
Runボタンをクリック後、結合後のレイヤの属性テーブルを表示すると各マスの位置情報と標高情報に加えて、行政区画の情報(下図の赤枠部分)が追加されていることがわかります。
立体地図を作る -その2 行政区画情報の準備-
2.行政区画情報の準備
行政区画の情報は国土地理院がWebで提供している基盤地図情報(基本項目)をダウンロードして用います。
対象となる地域を選んでダウンロードします。
ダウンロードしたファイルはGMLというXMLベースの形式で記述されておりこのままではQGISに読み込むことができません。国土地理院が提供している基盤地図情報ビューアというソフトで読み込んで QGISで利用可能なshape形式に変換します。基盤地図情報ビューアは国語地理院の以下のページからダウンロードすることができます。
ダウンロードしたファイルを解凍すると何種類かのXMLファイルが生成されますがそのなかの「FG-GML-??????-AdmArea-????????-????.xml」という名前のファイルだけを選んでビューアに取り込みshape形式のファイルとしてエクスポートします。これでQGISに読み込んで行政区画を表示することはできるようになるのですが、座標参照系がJAXAの標高データと異なるのでこのままでは両者の突合せを行うことはできません。QGISでいったん読み込んだレイヤを「名前をつけて保存する」で保存すると保存時の座標参照系(CRS)を指定できるのでWGS 84(EPSG:4326)を指定して保存し以後の作業ではこちらを使います。
QGISで業績区画のレイヤを選択、右クリックメニューの「属性テーブルを開く」で行政区画の線分を示すベクトルデータが行ごとに表示されます。このうち行政コードのフィールドが市区町村を表しており、上2桁が都道府県を表すコードになっています。属性テーブルの「フィールド計算機を開く」機能を使って新しいフィールド都道府県を作成しておきます(赤枠で囲った部分が追加されたフィールド)。
都道府県フィールド追加後のレイヤを右クリックしてメニューのフィルタ(クエリビルダ)を使って表示する地域を絞り込むことができます。
この例では都道府県のコードが29(奈良)である行政区画のみをフィルタすることで奈良県に該当する領域(下図の緑色の部分)のみを表示させています。
これで標高データのメッシュと行政区画を突き合わせる準備が整いました。
立体地図を作る -その1標高データの準備-
とあるきっかけでインターネット上のデータから日本や世界の立体地図(3Dモデル)を作れないか調べる機会がありました。なんとかものになりそうなものができたのでやりかたを記録しておきます。
といいつつ、実は(後でわかったのですが)日本の地図については国土地理院がダウンロードできるSTLデータや触地図作成用のツールを提供してくれていました。
私の場合、立体地図モデルに自分なりの味付けをしたいという思いがあり試行錯誤を続けたのですが、とりあえず日本の立体地図を3Dプリントしたいというかたは上記のサイトをチェックしてみてください。
私がモデルを作成した手順ですが
- 標高データの準備
- 行政区画情報の準備
- 標高メッシュの作成
- 3Dモデル(STLファイル)の生成
といった順序になります。
奈良県を中心に兵庫を除く近畿地方の府県の立体地図をモデル化してDMM.makeに依頼して出力してもらった結果です。水平方向222万分の1、垂直方向が20万分の1ぐらいの縮尺になっています。
1.標高データの準備
地図を縦横の細かいメッシュに区切ってメッシュごとにその領域の標高の平均値を求めたり、行政区画とのすり合わせを行うにはフリーのGIS(地理情報システム)であるQGIS(Ver.2.18)を使います。
立体地図の基本のデータである標高データを取得しQGISに取り込みます。
元ネタである世界各地の標高データはJAXAのWebサイトから入手できます。ユーザー登録が必要ですが名前とメールアドレスぐらいをフォームに記入してサブミットすればすぐに登録してもらえます。
ALOS全球数値地表モデル(DSM) "ALOS World 3D - 30m (AW3D30)"
注意:私の環境ではブラウザにMicrosoft Edgeを使うと認証エラーがでてダウンロードができませんでした。Internet Explorerでは問題なくダウンロードできています。
正常にログインできると世界地図のクリッカブルマップが表示されるので所望の地域をクリックしていってダウンロードボタンを押下します。日本も複数の領域に分かれているので必要な領域をカバーできる分だけ何個かのファイルをダウンロードします。解凍して????????_AVE_DSM.tifという名前のファイルをとりだして1つのフォルダにまとめておきます。DSM(Digital Surface Model)というのは植生や建物を含んだ高さのデータですが本Blogの記述ではDSMのデータに対して標高という言葉を使っています。
QGISを起動して新規プロジェクトを作成、ラスタ(R)->その他->結合..コマンドで各ファイルを1つ(下記の例ではjapan.tif)にまとめます。日本の本土全体をまとめた場合、私の環境だと数分かかります。統合されたデータは1つのレイヤとしてロードされ、レイヤパネルに表示されます。読み込んだデータの座標参照系はWGS84 (EPGS:4326)です。レイヤ間でデータ処理を行う場合のためにこれをプロジェクトのデフォルトの座標参照系として設定しておきます。下の例では表示を見やすくするため、レイヤのプロパティを変更して標高を擬似カラーで表現しています。
ここで作ったラスタデータのファイルを後の処理で使うのですが、よほど大きくて高精細の地図を作成するのでなければ、この時点で縮小したデータを作っておいて以後縮小したデータを使ったほうが計算機資源の節約になります。元データのレイヤを選択しておいて右クリックメニューから「名前をつけて保存する…」を選択します。上記のようなダイアログが表示されるので解像度(青線の部分)の数字を変更して保存すれば縮小したデータが格納されます。
また、3Dモデルで山の峰の先端がとがってギザギザになるのを防ぐためこの段階でラスターデータの標高値を平滑化しておくこともできます。標準でインストールされているプラグインの中にガウスフィルタがあるのでこれを利用します。プロセッシング->ツールボックスでプロセッシングツールボックスのパネルを開き、"Gaussian"を検索すればプログラムが見つかりますのでダブルクリックで起動します。ただし、メモリの制約があるらしく、私の環境では画像の縮小や切取りを行った後でないと動作しませんでした。
メニューバーにプロセッシングが見つからない場合はプラグイン->プラグインの管理とインストールをクリックしてProcessingを検索、活性化してください。
Fusion 360でクインジェットのモデリング:可動部分のモデリング
以前にZBrushでクインジェットのモデリングを行ったときは形をなぞるので精いっぱいでしたが、試作2号機では多少のギミック(仕掛け)を導入するつもりです。子供のころ飛行機のプラモデルを選ぶ基準は、着陸脚が引っ込むとか、コックピットの風防がスライドするとか、爆弾の投下口が開く、などなど動く部分が何か所あるかでした。ところが当時はちゃんと作ることができなくて(今でもぶきっちょで細かい手作業は苦手です)、セメダイン(なつかしい)のつけすぎで着陸脚は引っ込んだまま、風防は閉じたまま、爆弾は投下できず、という残念な結果になることが多かったのです。
50年ぶりのリベンジを狙って今回モデリングしたのは
- 主翼先端部分の折れ曲がり
- 後部ハッチの開閉
の2点です。
主翼については本体と先端部の2つのBodyに分けて作成し先端部には直径1.8mmの軸を、本体側には軸受けの台をつけて直径2mmの穴を作成しました。Fusion 360ではこうやって作ったモデルが実際にうまく動くか、部品同士が干渉していないかをシミュレーションで確認することができます。
2つのBodyを(独立した座標系を持つ)コンポーネントに変換して、ジョイント機能で軸回りの円と軸受けの穴の円とを対応づけます。あとはジョイント駆動の機能で先端部を何度回転させるか角度を指定します。部品同士の干渉がなければ、指定された角度まで先端部が回転します。最初のデザインでは45度まで回転させたところで部品同士が干渉してしまいました(下図、赤丸の部分)。これ以上大きな角度の数字を入力しても先端部は回転しません。
モデルを見直して軸の形状を変え、主翼本体側にも彫り込みをいれた結果、下記のように直角に折り曲げることができるようになりました。