はじめに
以前、GeoNetブログでは、ArcGIS API for Python のガイド、サンプル、API リファレンスなどのリソースを最大限ご活用いただく第一歩として、ガイドの中で紹介されている主要なモジュールを中心にご紹介する「さわって覚える ArcGIS API for Python」シリーズを公開しました。
さわって覚える ArcGIS API for Python シリーズ
- 基本編 (GIS モジュール編)
- フィーチャ データ編
- 場所検索、ジオコーディング編
- ネットワーク解析編 (前編) / ネットワーク解析編 (後編)
- マッピング、可視化編
- ラスター編
本記事では、Spatially Enabled DataFrame 編としてガイドページ「Introduction to the Spatially Enabled DataFrame」の翻訳をもとにご紹介します。紹介したノートブックは GitHub にも公開しますので、ご参照ください。
ArcGIS API for Python の環境構築がお済みでない方は、開発リソース集のインストールガイドに掲載しておりますので、ご参照ください。
本記事では以下の内容でご紹介します。
Spatially Enabled DataFrame の概要
GISデータへのアクセス
・フィーチャ レイヤーの読み取り
ローカルの GIS データへのアクセス
Spatially Enabled DataFrame のエクスポート
・シェープ ファイルやフィーチャ クラスへエクスポート
・フィーチャ レイヤーとして公開
Spatially Enabled DataFrame の概要
Spatially Enabled DataFrame (以下 SEDF) は、属性データなどを簡単に操作できるシンプルで直感的なオブジェクトを作成することができます。SEDF は、一般的な Pandas の DataFrame の構造に spatial というカスタムネームスペースを挿入して、空間的な機能を持たせます。これにより、属性列と空間列の両方に対して、直感的な操作を使用することができます。SEDF は、シェープファイル、Pandas の DataFrame、フィーチャ クラス、GeoJSON、フィーチャ レイヤーなどといった多くのソースから読み込むことができます。
GIS データへのアクセス
GIS ユーザーは、ポータル上に公開されているレイヤーやローカルのデータの両方で作業する必要がありますが、ArcGIS API for Python では、データを永続的にコピーすることなく、これらのデータセットを操作する機能が不足していました。SEDF は、地理空間データの読み取り、書き込み、操作が可能なインメモリ・オブジェクトであるため、この問題を解決することができます。
SEDF は、Esri の ArcPy やオープン ソースの pyshp、shapely、および fiona といったライブラリと統合されています。つまり、ArcGIS API for Python の SEDF は、これらのジオメトリ エンジンのいずれかを使用して、プラットフォームに関係なく地理空間データを簡単に操作するためのオプションを提供することができます。SEDF はデータを希望の形式に変換するので、Python の機能を使用して地理情報の分析や可視化を行うことができます。
データを読み込んでスクリプト化してワークフローを自動化したり、Jupyter Notebook のマップ上に簡単に可視化したりすることができます。また、データをフィーチャ クラスとしてエクスポートすることや、ArcGIS Online や ArcGIS Enterprise に公開して共有することも可能です。
本記事では SEDF として読み取る例をいくつかご紹介します。
フィーチャ レイヤーの読み取り
ArcGIS Online や ArcGIS Enterprise でホストされているフィーチャ レイヤーは、from_layer() メソッドを使用して SEDF として簡単に読み込むことができます。SEDF オブジェクトに読み込んだら、レポートを作成したり、データを操作したり、目的に合った形式に変換したりすることができます。
以下の例はArcGIS Online に公開されているアイテムを取得し、最初の 5 つのレコードを表示します。
from arcgis import GIS
gis = GIS()
item = gis.content.get("85d0ca4ea1ca4b9abf0c51b9bd34de2e")
flayer = item.layers[0]
# Spatially Enabled DataFrame オブジェクトの作成
sdf = pd.DataFrame.spatial.from_layer(flayer)
sdf.head()

また、FeatureLayer オブジェクトで、クエリを使用するとレコードのサブセットを返すこともできます。FeatureLayer に対して query() メソッドを実行すると、FeatureSet オブジェクトが返されます。FeatureSet の sdf プロパティを呼び出すと、SEDFのオブジェクトが返されます。
以下の例では、「AGE_45_54」カラムを使用してデータフレームに対し検索を行い、レコードのサブセットを含む新しいデータフレームを取得しています。その後、pandas の head() メソッドを使用して、取得した データフレームから最初の 5 つのレコードとカラムのサブセットを返します。
# queryメソッドを使ってフィーチャ レイヤーのレコードをフィルタリングしデータフレームを取得
df = fl.query(where="AGE_45_54 < 1500").sdf
# 最初の5つのレコードだけの列のサブセットを返す
df[['NAME', 'AGE_45_54', 'POP2010']].head()

