現地調査の際に、位置のトラッキングをお使いでしょうか? 位置のトラッキング は、ArcGIS Online(もしくはArcGIS Enterprise)の組織全体で利用できる機能で、ユーザーの現在地と過去の位置を記録する機能を提供します。
まだ利用したことがない方や、位置のトラッキングって何?、ArcGIS Field Maps でどのように使うの?という方は、最近、ArcGIS リソース集 にArcGIS Field Maps のスタートアップ ガイド が追加されましたので、そちらをご参照ください。
一方、ArcGIS API for Python を使用した位置のトラッキング機能の管理方法やデータへのアクセス方法は、Help に”Managing ArcGIS applications - Configuring Location Tracking” として説明されています。また、同じ内容を記載したノートブックが”Configuring Location Tracking and Track Views For Your Organization” として公開されており、それを翻訳したノートブックも公開 していますので、API でのアクセス方法が知りたい方は、そちらをご参照ください。
本ブログでは、ArcGIS Online 上のArcGIS Notebooks で作成した、次の操作を試すサンプル ノートブックの実装時のポイントを解説していきます。サンプル ノートブックは、整形したものをGitHub で公開 しておりますので、より詳細に内容を確認したい場合は、そちらを参照ください。
※ 上記の翻訳したノートブックでも記載していますが、ArcGIS Online のトラックは30日間のみ保存される仕様です。今回は、保存期間が経過した後でもデータとして利用するために、フィーチャ レイヤー(Feature Layer)としてArcGIS Online 上に保存しています。
なお、位置のトラッキングは、有償のArcGIS Developer Subscription で利用可能な「ArcGIS Online 組織向けプラン(開発およびテスト用途限定)」を利用し、ArcGIS Field Maps でトラッキングを行いました。
図:サンプル ノートブック
ここからは、ノートブックに書かれているコードの解説が中心になります。ArcGIS Online 上のArcGIS Notebooks の使い方に不安がある方は、最初に、以下の記事を一読いただくことをお勧めします。
以下は、ArcGIS Online 上のArcGIS Notebook を新規作成時に自動的に生成され、GIS モジュールにアクセスするものですので、そのまま利用します。
from arcgis.gis import GIS
gis = GIS("home")
組織で位置のトラッキング が有効化されると 位置トラッキング サービスという新しいアイテムが作成され、FieldMaps で取得したトラック データは、このサービスにアップロードされます。
位置トラッキング サービス は2つのレイヤーで構成され、最初のレイヤーであるTracks は、各ユーザーの過去の位置情報の履歴を保存し、2つ目のレイヤーであるLast Known Locations は、Field Maps 等のTracker モバイル アプリ を利用している各ユーザーの最新の位置情報を格納します。
これらのレイヤーにはLocationTrackingManager を通して簡単にアクセスできますが、今回利用するのは、Tracks レイヤー(tracks_layer)です。
from arcgis.apps.tracker import TrackView
# LocationTrackingManager にアクセス
location_tracking = gis.admin.location_tracking
# Tracks レイヤー はプロパティからアクセス可能
tracks = location_tracking.tracks_layer
Tracks に記録されている時間はUTCなので、クエリの条件文を作成する際には注意が必要です。
(JST時間からUTC時間に変換する際には、JST時間から -9時間した時間をUTC時間に設定します)
今回、Field Maps で位置のトラッキングを行ったのは、JST時間で2022年01月10日の15時30分~19時の間です。そのため、MapViewer でのwhere句 を参考にJST時間から-9時間したUTC時間に変換した条件設定をすると、次のようになります。
(location_timestamp BETWEEN timestamp '2022-01-10 06:30:00' AND timestamp '2022-01-10 10:00:00') AND (1=1)
上記の条件で、FeatureLayer.query() でクエリを行い、さらに戻り値のFeatureSet のプロパティsdfで、Spatially Enabled DataFrame(SEDF)にしてします。
# 抽出条件をUTC時間で設定
wh = "(location_timestamp BETWEEN timestamp '2022-01-10 06:30:00' AND timestamp '2022-01-10 10:00:00') AND (1=1)"
# FeatureLayer.query() の戻り値はFeatureSet、FeatureSetプロパティsdfでSEDFを取得可能
query_tracks = tracks.query(where = wh, out_fields='*').sdf
Spatially Enabled DataFrame(SEDF)に、to_featurelayer() という便利なメソッドがあるので、それを利用して、フィーチャ レイヤーとして保存します。
# FeatureLayer として2022年1月10日のトラックを保存
lyr = query_tracks.spatial.to_featurelayer(title='tracks_20220110', tags='tracks')
以上のように、フィーチャ レイヤーとして保存するだけであれば、10行もコードを書かずに済みます。
それだけではあまり面白くないため、ここからは別のアプローチとして、PandasのDataFrame を使った場合の、抽出、保存、ついでにグラフ表示やマップに表示を試してみたコードも紹介します。
Help のTracks レイヤー(tracks_layer)に記載されているように、tracks_layer はFeatureLayer です。そのため、まずはSpatially Enabled DataFrame (SEDF) のfrom_layer() 関数でDataFrame にデータを読み込みます。
# Spatially Enabled DataFrame (SEDF) にTracks レイヤー を読み込みます
import pandas as pd
sdf = pd.DataFrame.spatial.from_layer(tracks)
次に、 location_timestamp フィールドで日付と時間を指定して、今回のField Maps で対象としているトラッキングデータのみを、別のDataFrame に読み込みます。
# 上記のFeature Layer の BETWEEN 相当の条件でDataFrame に読み込みします
import datetime as dt
#2022-01-10
query_sdf = sdf[(sdf['location_timestamp'] >= dt.datetime(2022,1,10,6,30,0)) & (sdf['location_timestamp'] < dt.datetime(2022,1,10,10,0,0))]
「さわって覚える ArcGIS API for Python : Spatially Enabled DataFrame 編」で紹介したように、Spatially Enabled DataFrame (SEDF) は、一般的な Pandas の DataFrame に spatial というカスタムネームスペースを挿入して、空間的な機能を持たせているものです。そのため、Pandas のDataFrame でよく行う操作も行うことが可能です。GitHub で公開しているノートブック(リンク予定)では、次の操作を試したコードと結果を公開していますが、冗長になるため、ここではコードのみ記載します。
#要約統計量の算出
query_sdf.describe()
#特定の列を指定した統計値の算出
query_sdf['speed'].mean()
#query 関数を使って平均速度以上のレコードの抽出
over_sdf = query_sdf.query('speed >= 1.503300')
over_sdf.describe()
その他にも、matplotlib でのグラフ表示(UTC時間)、マップにTracks レイヤーを表示も行っております。同様に、冗長になるため、ここでは実現するまでのコードのみ記載します。
# UTC から JST に変換してx:時間、y:スピード でグラフに表示してみます
# 警告の回避のため明示的にDataFrameをcopy()
query_sdf = query_sdf.copy()
query_sdf['location_timestamp_jst'] = pd.to_datetime(query_sdf['location_timestamp'], utc=True).dt.tz_convert('Asia/Tokyo')
# JST 時間に変換済みのx軸でグラフ表示
query_sdf.plot(x='location_timestamp_jst', y='speed')
my_map = gis.map('埼玉県川越市')
my_map #セルに地図を表示
# Tracks レイヤーを追加
my_map.add_layer(tracks)
3) と同様、Spatially Enabled DataFrame(SEDF)に、to_featurelayer() という便利なメソッドがあるので、それを利用して、フィーチャ レイヤーとして保存します。
※これはDataFrame でいろいろ操作した結果でも、フィーチャ レイヤーとして保存可能かを確認している操作になります。そのため、3) で保存したフィーチャ レイヤーと本質的に変わりありません。
# FeatureLayer として2022年1月10日のトラックを保存
lyr = query_sdf.spatial.to_featurelayer(title='tracks_20220110', tags='tracks')
今回の記事では、ArcGIS Developer Subscription で利用可能な「ArcGIS Online 組織向けプラン(開発およびテスト用途限定)」を利用し、ArcGIS Notebooks で次の操作を試すサンプル ノートブックの実装時のポイントを解説しました。
トラック データのより高度な分析は、Learn ArcGIS で「ArcGIS Field Maps で取得した追跡データを分析する」として、データのローカルへの保存にはじまり、ArcGIS Pro を使用したさまざまな分析や視覚化について、紹介されていますので合わせてご参照ください。
また、コードでのより高度な分析は、米国Esri のGitHub に「Tracker Scripts」として、ArcGIS API for Python を使用したさまざまな分析や可視化について、紹介されていますので合わせてご参照ください。
※ ご自身の組織のトラック データを振り返って分析をする必要がある際には、データのバックアップも忘れずに!
「ArcGIS Field Maps で取得した追跡データを分析する」に掲載されているコンテンツ一覧(2022年3月時点)
・追跡データで検査を検証する(英語の記事)
・追跡データで線形ヒートマップを作成する(英語の記事)
・位置の追跡データを使用してアニメーションを作成する(英語の記事)
・集約した追跡データを視覚化する(英語の記事)
「Tracker Scripts」に掲載されているノートブックとスクリプトの一覧(2022年3月時点)
ノートブック;
・Basic Track Analysis - PySpark
・Create an Aggregated Map Service
スクリプト;
・Check Edit Location - README here
・Mirror LKL Layer - README here
・Polygon Cleanup Tracks - README here
・Generate Users Arcade Expression - README here
・Export Tracks From AGOL - README here
【ブログでの参考記事】
【本記事に関連した参考情報】