以前、GeoNetブログでは、ArcGIS API for Python のガイド、サンプル、API リファレンスなどのリソースを最大限ご活用いただく第一歩として、ガイドの中で紹介されている主要なモジュールを中心にご紹介する「さわって覚える ArcGIS API for Python」シリーズを公開しました。
さわって覚える ArcGIS API for Python シリーズ
本記事では、ラスター編として前回ご紹介できなかった「イメージ レイヤーの使用」のノートブックをもとにご紹介します。紹介したノートブックは GitHub にも公開しますのでご参照ください。
ArcGIS API for Python の環境構築がお済みでない方は、開発リソース集のインストールガイドに掲載しておりますので、ご参照ください。
本記事では以下の内容でご紹介します。
イメージ レイヤーへのアクセス
・イメージ レイヤーの検索とアイテムの取得
・ImageryLayer クラスへのアクセス
イメージ レイヤーの可視化
ラスター関数の使用したオンザフライの画像処理の例
イメージ レイヤーの検索とアイテムの取得
arcgis.raster モジュールにはラスター データやイメージ レイヤーを扱うためのクラスやラスターの解析を行う関数が含まれています。
ラスター データは各セルまたはピクセルが値を持つことのできるセルのグリッドで構成されており、衛星画像や化学物質の濃度面、標高のような連続的に変化するデータを扱うのに利用されます。
ここでは raster モジュールの中の ImageryLayer クラスへのアクセス方法についてご紹介します。
ImageryLayer クラスを使用することでイメージ サービスをレイヤーとして表示することができます。
まずは、イメージ レイヤーのアイテムを取得します。イメージ レイヤーは「基本編」でも紹介した方法と同様に search メソッドで検索、get メソッドでアイテムを取得することができます。
以下のコードでは、search メソッドの item_type パラメーターに “Imagery Layer” を指定することでイメージ レイヤーのみを検索対象としています。
# インポート
from arcgis.gis import GIS
from IPython.display import display
gis = GIS()
# イメージ レイヤーの検索
items = gis.content.search(“Landsat 8 Views”, item_type="Imagery Layer" max_items=2)
for item in items:
display(item)
また、以下のように、get メソッドの引数にアイテム ID を指定することで、イメージ レイヤーをアイテムとして取得することができます。
# アイテムIDでイメージ レイヤーの取得
l8_views = gis.content.get(“4ca13f0e4e29403fa68c46d188c4be73”)
ImageryLayer クラスへのアクセス
イメージ レイヤーのアイテムを取得することができたら、次は ImageryLayer クラスへアクセスします。
ほかのレイヤー ベースのアイテムと同様にイメージ レイヤーもアイテムの layers プロパティを使用してImageryLayer クラスにアクセスすることができます。上記のコードで取得したアイテム (l8_views) の layers プロパティを使用して以下のように記述します。
l8_lyr = l8_views.layers[0]
l8_lyr
また、イメージ サービスの URL を使用して ImageryLayer にアクセスすることも可能です。以下の例では、先ほど使用したイメージ レイヤーを今度は URL (https://landsat2.arcgis.com/arcgis/rest/services/Landsat8_Views/ImageServer) からアクセスしています。
# ImageryLayer クラスのインポート
from arcgis.raster import ImageryLayer
# イメージ サービスの URL
img_svc_url = 'https://landsat2.arcgis.com/arcgis/rest/services/Landsat8_Views/ImageServer'
landsat_lyr = ImageryLayer(img_svc_url)
landsat_lyr
取得したイメージ レイヤーは以下のように add_layer メソッドを用いてマップ ウィジェットに追加して可視化することができます。まずは、イメージ レイヤーを追加するためのマップ ウィジェットを表示します。
# マップ ウィジェットの表示
map = gis.map(“Pallikaranai”, zoomlevel=13)
続いて、先ほどアクセスしたイメージ レイヤー (landsat_lyr) を引数として、add_layer メソッドを使用することで、以下の画像のようにイメージ レイヤーをマップ ウィジェットに追加して可視化することができます。
# イメージ レイヤーの追加
map.add_layer(landsat_lyr)
map
# バージョン 2.4.0 の場合
map.content.add(landsat_lyr)
map
イメージ レイヤーの画像処理にはさまざまなラスター関数を使用することができます。イメージ レイヤー自体に画像処理を含むラスター関数を追加することで処理が適用された状態に表示を切り替えることができます。
上記で表示したイメージ レイヤーに含まれているラスター関数は以下のように ImageryLayer クラスの properties で確認することができます。
for fn in landsat_lyr.properties.rasterFunctionInfos:
print(fn['name'])
上記で確認したラスター関数のほかにも Rater function objects ページに記載されているラスター関数を使用することもできます。
その中のバンド演算関数のSAVI 関数を使用した例をご紹介します。SAVI (Soil-Adjusted Vegetation Index) は土壌調整係数を用いて、土壌の明るさの影響を最小化することを目的とした植生指数であり、植生被覆が少ない乾燥した地域でよく使われます。
※SAVI関数の詳細はこちらのページの SAVI メソッドの項目をご参照ください。
以下の例では、SAVI の指標を使用して乾燥したサハラ砂漠の中の、ナイル川の堤防やデルタ周辺の肥沃な土壌を表現しています。
# ナイル川周辺のマップを表示
savi_map = gis.map("Cairo")
savi_map
# savi 関数をインポート
from arcgis.raster.functions import savi
# savi 関数を使用した結果をマップ ウィジェットに追加
savi_map.add_layer(savi(landsat_lyr, band_indexes="5 4 0.3"))
今回は、ラスター編としてイメージ レイヤーのアイテムや ImageryLayer クラスへのアクセス方法や、ラスター関数を使った例をご紹介しました。ご紹介した以外にも多数のラスター関数が提供されており、それぞれを組み合わせたりすることで様々な分析や画像処理などが可能になります。ArcGIS API for Python を使用する際は冒頭でご紹介したガイドやサンプル、API リファレンスなどのリソースと併せて、本シリーズブログもご活用ください。
ArcGIS 関連ページ
・ArcGIS API for Python(ESRIジャパン製品ページ)
・ArcGIS Developers(ESRIジャパン製品ページ)
・ArcGIS API for Python(米国Esri ページ(英語))
シリーズブログ 関連ページ
・ArcGIS API for Python を使ってみよう シリーズブログ
開発リソース集
・ArcGIS for API for Pythonのコンセプト
・ArcGIS for API for Pythonのための基礎環境:conda入門
関連するノートブック
・Using Imagery Layers (英語)