ローカルの GIS データへのアクセス
SEDF はローカルの GIS データにもアクセスすることができます。インストールされている Python のモジュールに応じて、幅広い機能にアクセスすることができます。例えば、ArcPy がインストールされている場合、つまり ArcGIS Pro がインストールされていて、同じ環境に ArcGIS API for Python がインストールされている場合、フィーチャ クラスやシェープファイルなどといった ArcGIS がサポートするデータ形式から読み込むことができます。
以下の例では from_featureclass() メソッドを使用してシェープファイルを読み込み、pandas の tail() メソッドで取得したデータフレームの最後から 5 レコードを表示しています。
※ ArcPy にアクセスできない Python インタプリタを使用してシェープファイルを読み取る from_featureclass() メソッドを使用するには、ArcGIS Online または ArcGIS Enterprise にサイン インをする必要があります。
# ArcGIS Online / ArcGIS Enterprise にサイン イン
g2 = GIS("https://arcgis.com", "<ユーザー名>", "<パスワード>")
# from_featureclass() メソッドを使用してシェープファイルの読み込み
sdf = pd.DataFrame.spatial.from_featureclass("<シェープファイルのパス>")
sdf.tail()

ファイルジオデータベースのフィーチャクラスの場合も同様に from_featureclass() メソッドを使用して SEDF として読み取ることができます。

Spatially Enabled DataFrame のエクスポート
SEDFは、他のアプリケーションで使用するために、データを様々なデータ形式にエクスポートすることができます。ここでは SDEF をシェープファイルやフィーチャクラスとしてエクスポートする方法やフィーチャ レイヤーとしてエクスポートする方法をご紹介します。
シェープファイルやフィーチャクラスへエクスポート
以下の例では取得した SEDF に対し、to_featureclass() メソッドを使用して、シェープファイルとしてエクスポートしています。
# to_featureclass() メソッドでシェープファイルとしてエクスポート
sdf.spatial.to_featureclass(location=r"c:\output_examples\census.shp")

ファイルジオデータベースのフィーチャクラスの場合も同様にto_featureclass() メソッドを使用することでエクスポートが可能です。
# to_featureclass() メソッドでフィーチャ クラスとしてエクスポート
sdf.spatial.to_featureclass(location=r"c:\output_examples\census.gdb\cities")
フィーチャ レイヤーとして公開
SEDFでは、データセットをフィーチャ レイヤーとして公開することもできます。以下の例のようにSDEF に対してto_featurelayer() メソッドを使用することで公開ができます。
# to_featurelayer () メソッドでフィーチャレイヤーとして公開
lyr = sdf.spatial.to_featurelayer('census_cities', folder='census')
lyr

おわりに
今回は、Spatially Enabled DataFrame 編としまして、様々なデータから SEDF として取得する例をご紹介しました。取得したデータフレームは編集や可視化などと様々な処理に活用することができます。活用方法としまして、ガイドページの「Visualizing Data with the Spatially Enabled DataFrame (英語)」や 「Spatially Enabled DataFrames - Advanced Topics (英語) 」もご参照ください。また、ArcGIS API for Python を使用する際は冒頭でご紹介したガイドやサンプル、API リファレンスなどのリソースと併せて、本シリーズブログもご活用ください。
関連リンク
ArcGIS 関連ページ
・ArcGIS API for Python(ESRIジャパン製品ページ)
・ArcGIS for Developers(ESRIジャパン製品ページ)
・ArcGIS Online(ESRIジャパン製品ページ)
・ArcGIS for Developers 開発リソース集
・ArcGIS API for Python(米国Esri ページ(英語))
シリーズブログ 関連ページ
・ArcGIS API for Python を使ってみよう シリーズブログ
開発リソース集
・ArcGIS for API for Pythonのコンセプト
・インストールガイド
・ArcGIS for API for Pythonのための基礎環境:conda入門
関連するノートブック
・Spatially Enabled DataFrame の概要