Snap to Roads は Azure Maps サービスであり、ルートに沿って収集された一連の GPS ポイントを処理し、車両が移動した可能性が最も高い道路にそれらのポイントをスナップします。 この機能は、収集された GPS データがわずかにずれている場合でも、車両がたどった正確な経路を決定するのに役立ちます。
このチュートリアルでは、信号損失によりデータが不正確または不完全な場合でも、Microsoft Fabric で Azure Maps Snap to Roads API を使用して、移動する資産からの GPS データを分析する方法について説明します。 Microsoft Fabric ノートブックから Azure Maps Snap to Roads API を呼び出して、GPS ポイントを最も近い道路にスナップし、補間されたデータ ポイントを使用して欠落しているポイントを埋め、道路名や速度制限などの追加属性で強化する手順について説明します。
このチュートリアルでは、次のことについて説明します。
- Microsoft Fabric Lakehouse を作成し、その中に、車両の生の GPS データをインポートします。
- Azure Maps Snap to Roads API を使用して、生の GPS データを受け取り、要求されたスナップ座標情報を返す Microsoft Fabric ノートブックを作成します。
- イベントハウス と KQL データベースを作成し、その中に、スナップされた GPS データをインポートします。
- Kusto データベース内のスナップされた GPS データを使用してリアルタイム ダッシュボードを作成します。
- KQL データのクエリを実行し、スナップされた GPS データをマップ ビジュアルに表示します。
前提条件
注
Azure Maps での認証の詳細については、「Azure Maps での認証の管理」を参照してください。
Microsoft Fabric ノートブックとレイクハウスを作成する
Microsoft Fabric ノートブックを作成するには、以下の手順に従います。
マイ ワークスペース に移動し、[新しい項目] を選択します。
[新しい項目] 画面が表示されたら、下にスクロールし、[ノートブック] を選択します。
ノートブックの [エクスプローラー] 画面で、[レイクハウス] の矢印 > を選択します。
追加 ボタンを選択します。
[レイクハウスの追加] ダイアログで、[新しいレイクハウス] を選択し、[追加] ボタンを選択します。
[新しいレイクハウス] ダイアログで、名前として "Azure_Maps_Data" を入力し、[作成] ボタンを選択します。
レイクハウスにデータ ファイルを追加する
Snap to Roads は、GPS ポイント データ (緯度、経度) を受け取り、地図上の道路にスナップされたルートを形成するオブジェクトの一覧を返します。 必要な GPS データを含むデータ ファイルをファイルとしてレイクハウスに追加し、ノートブックの Python コードで参照することができます。
データ ファイルをダウンロードする
次のセクションでレイクハウスにアップロードするために、サンプル データ (mockData_20240919.csv) を GitHub からローカル ストレージ デバイスにダウンロードします。 このファイルには、各座標が有効な道路を確実に指すようにするために、必要に応じて Snap to Roads サービスによって変更される GPS 座標の配列が含まれています。
GitHub でファイル mockData_20240919.csv を開きます。
画面の右上隅にある [生ファイルのダウンロード] を選択し、ファイルをローカルに保存します。
レイクハウスにデータ ファイルをアップロードする
以下の手順では、レイクハウスにデータ ソースを追加する方法について説明します。
レイクハウスの [ファイル] フォルダーから、[アップロード] > [ファイルのアップロード] の順に選択します。
"フォルダー" アイコンを選択すると、[ファイルを開く] ダイアログが表示されます。 前のセクションでダウンロードした mockData_20240919.csv ファイルを選択し、[開く] ボタンを選択します。 [ファイルを開く] ダイアログ ボックスが閉じて、[ファイルのアップロード] コントロールに正しいファイル名が表示されたら、[アップロード] ボタンを選択して、ファイルをレイクハウスにアップロードします。
ノートブックにコードを追加する
Snap to Roads シナリオを実行するには、4 つのコード セルをノートブックに追加して実行する必要があります。 以降のセクションでは、この手順を説明します。
パッケージをインストールする
まず、必要なパッケージを読み込む必要があります。
!pip install geopandas
!pip install geojson
ノートブックの最初のセルに pip install ステートメントを入力し、"実行矢印" を選択してステートメントを実行します。
データの読み込み
次に、以前にアップロードしたサンプル データをレイクハウスに読み込みます。
パッケージのインストールに使用したセルのすぐ下にポインターを合わせます。 コードまたはマークダウンを追加するオプションが表示されます。 [コード] を選択して、別のコード セルをノートブックに追加します。
新しいセルが作成されたら、次のコードを追加します。
import geopandas as gpd import pandas as pd lakehouseFilePath = "/lakehouse/default/Files/" mockdata_df = gpd.read_file(lakehouseFilePath + "mockData_20240919.csv") mockdata_df = gpd.GeoDataFrame( mockdata_df, geometry=gpd.points_from_xy(mockdata_df.longitude, mockdata_df.latitude), crs="EPSG:4326" ) mockdata_df.head() mockdata_df.tripID.unique()"実行矢印" を選択して、コードを実行します。 これにより、サンプル データが読み込まれます。
Snap to Roads を使用して強化する
このノートブック セルのコードは、レイクハウス内のデータ ファイルから生の GPS データを読み取り、それを Azure Maps Snap to Road API に渡します。 補間を有効にすると、API により、GPS の位置の間にポイントが追加され、道路に沿ってルート パスが完成されます。 また、使用可能な場合は、道路名や速度制限などの属性も提供されます。
前の手順でパッケージのインストールに使用したセルのすぐ下にポインターを合わせます。 コードまたはマークダウンを追加するオプションが表示されます。 [コード] を選択して、別のコード セルをノートブックに追加します。
新しいセルが作成されたら、次のコードを追加します。 サブスクリプション キーを必ず追加してください。
import requests import json az_maps_subkey = "" az_maps_snaproads_url = "https://atlas.microsoft.com/route/snapToRoads?api-version=2025-01-01&subscription-key=" + az_maps_subkey # Function to process snap to road for each given trip def process_route(df, outputFilePath): # List to store successful responses successful_responses = [] # Function to send a chunk of features def send_chunk_snaproads(chunk): geojson_data = chunk.to_json() # Convert the JSON string to a Python dictionary geojson_dict = json.loads(geojson_data) # Add the new fields at the end of the dictionary geojson_dict['includeSpeedLimit'] = True geojson_dict['interpolate'] = True geojson_dict['travelMode'] = "driving" # Convert the dictionary back to a JSON string updated_geojson_data = json.dumps(geojson_dict) response = requests.post( az_maps_snaproads_url, headers={'Content-Type': 'application/json'}, data=updated_geojson_data ) if response.status_code == 200: print('Chunk request was successful...') successful_responses.append(response.json()) else: print(f'Failed to send request. Status code: {response.status_code}') print('Response body:', response.text) # Loop over the GeoDataFrame in chunks of 100 chunk_size = 100 for start in range(0, len(df), chunk_size): end = start + chunk_size chunk = df.iloc[start:end] send_chunk_snaproads(chunk) # Extract features with geometry from successful responses features_with_geometry = [] for response in successful_responses: if 'features' in response: for feature in response['features']: if 'geometry' in feature: longitude = feature['geometry']['coordinates'][0] latitude = feature['geometry']['coordinates'][1] feature['properties']['latitude'] = latitude feature['properties']['longitude'] = longitude features_with_geometry.append(feature) # Convert the list of features with geometry to a GeoDataFrame if features_with_geometry: responses_gdf = gpd.GeoDataFrame.from_features(features_with_geometry) # Write successful responses to a cvs file #responses_gdf.to_file(outputFilePath, driver='GeoJSON') responses_gdf.to_csv(outputFilePath, encoding='utf-8', index=False) print(f'Successful responses written to {outputFilePath}') else: print('No valid features with geometry found in the responses.')"実行矢印" を選択して、コードを実行します。
強化されたデータを含むファイルを作成する
次のコードは、前のコード セルで作成された出力を受け取り、SnapRoadResponses.csv という名前の新しい CSV ファイルをレイクハウスに作成します。 この新しいデータ ファイルには、適切な道路に合わせて更新された GPS 座標が含まれており、使用可能な場合は通りの名前と速度制限も含まれます。 SnapRoadResponses.csv は、イベントハウスにインポートされ、このチュートリアルで後でマップ ビジュアルを作成するために使用されます。
前の手順で Snap to Roads を使用して強化するために使用したセルのすぐ下にポインターを合わせます。 コードまたはマークダウンを追加するオプションが表示されます。 [コード] を選択して、別のコード セルをノートブックに追加します。
新しいセルが作成されたら、次のコードを追加します。
lakehouseFilePath = "/lakehouse/default/Files/" #execute snap to road outputFilePath = lakehouseFilePath + "SnapRoadResponses" + ".csv" df = mockdata_df.sort_values(by='timeStamp').reset_index(drop=True) process_route(df, outputFilePath)"実行矢印" を選択して、コードを実行します。 これにより、GPS 座標が更新された SnapRoadResponses.csv がレイクハウスに保存されます。
ヒント
ノートブックのコードを実行した後、新しいファイルが表示されない場合、ブラウザーの更新が必要な可能性があります。
ファイル パスをコピーする
SnapRoadResponses.csv への "ABFS パス" は、このチュートリアルで後でイベントハウスを作成するときに必要です。 このファイルへの ABFS パスを取得するには、ファイルの横にある省略記号 (...) を選択し、ポップアップ メニューから [ABFS パスのコピー] を選択します。 コピーしたら、後で使用できるように保存します。
イベントハウスを作成し、レイクハウス内のデータにリンクする
フリートまたは移動する資産のテレメトリ データを管理するためのイベントハウスを作成します。 KQL データベースは、既定では自動的に作成されます。 このチュートリアルでは、スナップされたデータをレイクハウスから KQL データベースにインポートします。 リアルタイム分析の場合、ストリーミング データを追加します。 データがアップロードされると、KQL クエリセット内で Kusto 照会言語を使用してデータのクエリを実行できます。
マイ ワークスペース に移動し、[新しい項目] を選択します。
[新しい項目] 画面が表示されたら、下にスクロールし、[イベントハウス] を選択します。
[新しいイベントハウス] 画面で、新しいイベントハウスの名前を入力します (例: SnapToRoadDemo)。
次に、以前に作成したレイクハウスを新しいイベントハウスにリンクします。
新しいイベントハウスの横にある省略記号を選択し、ポップアップ メニューから [データの取得] > [OneLake] の順に選択します。
[新しいテーブル] を選択し、それに GPSData という名前を付け、[次へ] を選択します。
[OneLake ファイル] コントロールに、以前に保存したレイクハウス データ ファイルへの ABFS パス (SnapRoadResponses.csv) を入力し、正符号 (+) を選択して、それを一覧に追加します。
[次へ] を選択します。
[データの検査] 画面でデータを確認した後、[完了] を選択します。
[閉じる] を選択して、[サマリー] ページを閉じます。
これで、イベントハウスが作成され、GPS データが格納されます。
リアルタイム ダッシュボードを作成する
リアルタイム ダッシュボードを作成して、イベントハウス内のデータセットに接続できます。 このチュートリアルの入力は、リアルタイム ストリームではなく静的データですが、Azure Maps Visual などのダッシュボードのタイルは、視覚的な表現や分析に使用できます。
データ ソースの追加
マイ ワークスペース に移動し、[新しい項目] を選択します。
[新しい項目] 画面が表示されたら、[リアルタイム ダッシュボード] を検索するか、下にスクロールして、選択します。
新しいリアルタイム ダッシュボード画面で、名前として SnapToRoadDashboard を入力し、[作成] を選択します。
新しい リアルタイム ダッシュボード画面で、[新しいデータ ソース] を選択します。
[追加] ボタンを選択し、[OneLake データ ハブ] を選択します。
データ ソースを選択し、[接続] を選択します。
[表示名] を入力し、[追加] を選択します。
[データ ソース] パネルを閉じます。
リアルタイム ダッシュボードのデータ ソースを追加したので、クエリとマップ ビジュアルを追加できます。
クエリとマップ ビジュアルを追加する
[タイルの追加] を選択します。
クエリに
GPSDataを入力し、[実行] を選択します。 クエリが動作することを確認したら、[ビジュアルの追加] を選択します。[ビジュアルの書式設定] パネルで、[ビジュアルの種類] ドロップダウンから [マップ] を選択します。
次に、[データ] セクションで値を設定します。
データ設定 値 場所による定義 緯度と経度 緯度列 緯度 (実数) 経度列 経度 (実数) [列のラベル] ドロップダウンから値を選択して、マップ情報カードを更新します。 SpeedLimitInKilometersPerHour を選択します。
[変更の適用] を選択します
マップ ビジュアルが表示されます。 マップ上の任意のポイントを選択すると、座標とその場所の "速度制限 (km/時)" を取得できます。
次のステップ
Microsoft Fabric ノートブックの詳細情報:
このチュートリアルでは、旅行後のルート分析のためのダッシュボードを作成しました。 Microsoft Fabric でリアルタイム ダッシュボードを構築するためのステップバイステップ ガイドについては、次の記事を参照してください。