さわって覚える ArcGIS API for Python : フィーチャ データ編

5956
0
06-09-2020 09:14 PM

さわって覚える ArcGIS API for Python : フィーチャ データ編

はじめに

「さわって覚える ArcGIS API for Python」シリーズブログは、 ArcGIS API for Python ガイドサンプルAPI リファレンスなどのリソースを最大限ご活用いただく第一歩として、ガイドの中で紹介されている主要なモジュールを中心に、実際にさわって覚えていただくようなノートブックと共に、全 5 回のシリーズとして紹介していく予定です。

 

  1. 基本編 (GIS モジュール編)
  2. フィーチャ データ編
  3. 場所検索、ジオコーディング編
  4. ネットワーク解析編(前編)/ ネットワーク解析編(後編)
  5. マッピング、可視化編
  6. ラスター編

 

前回の記事では、gis モジュールの基本的な使い方についてご紹介しました。シリーズ第 回目となる今回は、フィーチャ データ編としまして、「フィーチャ レイヤーの使用」と「フィーチャの編集」のノートブックをもとに、主要な処理を解説していきます。紹介したノートブックは GitHub にも公開しますので、ご参照ください。

 

ArcGIS API for Python の環境構築がまだお済みでない方は、開発リソース集のインストールガイドに掲載しておりますので、ご参照ください。

 

本記事では以下の内容で フィーチャ レイヤーへのアクセス方法やフィーチャの編集についてご紹介します。

 

フィーチャ レイヤーの使用

・フィーチャ レイヤーへのアクセス方法

   ・検索を使用したフィーチャ レイヤーへのアクセス

   ・アイテム ID を使用したフィーチャ レイヤーへのアクセス

URLを使用したフィーチャ レイヤーへのアクセス

フィーチャの編集

・フィーチャの更新

・フィーチャの追加

・フィーチャの削除

 

フィーチャ レイヤーの使用

フィーチャ レイヤーへのアクセス方法

FeatureLayer クラスにアクセスすることで、分析や編集等の GIS の操作を行うことができるようになります。 フィーチャ レイヤーへは検索や、アイテム ID、フィーチャ レイヤーの URL 等を使用してアクセスすることができます。

ここでは、いくつかの例を用いてフィーチャ レイヤーへアクセスする方法をご紹介します。

 

検索を使用したフィーチャ レイヤーへのアクセス

前回の記事でもご紹介した search() メソッドを用いてフィーチャ レイヤーにアクセスすることができます。

フィーチャ レイヤーは、search() メソッドの item_type パラメーターに 'Feature Layer' を指定することで検索することができます。

以下の例では、タイトルが 'USA major cities' のフィーチャ レイヤーを検索し、リストとして返却される検索結果の中から 1 番目のアイテムにアクセスしています。

search_results = gis.content.search('title: USA Major Cities',
                                    'Feature Layer')

# 検索結果の1番目のアイテムにアクセス
major_cities_item = search_results[0]
major_cities_item
‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍

 

上記で取得した検索結果は Item が返却されます。Item が持つ layers プロパティにアクセスすると FeatureLayer を取得することができます。

major_cities_layers = major_cities_item.layers
major_cities_layers
‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍

 

アイテム ID を使用したフィーチャ レイヤーへのアクセス

get() メソッドでアイテム ID を使用して特定のフィーチャ レイヤーにアクセスすることもできます。

freeways = gis.content.get('91c6a5f6410b4991ab0db1d7c26daacb')
freeways
‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍

 

先ほどと同様に取得した Item layers プロパティにアクセスすることで、FeatureLayer を取得することができます。

 

URLを使用したフィーチャ レイヤーへのアクセス

フィーチャ レイヤーの REST エンドポイントのURLを使ってアクセスすることもできます。

以下のコードでは、URL を指定してインスタンス化しています。

lyr_url = 'http://sampleserver3.arcgisonline.com/ArcGIS/rest/services/SanFrancisco/311Incidents/FeatureServer/0'
layer = FeatureLayer(lyr_url)
layer
‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍

 

ここまでは、フィーチャ レイヤーにアクセスするいくつかの方法をご紹介してきました。ここでご紹介した以外にもフィーチャ レイヤーやフィーチャを使用した操作が記載されていますので、ノートブックガイドもご参照ください。

フィーチャ レイヤーにアクセスすることができましたので、ここからはフィーチャの編集をしてみましょう。

 

フィーチャの編集

フィーチャは FeatureLayer クラスの edit_features() メソッドを使用して編集を行うことができます。

以下では、「品川区避難場所」フィーチャ レイヤーのフィーチャを更新、追加、および削除する方法をご紹介します。

 

フィーチャの更新

フィーチャの更新は edit_features() メソッドの updates パラメーターの引数にフィーチャのリストを渡すことで行うことができます。

フィーチャは FeatureSet クラスを介して選択することができるため、まずは FeatureSet を取得します。FeatureSet FeatureLayer クラスの query() メソッドを使用することで取得できます。query() メソッドの引数を指定しない場合は全ての FeatureSet が返却されます。

以下のコードでは、フィーチャ レイヤーにアクセスをし、FeatureSet を取得しています。

#更新するフィーチャ レイヤー
item = gis.content.get("de57ff0cb65b45adbb5df983dd6baced")
# FeatureLayer の取得
layer = item.layers
# query() メソッドで FeatureSet を取得
fset = layer[0].query()
fset.sdf
‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍

 

