ArcPy を使って、ArcGIS Pro の作業を自動化! ~主題図を作成して PDF 化~

【Esri Community Blog】

はじめに

本記事は第 20 回 GIS コミュニティフォーラムのプレフォーラム・セミナーで発表した「ArcPy 入門 ~ArcGIS Pro の作業を自動化する Python 入門~」の内容をもとに作成したものになります。ArcGIS Pro で ArcPy を使った処理の基本を紹介し、主題図の作成における一連の流れについてご紹介します。

ArcPy とは?

ArcPy は Esri が提供する Python のサイト パッケージです。Python を使用して地理的データの解析、変換、管理などを実行するために提供されています。ArcPy を使うとプロパティの設定やジオプロセシング ツールの実行、マップの操作などの ArcGIS 上での一連の処理をスクリプト化し、自動化することができます。また、一連の処理が記述されたスクリプトをツールに登録することでジオプロセシング ツールとして汎用的に使用することも可能です。Python や ArcPy を使うことで繰り返し作業を自動化させ、作業効率が向上します。

arcpy1.png

ArcPy サイトパッケージの内容

ArcPy サイトパッケージには関数クラス、モジュールが含まれています。ArcPy を使用すると ArcGIS Pro (エクステンションを含む) のすべてのジオプロセシング ツールに Python からアクセスすることができるようになります。GIS データの操作や参照に役立つ様々な関数やクラスが含まれています。関数やクラス、モジュールは import arcpy と記述することで、Python は ArcPy を読み込み、関数等を Python から呼び出して実行します。ArcGIS Pro の Python ウィンドウを利用する場合は、インポートは不要です。詳細は「【ArcGIS Pro 版】Python を使って作業の効率化を図ろう!① : ArcPy の基礎」をご覧ください。

arcpy2.png

主題図を作成し、PDF 化するまでの流れ ※1

本記事では業務の想定として、統計データ等の CSV ファイルを GIS で加工し、主題図を作成します。作成した主題図を PDF ファイルに出力して、お客様に提示する流れを毎月同じ作業で実施すると仮定します。今回使用する CSV ファイルは、東京都における鉄道各駅のデータです。※2 駅の緯度経度から、駅ポイントを作成して、駅近辺の自転車、原付、自動二輪の各種放置車両台数の合計を出していきます。

※1: 本記事では ArcGIS Pro 3.1.2 を使用

※2: CSV ファイルは「都内における駅前放置自転車の現況(東京都生活文化スポーツ局)」で公開されているデータをもとに加工(数値は架空)

arcpy3.png

①CSV ファイルの読み込みとポイント フィーチャクラスの作成(ジオプロセシング ツール)

はじめに、CSV ファイルの読み込みとポイント フィーチャクラスの作成をジオプロセシング ツールを用いて行います。ジオプロセシングツールは ArcPy より簡単に実行することができます。使い方は、「arcpy.ツールボックスのエイリアス名(ツールに必要なパラメータ).ツール名」で実行します。ツール名やエイリアスを確認する際には、ツールボックスを右クリックしてプロパティを参照します。ここで使用しているのは、XYイベントレイヤーというツールです。必要なパラメータは CSV ファイル、xy 座標のフィールド、出力するレイヤーの名前(今回は csv001)になります。これは、画面からツールを起動したときのパラメータの順番が同じになりますが、オプションパラメータは ArcPy での呼び出し時は省略することも可能です。

# ArcPy サイト パッケージをインポートします。
import arcpy

# ジオプロセシング ツールで利用する変数を定義
csv = r"C:\data\HandsOn.csv"
x = "X"
y = "Y"
layer = "PointLayer"
outpath = r"C:\data\ArcGISPro\arcpy.gdb"

# CSV ファイルから XY イベント レイヤー ( テンポラリ のオブジェクト ) を作成します。
arcpy.management.MakeXYEventLayer(csv, x, y, layer)

# XY イベント レイヤーをフィーチャ クラスとして保存します。
arcpy.conversion.FeatureClassToFeatureClass(layer, outpath, "csv001")

# XY イベント レイヤーを削除します。
arcpy.management.Delete(layer)

 

arcpy1.mp4

(view in My Videos)

②テーブルの操作(カーソル)

続いてテーブルの操作について、カーソルを用いて行います。カーソルとはテーブルの操作を行う機能であり、テーブルに含まれるレコードの位置を示します。カーソルには SearchCursor や、InsertCursor のほか UpdateCursor があり、それぞれレコードの検索(Search)、挿入(Insert)、更新(Update)を行うことが可能です。下の表では合計の列が空白になっており、ここには自転車と原付および自動二輪の合計台数を入れることします。例えば、永田町駅の場合は自転車 10 台、原付 2 台、自動二輪 6 台となっており、合計は 18 が入ります。また Python の for 文と組み合わせることで、フィーチャクラスの各行(1 つ1 つのフィーチャ)に対して繰り返し処理を行うことができます。本記事では先程追加した csv001 の属性テーブルに「total」という名前で列を作ります。「total」には「bicycle」、「scooters」、「motorcycle」の各種放置車両台数を足した合計値が入ります。またこちらの処理を繰り返し行っていきます。

