はじめに
ArcMap や ArcGIS Pro には [マップのエクスポート] という今画面に見えている地図を画像ファイルとして保存する機能があります。ただ、標準機能では出力ピクセル サイズを大きくしても地図の縮尺を変更することはできません。ArcMap ではピクセル サイズと解像度の指定が連動していますし、ArcGIS Pro は解像度しか指定することができません。GUI 操作のみで大縮尺で広範囲の地図画像を出力したい場合はウィンドウ サイズを大きくするしかないのです。
はるか昔、まだ ArcGIS Pro が世の中に存在しない時代、これを ArcMap でなんとかしたいと思って ArcObjects でコードを書いたことがあります(こちら)。しかし、最近 GIS 始めた方から見ると ArcMap で VBA を使う人なんて私が ARC/INFO(ArcInfo ではない) で AML が書ける人に出会うくらいのレガシーを感じます(伝わらないかな)。現在、ArcGIS Desktop を新規購入しても VBA は使用できません。保守継続で以前からの VBA コードを資産継承している人にしかライセンスは発行されないようになっています。ArcObjects は .NET のアドインとしてのみ作成できるのですが、.NET は少々気が重いし、Esri も VBA からの以降に Python を推奨しています。ということで、arcpy のスクリプト ツールとして作り直しました。
ダウンロード
ArcGIS Pro(バージョン 2.2 で作成)用スクリプト ツールを作成しました。ファイルをダウンロードして ArcGIS Pro に追加してください。スクリプト ツールの作成方法はこちらをご参照ください。
- ツールボックス ファイル:ExportActiveMapToGeoTIFF.zip
- ガイド用画像ファイル:size_1024x768.png
使用方法
ArcGIS Pro プロジェクトにツールボックス ファイル (*.tbx) を読み込み、[アクティブなマップを GeoTIFF にエクスポート] ツールを起動し、以下のパラメーターを指定して実行します。
- 出力ファイル パス:TIFF ファイルのファイル パス
- ピクセル幅:出力画像ファイルの横サイズ
- ピクセル高さ:出力画像ファイルの縦サイズ
- 解像度:画像ファイルの鮮明度
- ワールド ファイルの出力:ワールド ファイル (*.tfw) を出力するかどうか
※注意:地図の表示範囲を変更したら、ツールを実行する前に必ずプロジェクトを上書き保存してください。
制限
arcpy は ArcObjects ほどきめ細かい操作ができないので、地図の縮尺を基準として画像を出力することはできません。arcpy では現在のアクティブなマップのウィンドウ サイズを取得することができないため、縮尺が計算できないのです。そのため、例えば以下のようなガイド用画像ファイルでアクティブなマップのサイズを把握し、ピクセル サイズと解像度を指定してください。
上記のようにアクティブ マップのサイズでツールのピクセル サイズを 1024 x 768 ピクセル、96dpi とすれば出力ファイルの縮尺を現在のマップと同じにできます。下図のようにピクセル サイズを倍の 2048 x 1536 とすれば縮尺も 2倍になっていることが確認できます(ここでは Web で表示するために TIFF から PNG に変換しました)。
サンプルはピクセル サイズだけ変更して解像度は 96dpi のままとしました。ピクセル サイズを 2倍にして解像度も 2倍とすると縮尺は同じですが鮮明度が変わってきます。ベースマップはディスプレイに表示するためだけのタイル画像なので解像度を変更しても見た目は変わりませんが、より解像度の高いラスター レイヤーやベクター レイヤーを使用していると、解像度を高くするとより鮮明な画像になることが確認できます。
ディスプレイの拡大率を 100% にしている場合は 96dpi が pixel by pixcel となります。印刷する場合は 300dpi 以上となるようピクセル サイズを設定するのが望ましいです。
この考え方で各出力ピクセル サイズと解像度を計算して指定してください。
コード(ArcGIS Pro 用)
# coding:utf-8 # 現在の ArcGIS Project でアクティブなマップを指定したピクセル数と解像度でエクスポート import arcpy arcpy.env.addOutputsToMap = False # パラメーター out_path = arcpy.GetParameterAsText(0) # 出力ファイル パス (TIFF) width = arcpy.GetParameterAsText(1) # ピクセル幅 height = arcpy.GetParameterAsText(2) # ピクセル高さ dpi = arcpy.GetParameterAsText(3) # 解像度 is_world_file = arcpy.GetParameterAsText(4) # ワールド ファイルの出力(Bool値) # デバッグ用 # デバッグ時は GetParameerAsText() をコメントアウト # out_path = r"D:\Temp\image01.tif" # width = 2000 # height = 2000 # dpi = 96 # is_world_file = "false" arcpy.AddMessage(is_world_file) if is_world_file == "true": is_world_file = True else: is_world_file = False arcpy.AddMessage("アクティブなマップを GeoTIFF でエクスポートします。") prj = arcpy.mp.ArcGISProject("CURRENT") map = prj.activeMap mv = map.defaultView width = int(width) height = int(height) dpi = int(dpi) mv.exportToTIFF (out_tif = out_path, width = width, height = height, resolution = dpi, world_file = is_world_file, color_mode = "24-BIT_TRUE_COLOR", tiff_compression = "LZW", geoTIFF_tags = True) del mv,map,prj arcpy.AddMessage("エクスポートが完了しました。")
コード(ArcMap 用)
ArcMap で使用する場合は以下のコードでスクリプト ツールを作成してください。
# coding:utf-8 # 現在の ArcMap でアクティブなデータ フレームをピクセル数と解像度で指定してエクスポート import arcpy arcpy.env.addOutputsToMap = False # パラメーター out_path = arcpy.GetParameterAsText(0) # 出力ファイル パス (TIFF) width = arcpy.GetParameterAsText(1) # ピクセル幅 height = arcpy.GetParameterAsText(2) # ピクセル高さ dpi = arcpy.GetParameterAsText(3) # 解像度 is_world_file = arcpy.GetParameterAsText(4) # ワールド ファイルの出力(Bool値) # デバッグ用 # デバッグ時は GetParameerAsText() をコメントアウト # out_path = r"D:\Temp\image01.tif" # width = 2000 # height = 2000 # dpi = 96 # is_world_file = "false" arcpy.AddMessage(is_world_file) if is_world_file == "true": is_world_file = True else: is_world_file = False arcpy.AddMessage("アクティブなマップを GeoTIFF でエクスポートします。") mxd = arcpy.mapping.Mapdocument("CURRENT") df = mxd.activeDataFrame width = int(width) height = int(height) dpi = int(dpi) mv.exportToTIFF (map_document = mxd out_tiff = out_path, data_frame = df, df_export_widht = width, df_export_height = height, resolution = dpi, world_file = is_world_file, color_mode = "24-BIT_TRUE_COLOR", tiff_compression = "LZW", geoTIFF_tags = True) del mv,map,prj arcpy.AddMessage("エクスポートが完了しました。")