下図のように FeatureSet sdf プロパティを使用すると、データフレーム形式でフィーチャの属性を表示することができます。

 

FeatureSet を取得することができましたら、FeatureSet が持つ features プロパティで更新を行いたいフィーチャを取得し、edit_feature() メソッドで編集を実行します。今回は上記で取得した FeatureSet から 施設名フィールドが “大崎駅西口地区一帯_変更前” のフィーチャを編集します。

#更新するフィーチャを選択
feature = [f for f in fset.featues if f.attributes['施設名']=='大崎駅西口地区一帯_変更前'][0]
‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍

 

以下のように、edit_features() メソッドを使用してフィーチャを更新することができます。施設名フィールドの属性を “大崎駅西口地区一帯_変更後” に編集し、フィーチャをリスト化したもの (ここでは、[update_feature]) edit_features() updates パラメーターに渡しています。

# フィーチャの属性を編集
update_feature = feature
update_feature.attributes['施設名'] = '大崎駅西口地区一帯_変更後'

#edit_features() メソッドの引数にフィーチャのリストを渡しフィーチャを更新
update_result = layer[0].edit_features(updates=[update_feature])
‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍

 

再度データフレームを表示するとフィーチャの属性が更新されたことを確認できます。

 

フィーチャの属性だけでなく、以下のように geometry プロパティを編集してフィーチャの位置も更新することができます。

# フィーチャの位置 (XY) を編集
update_feature.geometry = Point({'x': 139.729592,'y': 35.617076 ,"spatialReference" : {"wkid" : 4326}})

#edit_features() メソッドの引数にフィーチャのリストを渡しフィーチャを更新
update_result = layer[0].edit_features(updates=[update_feature])
‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍

 

フィーチャの追加

フィーチャを追加は edit_features(adds = [dict]) のように、edit_features() メソッドの adds パラメーターの引数にフィーチャの情報を定義した辞書 (dictionary) 型をリスト化したもの渡すこと行うことができます。リストの中には以下のように辞書 (dictionary) 型で定義します。

今回は「品川区避難場所」レイヤーに新たに“戸越公園”のフィーチャを追加します。フィーチャの表し方や複数のフィーチャを追加する場合など詳しくは Add Featuresをご参照ください。

dict = {"attributes": 
        {'施設名': '戸越公園',
         'カテゴリ': '広域避難場所',
         '都道府県名': '東京都',
         '住所': '品川区豊町',
         '緯度': 35.610598,
         '経度': 139.722376},
        "geometry":
        {'x': 139.722376,'y': 35.610598 ,"spatialReference" : {"wkid" : 4326}}}
‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍

 

フィーチャを追加する前と後を比較するため、フィーチャ追加前のレイヤーをマップに表示してみます。マップ ウィジェットにレイヤーを追加する方法については前回の記事もご参照ください。

下図の戸越公園の位置にはまだフィーチャがないことが確認できます。

 

次のコードでは、先ほど定義したフィーチャの情報のリストを edit_features() メソッドの adds パラメーターに渡して追加をしています。

add_result = layer[0].edit_features(adds = [dict])‍‍‍‍‍‍‍‍‍

 

もう一度マップ ウィジェットにレイヤーを追加すると新しくフィーチャが追加されたことがわかります。

 

フィーチャの削除

フィーチャの削除はedit_features() メソッドの deletes パラメーターに削除したいフィーチャのオブジェクト ID を渡します。

まず、フィーチャの更新と同様 FeatureLayer クラスの query() メソッドを使用して削除したい FeatureSet 取得します。query() メソッドの where パラメーターで条件を指定することで目的のフィーチャを取得することができます。以下では、先ほど追加した戸越公園のフィーチャを削除します。

#削除するフィーチャの選択
delete_fset = layer[0].query(where = "施設名 = '戸越公園'")	
delete_feature = delete_fset.features‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍

 

deletes パラメーターに渡すために get_value() メソッドを使用して、選択したフィーチャのオブジェクト ID を取得します。

oid = delete_feature[0].get_value('ObjectId')‍‍‍‍‍‍‍‍‍

 

edit_features() メソッドの deletes パラメーターで取得したオブジェクト ID を文字列として渡し、削除を実行します。

delete_result = layer[0].edit_features(deletes=str(oid))‍‍‍‍‍‍‍‍‍

 

再度マップ ウィジェットにレイヤーを追加すると戸越公園のフィーチャが削除されています。

データ出典:東京都オープンデータカタログサイト 品川区 避難所を基にフィーチャ レイヤーを作成

 

おわりに

今回は、フィーチャ レイヤーを使用した処理をご紹介しました。今回ご紹介したようなフィーチャ レイヤーにアクセスしたり、フィーチャを編集することは ArcGIS でよく使用する処理ですので、ArcGIS API for Python でフィーチャ レイヤーやフィーチャを操作する際は冒頭でご紹介したガイドサンプルAPI リファレンスなどのリソースと併せて、本シリーズブログもご活用ください。

次回は「場所検索、ジオコーディング編」としまして geocoding モジュールを使用した処理についてご紹介する予定です。

 

関連リンク

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入門

 

関連するノートブック

フィーチャ レイヤーの使用

フィーチャの編集

Working with feature layers and features (英語)

Editing Features (英語)

Version history
Last update:
‎11-12-2020 11:24 PM
Updated by:
Contributors