はじめに
パノラマ画像とは、見晴らしの良い展望台などで晴れた日に見える風景をパネル展示してるあれです。スマホでもアプリの力で簡単に作れたりします。これと同じような画像を ArcGIS Pro で作ろうというものです。現地に行かなくてもその場所を見渡した際の想像図をシミュレーションすることができます。
ダウンロード
バージョン 2.0 以降、1.2 以降に対応していますが、2.1 でのみ動作確認しております。
使用方法
- ZIPファイルをダウンロードして解凍し、プロジェクト パッケージ (*.ppkx) を ArcGIS Pro 2.x で開きます。プロジェクト パッケージは「ドキュメント\ArcGIS\Packages\」以下に展開されます。
- [カタログ] ウィンドウ → [プロジェクト] タブ → [レイアウト] →「レイアウト」をダブルクリックして表示します。
- [レイアウト] タブ → [アクティブ化] をクリックしてレイアウト内のマップ フレーム エレメントをアクティブにします。
- 必要に応じてデータをシーンに追加します。
- カメラの表示場所(XY座標、高さ)を設定します。方角の初期値はツールで指定するため適当で構いません。
- [アクティブ化されたマップ フレーム レイアウト] タブ → [閉じる] をクリックします。
- [カタログ] ウィンドウ → [プロジェクト] タブ → [ツールボックス] → [CreatePanoramaView.tbx] → [パノラマ画像の作成] をダブルクリックします。
- ツールが起動するのでそれぞれパラメーターを設定し、[実行 ] ボタンをクリックします。
パラメーターの解説
パラメーター | 説明 | 初期値 |
プロジェクト パス | レイアウトを含む ArcGIS Pro プロジェクト ファイルを選択します。 | CURRENT(現在のプロジェクト) |
レイアウト名 | 読み込んだプロジェクトに含まれるレイアウトが一覧で表示されます。シーンのマップ フレーム エレメントを含むレイアウトを選択してください。 | レイアウト |
出力ファイル パス | パノラマ画像の出力フルパス。 | なし |
出力解像度 | レイアウトのエクスポートを行う際の出力解像度。 | 96 |
開始角度 | パノラマ画像の最初に出力される左端画像の中心となる方位角。 | 0 |
回転角度 | 2枚目以降の画像を出力するための回転角。 | 45 |
端の重複 | 最後の画像に重複を行うかどうか。 | 重複あり |
結合前画像の配置フォルダー | 個々に出力するテンポラリの画像ファイルを出力するフォルダー。 | プロジェクトの場所 |
結合前画像ファイル接頭辞 | 結合前の画像ファイル名(拡張子は出力ファイル パスに依存)。 | TempImage |
結合前画像の削除 | 結合前画像ファイルを残すかどうか。 | 消す |
注意点
開発環境ではマップ フレームのエレメント サイズを 280mm x 220mm に設定することで視野角がほぼ 45°に設定でき、継ぎ目の少ない画像が生成できました。ツールを一度実行し、継ぎ目の差が大きい場合は用紙サイズとマップ フレーム エレメントのサイズを調整してください。
必要に応じてツールを他のプロジェクトにコピーして使用してください。
実行結果
ツールを実行した結果のサンプル画像です。矢野の人にはイメージ通りなことが分かるでしょう。
ツールの作成方法に関する解説
残念ながら ArcGIS Pro の標準機能に該当のツールはありませんが、3D 表示は表示できるので、画像を少しずつ回転させながら自動でつなぎ合わせて行けばやりたいことが実現できるのではないかと考えました。今回の処理はモデルだけでは無理でしたので ArcPy を使用したスクリプト ツールにしました。
3D 表示
ArcGIS Pro はシーンで 3D 表示を行いますが、3D でどの場所からどの方向を見ているかという表示設定は Camera クラスで管理します。しかし ArcPy ではシーンを示す Map クラスから現在の 3D 表示設定を示す Camera オブジェクトは取得できません(defaultCamera プロパティはレイアウトにシーンを追加した際のデフォルト表示を決定するものです)。画面上に表示されている状態を自由に制御できるのはレイアウトに貼り付けられたシーンのマップ フレーム エレメントに限定され、MapFrame.Camera プロパティから取得します。
ArcGIS Pro の Camera クラスは以下のプロパティで画面表示を制御しています。
情報 | Camera クラスのプロパティ |
中心X | X |
中心Y | Y |
高さ | Z |
回転 | heading |
ピッチ | pitch |
ロール角 | roll |
回転(heading)を変更しながらスナップショットを取得し、最後に結合してパノラマ画像を作成します。ここで、回転させる角度の計算に苦労しました。ArcGIS Pro では画角というプロパティはないため、レイアウトのサイズによって画角が異なります。今回は経験的に45°の画角を求めるには W:280mm x H:220mm のマップ フレーム エレメントを設定すればよいことが分かりました。ただし、ディスプレイなどの環境によってこの値は異なるかもしれません。
パラメーター チェック
スクリプト ツールのパラメーター チェック用にいくつかコードを記述しました。パラメーター チェックは .tbx ファイルのプロパティを開き、[確認] ペインにある ToolValidator クラスを定義することで実現できます。ArcGIS Pro のスクリプト ツールでは、バージョン 2.1時点で ArcGIS Pro プロジェクト (.aprx) を指定するためのデータ エレメントがありません。そのため、「プロジェクト パス」のパラメーターは「データ エレメント」型を使用し、拡張子が *.aprx でない場合にエラーを表示しています。また、現在のプロジェクトを意味する "CURRENT" も指定できるようにするため、「文字列 (string)」型も指定できるようにし、文字列が "CURRENT" と一致した場合も有効としています。
また、プロジェクトを読み込んだら [レイアウト名] に自動で一覧がリスト化され、[結合前画像の配置フォルダー] は初期値としてプロジェクト フォルダーが指定されるようにしています。
現状では条件設定が甘いため、想定外のパラメーターを指定するとチェック自体でエラーが発生します。
画像の結合
今回は ArcGIS Pro の標準構成だけで利用できる方法を前提としたため、個々に生成した画像を結合するため、ローカル座標を設定したワールドファイルを作成し、モザイク ツールで結合しました。そのため、最終的に生成されたパノラマ画像のファイルに xml, ovr, pgw と余計なファイルもついてきます。これは個別に削除してください。PIL (Python Image Library) が使用できれば画像結合がもう少し簡単に記述できます。
方位角の表示
1枚のパノラマ画像として生成してもどの部分がどの方位なのか分からないので、ティック マークを表示するようにしました。あらかじめレイアウトにライン エレメントとテキスト エレメントを追加しておき、ライン エレメントはマップ フレーム エレメントの中央となるように表示します。これが Camera.heading プロパティの示す方向です。テキスト エレメントには heading プロパティの数値を整数化して表示しましたが、180 °を超えるとマイナス値がでる場合もあったため、以下の式で 0° <= x < 360° となるようにしました(参考)。
制限
このツールは画像を複数枚接合しているだけなので完全にシームレスなパノラマ画像の生成はできません。接合部が角ついてしまいます。グローバル シーンで地平線や水平線が湾曲して見えるほど高度をあげると連山のような接合になってしまいます。
また、処理が完了するとシーンに該当ファイルがレイヤーとして追加されてしまいます。個別に削除してください。arcpy.env.addOutputsToMap = False と記述しているのですが別の記述が必要なのか未解決です。