arcpy5.png

# ArcPy サイト パッケージをインポートします。
import arcpy

# csv001 フィーチャ クラス(既に作成)に LONG 型の total フィールドを追加します。
arcpy.management.AddField("csv001","total","LONG")

# csv001 フィーチャ クラスから取得するフィールド名のリストを作成
fields = [‘total’, ‘bicycle‘,  'scooters’, ’motorcycle']

# フィーチャ クラス (csv001) に対してカーソルを取得
cursor = arcpy.da.UpdateCursor("csv001", fields)

# for xx in :で、カーソルを移動しながら値を更新
for row in cursor:

row[0] = row[1] + row[2] + row[3] # bicycle  ( インデックス番号:1 )~ motorcycle ( インデックス番号:3 )の合計値

cursor.updateRow(row) # 合計値の値を適用

# オブジェクトを削除して参照を解放します。
del cursor, row

arcpy2.mp4

(view in My Videos)

③シンボルの更新(マッピング モジュール)

続いてシンボルの更新を、マッピング モジュールを用いて行います。①で CSV ファイルを読み込んで、ポイント フィーチャクラスを作成しました。しかし、このポイントのシンボルが単色のため、駅における放置車両台数が多いか少ないかが分かりにくいかと思います。そこで updateRenderer 関数を使用します。updateRenderer 関数では、シンボルを単一シンボルや等級シンボル等に設定し、お好きな色に変更することができます。また等級シンボルでは等比間隔や標準偏差など、値の分類方法を変更することも可能です。本記事では、単色のポイントレイヤーを等級色で 5 段階で色分けするために、updateRenderer 関数を GraduatedColorsRenderer(グラデーションカラーレンダラー)に指定します。分類フィールドは csv001 の total で、等比間隔で分けていきます。

arcpy7.png

# ArcPyをインポート
import arcpy

# プロジェクト ファイルのオブジェクト取得
aprx = arcpy.mp.ArcGISProject("CURRENT")

# マップのオブジェクト取得
maps = aprx.listMaps()[0]

# レイヤーのオブジェクト取得
lyrs =maps.listLayers()

# csv001 レイヤーのシンボル更新
for lyr in lyrs:
    if lyr.name == “csv001”:
        sym = lyr.symbology
        sym.updateRenderer(“GraduatedColorsRenderer”) # 等級色
        sym.renderer.classificationField = “total”  #分類するフィールド名
        sym.renderer.classificationMethod = “Quantile” # 等比間隔
        sym.renderer.breakCount = 5 # クラス
        lyr.symbology = sym

arcpy3.mp4

(view in My Videos)

④マップの出力(マッピング モジュール)

最後に作成したマップを PDF ファイルに出力します。あらかじめ、[挿入]タブの[プロジェクト]グループで[新しいレイアウト]をクリックして、レイアウトを作成します。

arcpy9.png

マッピング モジュールは他にも ArcGIS Pro で作成したレイアウトを出力することも可能です。マップと同様に ArcGISProject クラスにレイアウトを取得するための listLayout 関数が提供されています。取得したレイアウトは MapView クラスの exportToPDF などの関数を使用してさまざまな形式に出力することができます。今回は、exportToPDF メソッドを使用して、取得したレイアウトから PDF へエクスポートします。パラメータには出力先となるパスやファイル名を指定します。レイアウトには現在表示されている画面を出力することや、あらかじめ作成したフォーマットの仕様、マップシリーズで指定区画ごとに出力することも可能です。

また PDF 形式で出力する関数を使用しましたが、JPEG 形式で出力できる exportToJPEG 関数など、さまざまな形式で出力することができる関数が提供されています。さらに Python の繰り返し処理を使用することで、ArcGIS Pro のマップ シリーズで設定した図郭ごとに出力するといった使い方も可能です。

# ArcPy サイト パッケージをインポートします。
import arcpy

# プロジェクト ファイルのオブジェクト取得
aprx = arcpy.mp.ArcGISProject("CURRENT")

# レイアウトを取得
layout = aprx.listLayouts()[0]

# ページ レイアウト設定内容を PDF へ出力
layout.exportToPDF(r"C:\data\output\Sample.pdf")

arcpy19.png

まとめ

本記事では ArcPy を用いてマップの作成から主題図の PDF 化における一連の流れをご紹介しました。ArcPy では ArcGIS Pro 上での作業を自動化させ、効率化できることをお分かりいただけたでしょうか。ArcGIS Pro の操作を自動化し、業務を効率化する際に少しでも役立てていただければ幸いです。ArcPy はここで紹介したもの以外にもたくさんの機能がございますので、是非ご活用ください。

関連リンク

ESRIジャパン Web サイト

ArcGIS Pro

ArcPy

Esri 社 (米国) Web サイト

ArcPy ヘルプページ

ArcPy 関数一覧

ArcPy クラス一覧

ArcGIS 開発者コミュニティ

Python を使って作業の効率化を図ろう!(ArcGIS Pro 版)