YouTube | Facebook | X(Twitter) | RSS

アクティブなマップの範囲を任意の縮尺で GeoTIFF に出力するツール

2018/10/2 (火)

はじめに

ArcMap や ArcGIS Pro には [マップのエクスポート] という今画面に見えている地図を画像ファイルとして保存する機能があります。ただ、標準機能では出力ピクセル サイズを大きくしても地図の縮尺を変更することはできません。ArcMap ではピクセル サイズと解像度の指定が連動していますし、ArcGIS Pro は解像度しか指定することができません。GUI 操作のみで大縮尺で広範囲の地図画像を出力したい場合はウィンドウ サイズを大きくするしかないのです。

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 に追加してください。スクリプト ツールの作成方法はこちらをご参照ください。

使用方法

ArcGIS Pro プロジェクトにツールボックス ファイル (*.tbx) を読み込み、[アクティブなマップを GeoTIFF にエクスポート] ツールを起動し、以下のパラメーターを指定して実行します。


[アクティブなマップを GeoTIFF にエクスポート] ツール

  • 出力ファイル パス:TIFF ファイルのファイル パス
  • ピクセル幅:出力画像ファイルの横サイズ
  • ピクセル高さ:出力画像ファイルの縦サイズ
  • 解像度:画像ファイルの鮮明度
  • ワールド ファイルの出力:ワールド ファイル (*.tfw) を出力するかどうか

※注意:地図の表示範囲を変更したら、ツールを実行する前に必ずプロジェクトを上書き保存してください。

制限

arcpy は ArcObjects ほどきめ細かい操作ができないので、地図の縮尺を基準として画像を出力することはできません。arcpy では現在のアクティブなマップのウィンドウ サイズを取得することができないため、縮尺が計算できないのです。そのため、例えば以下のようなガイド用画像ファイルでアクティブなマップのサイズを把握し、ピクセル サイズと解像度を指定してください。

ArcGIS Pro のアクティブなマップ サイズを XGA (1024 x 768) にあわせる

上記のようにアクティブ マップのサイズでツールのピクセル サイズを 1024 x 768 ピクセル、96dpi とすれば出力ファイルの縮尺を現在のマップと同じにできます。下図のようにピクセル サイズを倍の 2048 x 1536 とすれば縮尺も 2倍になっていることが確認できます(ここでは Web で表示するために TIFF から PNG に変換しました)。

縮尺 1:1,155,581 (2048 x 1536)

縮尺 1:1,155,581 (1024 x 768 にトリミング)

縮尺 1:2,311,162 (1024 x 768)

サンプルはピクセル サイズだけ変更して解像度は 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("エクスポートが完了しました。")
  • この記事を書いた人

羽田 康祐

伊達と酔狂のGISエンジニア。GIS上級技術者、Esri認定インストラクター、CompTIA CTT+ Classroom Trainer、潜水士、PADIダイブマスター、四アマ。WordPress は 2.1 からのユーザーで歴だけは長い。 代表著書『"地図リテラシー入門―地図の正しい読み方・描き方がわかる』 GIS を使った自己紹介はこちら。ESRIジャパン(株)所属、元青山学院大学非常勤講師を兼務。日本地図学会第31期常任委員。発言は個人の見解です。

-プログラミング, ArcGIS
-, ,