チュートリアル: Fabric Maps を使用してリアルタイムの作業指示書ルーティングを構築する

Microsoft Fabric Maps は、地理空間の視覚化と分析を提供し、リアルタイムおよび履歴空間データから実用的な分析情報を提供します。

このチュートリアルでは、電力会社のフィールド ディスパッチャーが Microsoft Fabric Maps を使用して、障害や資産障害が報告されたときに修復作業指示を作成および管理します。 このシナリオでは、影響を受ける顧客を特定し、アクティブな作業指示をリアルタイムで視覚化し、サービスの復旧のために効率的に乗組員を派遣することに重点を置いています。

このチュートリアルでは、顧客の場所のマッピング方法、ライブ作業指示書がマップ上に表示される方法、および Azure Maps Route Directions API を使用して最適なルートを計算する方法について説明します。 このチュートリアルは、マップに表示される最適化されたルートで終了します。

Fabric Maps は Fabric リアルタイム インテリジェンス内で実行され、Eventstream と Eventhouse を使用してストリーミング テレメトリを取り込み、リアルタイム監視を行います。 作業指示書の完了と運用結果は OneLake に格納され、マップに表示されるルートの最適化と分析に使用できます。

このチュートリアルでは、次のことを行います。

  • Lakehouse を作成し、サンプルの作業指示書データをアップロードします。
  • 作業指示書データをイベントハウスに書き込むイベントストリームを設定します。
  • インポートされた作業指示書データから顧客座標を抽出する Kusto 関数を作成します。
  • マップを作成し、関数をマップ レイヤーとして追加します。
  • Azure Maps Route Directions API を使用して最適なルートを計算します。
  • 最適化されたルートをレイヤーとしてマップに追加します。
  • マップとレイヤーの設定を構成します。

[前提条件]

このチュートリアルを開始する前に、 Real-Time Intelligence のチュートリアル を確認して、主要な概念とワークフローを理解しておくと役立ちます。

Lakehouse を作成し、サンプルの作業指示書データをアップロードする

リアルタイム ストリーミング ソースをシミュレートするために、次の手順のノートブックでは、Lakehouse にアップロードされたサンプル データを使用します。 運用環境では、このデータは静的ではなくストリーミングされます。

作業指示書データ ファイルを作成する

作業指示書データ ファイルには、このチュートリアルでリアルタイム ストリーミング ソースをシミュレートするために使用されるサンプルの作業指示書レコードが含まれています。 ファイルを作成したら、次の手順で lakehouse にインポートします。

次の内容をコピーしてテキスト ファイルに貼り付け、 WorkorderLocations.csvとして保存します。 このファイルは、次の手順で使用します。

WorkorderID,Latitude,Longitude
100,48.22610712,16.32977412
101,48.23519063,16.37364699
102,48.19785896,16.38669028
103,48.18125837,16.37068261
107,48.15151126,16.41766590
108,48.20290349,16.32492121
104,48.23400591,16.4563533
105,48.18145603,16.40506946
106,48.16366378,16.36001083

Lakehouse を作成し、作業指示書データ ファイルをインポートする

受信作業指示書データ用の新しい Lakehouse を作成し、以前に作成した作業指示場所ファイルをインポートします。

  1. ワークスペースから [ 新しいアイテム] を選択し、検索ボックスに 「lakehouse 」と入力し、それを選択して新しいレイクハウスを作成します。
  2. WorkorderLocationsLakehouse という名前を入力し、[作成] を選択します。
  3. 新しい lakehouse で、[ ファイルのアップロード ] を選択し、前の手順で作成した WorkorderLocations.csv ファイルをアップロードします。
  4. 新しい lakehouse で、画面の左側にある [エクスプローラー ] ウィンドウを選択します。
  5. エクスプローラーの [ファイル] セクションで、WorkorderLocations.csv を選択して、アップロードしたファイルを表示します。
  6. [表示設定] で、[先頭行] をヘッダーとして選択します
  7. (省略可能)[ビュー] ドロップダウン リストで、[ テーブル ビュー] を選択します。

lakehouse にインポートした後の WorkorderLocations.csv ファイルのスクリーンショット。

イベントストリームを作成し、イベントハウスにデータを書き込む

このセクションでは、カスタム エンドポイントを使用してイベントストリーム フローを設計し、ノートブックを使用してデータを送信してリアルタイム ストリーミングをシミュレートします。

Microsoft Fabric Eventstream は、ユーザーが Microsoft Fabric エコシステム内でイベント データを取り込み、処理し、ルーティングできるようにするリアルタイム データ ストリーミング サービスです。 イベントドリブン ワークフローを構築するためのコードなしのエクスペリエンスが提供されるため、さまざまなソースからのリアルタイム データをシームレスに統合し、複数の宛先にルーティングできます。 サポートされているデータ ソースまたはカスタム エンドポイントに接続する方法の詳細については、 Microsoft Fabric イベントストリームの概要を参照してください。

eventstream データをイベントハウスに取り込むことで、ストリーミング イベントを Kusto で処理できるようになり、テーブルまたは関数を使用してリアルタイムで変換および分析できます。 詳細については、「イベントハウスの概要」を参照してください。

eventstream と eventhouse を作成する

  1. ワークスペースから [ 新しい項目] を選択し、検索ボックスに 「eventstream 」と入力します。

  2. [Eventstream] を選択します。

  3. [ 新しいイベントストリーム ] ダイアログで、 名前として "WorkordersEventstream" を入力し、[ 作成] を選択します。

  4. [ストリーミング イベントの取り込み、変換、ルーティングを行うフローを設計する] 画面で、[カスタム エンドポイントを使用する] を選択します。

    Fabric のストリーミング イベントを取り込み、変換、およびルーティングするためのフローを設計する画面のスクリーンショット。カスタム エンドポイントを使用するオプションが表示されています。

  5. カスタム エンドポイントの [ ソースの追加] ダイアログで、[ 追加] を選択します。

    Microsoft Fabric のカスタム エンドポイントの [ソースの追加] ダイアログのスクリーンショット。上部にカスタム エンドポイント矢印 WorkordersEventstream がある階層リンク ナビゲーションが表示されています。ダイアログには、CustomEndpoint-Source というテキストを含む赤いアスタリスクが必須としてマークされたソース名フィールドが含まれています。ダイアログの右下隅にティール [追加] ボタンが強調表示され、それ以上の操作は必要なく選択する必要があることを示します。

    これで eventstream が作成されました。 次に、イベントハウスを宛先として追加します。

  6. eventstream デザイナーの WorkordersEventstream ノードで、イベントを変換または変換先を追加 ドロップダウンリストから Eventhouse を選択します。

    CustomEndpoint-Source が WorkordersEventstream ノードに接続されているフローダイアグラムを示す Microsoft Fabric イベントストリーム デザイナーのスクリーンショット。右側の [イベントの変換] または [変換先の追加] タイルからドロップダウン メニューが展開され、下部に [Destinations] セクションが表示され、Eventhouse を含むいくつかのオプションが表示されます。このオプションは、選択する必要があることを示す赤い四角形で強調表示されています。

  7. 画面の右側に [Eventhouse destination configuration]\(Eventhouse 変換先の構成 \) ウィンドウが表示されます。 次のように要求された詳細を入力し、[保存] を選択 します

    1. データ インジェスト モード: インジェスト前のイベント処理に設定します。
    2. 宛先名: WorkordersEventhouse に設定します。
    3. ワークスペース: ワークスペースの名前を示すドロップダウン。
    4. Eventhouse: [ 新規作成] を選択し、 WorkordersEventhouse という名前のイベントハウスを作成します
    5. KQL データベース: WorkordersEventhouse を選択します。
    6. KQL 変換先テーブル: [ 新しい作成 ] リンクを選択し、 Workorders という名前の新しいテーブルを作成します。
    7. 入力データ形式: Json を選択 します
    8. データ ソースを追加した後にインジェストをアクティブ化する: チェック ボックスをオンにします。

    Eventhouseの宛先構成ペインのスクリーンショットには、データインジェストモードが

  8. イベントハウスが宛先として追加されたら、[ 発行 ] を選択して新しいイベントストリームを発行します。

    CustomEndpoint-Workorders ソースが Workorders-stream ノードに接続し、さらに WorkordersEventhouse 変換先に接続するフローを示す Eventstream デザイナーのスクリーンショットです。ツールバーの右上隅で [発行] ボタンが強調表示されています。編集モードのバナーは、発行されると変更が即座に反映されることを示しています。

必要な SAS キー認証キーを取得する

ノートブック コードの SAS キー認証セクションのイベント ハブ名接続文字列の主キー値が必要です。

  1. 追加したカスタム エンドポイント ソース タイルを選択します。

  2. [詳細] ウィンドウで、[SAS キー認証] を選択します。

  3. 次の 2 つの値をコピーし、ノートブック コードで使用するために保存します。

    • イベント ハブ名: EVENT_HUB_NAME 変数に使用されます。
    • 接続文字列-主キー: CONNECTION_STR 変数に使用されます。

    詳細ウィンドウで [SAS キー認証] オプションが選択されている Eventstream デザイナーを示すスクリーンショット。このチュートリアルの後の手順のノートブック コードで使用されるイベント ハブ名と接続文字列の主キー フィールドが強調表示されています。

ノートブックを使用してリアルタイム インジェストをシミュレートする

このセクションでは、先ほど作成した lakehouse に接続されたノートブックを作成し、提供されたコードを使用して CSV データを読み取り、イベントストリームにイベントを送信します。 これにより、リアルタイムのデータ インジェストがシミュレートされます。デモの場合は、ノートブックを手動で実行するか、定期的に実行するようにスケジュールできます。

Fabric ワークスペースにノートブックを作成する

作業指示場所ファイルを lakehouse から前のセクションで作成したイベントストリームにインポートするコードを含むノートブックを作成します。 これは、運用環境では静的ではなくストリーミングされるリアルタイム ストリーミング ソースをシミュレートします。

  1. ワークスペースから [ 新しい項目] を選択し、検索ボックスに ノートブック を入力します。

  2. [ノートブック] を選択します。

    テキスト ノートブックを含む検索ボックスを含む Microsoft Fabric の [新しいアイテム] ダイアログのスクリーンショット。検索結果には、ドキュメント アイコン付きの [ノートブック] タイルが表示され、説明「データを探索して機械学習モデルを構築するノートブックを作成する」が表示されます。[ノートブック] オプションが強調表示され、新しいノートブック項目を作成するために選択できることを示します。

  3. [新しいノートブック] ダイアログで、[名前] フィールドに「WorkorderLocations」と入力し、[作成] を選択します。

  4. ノートブックを lakehouse に接続するには、[データ項目の追加] ドロップダウン リストから [OneLake カタログから] を選択します。

    Microsoft Fabric Explorer ペインのスクリーンショットで、[データ項目] タブが選択されており、[データ ソースが追加されていません] のメッセージと空のフォルダー アイコンが表示されています。メッセージの下には、[データ項目の追加] ドロップダウン ボタンが展開され、3 つのメニュー オプションが表示されています: [OneLake カタログから](データベース アイコン付き)、[リアルタイム ハブから](稲妻アイコン付き)、および [新しいレイクハウス](プラス記号付き)。[OneLake カタログから] オプションは、選択を示す太い境界線で強調表示されています。

  5. OneLake カタログから WorkorderLocationsLakehouse を選択し、[接続] ボタンを選択します。 これは、 に作成したレイクハウスです。

  6. ノートブックを作成して Lakehouse に接続したら、最初のセルに次のコードを貼り付けて実行し、 Azure Event Hub SDK をインストールします。

    # Install Azure Event Hub SDK (only needed once per environment)
    %pip install azure-eventhub
    
  7. [ + コード ] を選択して、ノートブックに新しいセルを作成します。

    2 行の Python コードを含むコード セルを示す Microsoft Fabric ノートブック インターフェイスのスクリーンショット。1 行目には、「環境ごとに 1 回だけ必要な Azure Event Hub SDK のインストール」というコメントが含まれています。2 行目は、pip install コマンドの pip install azure-eventhub を示しています。コード セルの下に、赤い四角形で強調表示されたプラスコード ボタンを指す [コード の追加] セルがヒントに表示されます。右にプラスマークダウンボタンが表示されます。右上隅には、選択したカーネルとして PySpark Python が表示されます。

  8. 新しいセルを選択し、次のコードを入力します。

    from azure.eventhub import EventHubProducerClient, EventData
    import pandas as pd
    import json
    import time
    
    # Replace with your actual connection string and Event Hub name
    CONNECTION_STR = "" # Connection string-primary key
    EVENT_HUB_NAME = "" # Event hub name
    producer = EventHubProducerClient.from_connection_string(conn_str=CONNECTION_STR, eventhub_name=EVENT_HUB_NAME)
    
    df = spark.read.csv("Files/WorkorderLocations.csv", header=True, inferSchema=True)
    pdf = df.toPandas()
    total_records = len(pdf)
    
    for index, row in pdf.iterrows():
        # Convert row to dictionary
        row_dict = row.to_dict()
    
        # Truncate coordinates to 5 decimal digits
        if 'lat' in row_dict:
            row_dict['Latitude'] = round(float(row_dict['Latitude']), 5)
        if 'lon' in row_dict:
            row_dict['Longitude'] = round(float(row_dict['Longitude']), 5)
    
        # Serialize to JSON
        payload = json.dumps(row_dict)
    
        # Send to Event Hub
        event_data = EventData(payload)
        with producer:
            producer.send_batch([event_data])
    
        # Wait 100ms
        time.sleep(0.1)
    
  9. 前のセクションの「必要な SAS キー認証キーを取得する」というタイトルで取得した変数CONNECTION_STRとEVENT_HUB_NAMEの値を追加します。

  10. ノートブック コードを実行します。 これにより、Workorders テーブルが WorkordersEventhouse イベントハウスの KQL データベースに作成されます。

[データ プレビュー] タブが選択されている Workorders テーブルが表示されている Microsoft Fabric Eventhouse インターフェイスのスクリーンショット。左側のナビゲーション パネルには、WorkordersEventhouse が展開された KQL データベース ツリーが表示されます。このツリーには、Workorders テーブルが選択されたテーブルが含まれています。

Kusto 関数を作成し、マップ レイヤーとして追加する

このセクションでは、イベントハウスの Workorders テーブルから現在の作業指示場所データを取得し、その関数を Fabric Maps マップのデータ ソースとして使用する Kusto 関数を作成します。 この関数を使用すると、マップでアクティブな作業指示をレイヤーとして表示でき、計画してフィールド クルーに割り当てる必要があるジョブを視覚的に表示できます。

Kusto 関数を作成する

あなたの eventhouse (KQL データベース) からのデータ:

  1. イベントハウスに関連付けられている KQL データベース を開きます。

  2. [ 関数 ]、[ 新しい関数] の順に選択します。

    WorkordersEventhouse データベース インターフェイスの Functions セクションを示すスクリーンショット。重なり合う四角形を含む大きな円形アイコンを含む空の状態が表示されています。メインの見出しは

    これにより、実行時に WorkordersFunction という名前の新しい関数が作成されるクエリが作成されます。

  3. 次のように入力します。

    .create-or-alter function WorkordersFunction()
    {
        Workorders
        | project Latitude, Longitude, WorkorderID
    }
    
  4. クエリを実行する

    WorkordersFunction という名前の新しい Kusto 関数が作成されている Functions セクションを表示する Microsoft Fabric Eventhouse インターフェイスのスクリーンショット。左側のサイドバーには、Functions フォルダーが選択されたナビゲーション ツリーが表示されます。メイン エディター パネルには、KQL クエリ コード (.create-or-alter function WorkordersFunction() { Workorders | project Latitude, Longitude, WorkorderID } が表示されます。上部のツール バーに [実行] ボタンが表示され、関数作成クエリを実行する準備が整います。この手順では、マップの視覚化で使用するために作業指示書データから顧客座標を抽出する再利用可能なデータ ソースを確立します。

    1 & 2 - WorkordersFunction 関数の作成に使用される KQL クエリ。

    3 - 新しく作成された WorkordersFunction 関数

  5. Functions フォルダーで WorkordersFunction を選択し、 結果をプレビュー して、有効な場所フィールドを持つ作業指示書レコードが返されることを確認します。

    プレビュー テーブルに結果が表示された WorkordersFunction Kusto 関数を示す Microsoft Fabric Eventhouse インターフェイスのスクリーンショット。左側のサイドバーには、新しく作成された WorkordersFunction を示す Functions フォルダーが選択されたデータベース ナビゲーション ツリーが表示されます。メイン パネルには、KQL クエリ コード .create-or-alter function WorkordersFunction() { Workorders | project Latitude, Longitude, WorkorderID } が含まれています。クエリ エディターの下の [プレビュー結果] セクションには、緯度、経度、および WorkorderID の列を含むデータ テーブルが表示されます。このテーブルには、ウィーン、オーストリア地域 (北緯度約 48 度、東経度 16 度) の座標値を持つ 9 つの作業指示レコードが含まれています。複数の有効な位置レコードが存在すると、関数はマップの視覚化のために Workorders テーブルから顧客座標を正常に抽出できます。

この関数は、ファブリック マップ マップ データ レイヤーの再利用可能なデータ ソースとして機能します。これについては、次のセクションで説明します。

マップを作成し、関数をレイヤーとして追加する

このセクションでは、ファブリック マップ マップを作成し、以前に作成した KQL 関数をデータ レイヤーとして使用します。 マップは更新間隔で構成され、ストリーミング作業指示書データが自動的に更新され、アクティブな作業指示のほぼリアルタイムの空間ビューが提供されます。 次に、レイヤーの名前を変更し、その設定を調整して、マップ上でのデータの表示方法を制御します。 このライブ地理空間コンテキストは、ディスパッチャーがフィールド アクティビティを監視し、サービス エリア全体の需要を評価し、より情報に基づいたルーティングと割り当ての決定を行うのに役立ちます。

新しいマップの作成

  1. ワークスペースから [ 新しい項目] を選択します。
  2. [ 新しい項目 ] パネルで、検索フィールドに 「マップ 」と入力し、[ マップ] を選択します。
  3. [新しいマップ] ダイアログで、[名前] フィールドに「WorkordersMap」と入力し、[作成] を選択します。

マップに eventhouse を追加する

  1. [エクスプローラー] ウィンドウで、[Fabric アイテム] を選択し、[追加] ボタンを選択します。

  2. [追加] ボタンを選択したときに表示されるメニューから KQL データベースを選択します。

    左側の [エクスプローラー] ウィンドウと [Fabric アイテム] タブと [外部ソース] タブが表示された Microsoft Fabric Maps インターフェイスを示すスクリーンショット。[ファブリック項目] タブが選択され、その下に追加ボタンが表示され、その下にドロップダウン メニューが表示され、[追加] ボタンを選択した後に表示されます。KQL データベースが選択されています。メインエリアには、マップエリアにデフォルトのワールドマップが表示されます。

  3. OneLake カタログから、前に作成したイベントハウス WorkordersEventhouse を選択し、[追加] を選択します。

ヒント

KQL データベースにアクセスを制限する保護されたラベルがあるなどのエラーが発生した場合。サポートについては、データベース所有者にお問い合わせください。アクセスが制限される可能性があるため、KQL データベースの秘密度ラベルを確認します。 詳細については、「 ファブリック項目に秘密度ラベルを適用する」を参照してください。

マップに関数を表示する

  1. 新しいマップの [エクスプローラー ] ウィンドウで、前の手順で追加した eventhouse WorkordersEventhouse を選択します。

  2. KQL 関数 WorkordersFunction に移動し、省略記号 (...) を選択してポップアップ メニューを表示します。

  3. ポップアップ メニューから [マップに表示 ] を選択します。

    KQL データベース セクションが展開された階層ツリー構造が表示されている Microsoft Fabric Maps Explorer パネルのスクリーンショット。このツリーには、テーブルと WorkordersFunction 関数 Workorders-Event 含まれる WorkordersEventhouse が表示されます。WorkordersFunction の横にある省略記号メニューが開き、赤い四角形の枠線で強調表示された [マップ上に表示] などのオプションが表示されます。

  4. [ マップ上の Eventhouse データの表示 ] ダイアログが表示され、[ プレビュー データ ] が選択されています。 変更の必要はありません。 正しいことを確認し、[次へ] を選択します

    左側の 3 つの手順を示す Microsoft Fabric の [マップ上の Eventhouse データの表示] ダイアログのスクリーンショット。緑色のチェックマークが付いたデータのプレビュー、ジオメトリの設定、データの更新間隔、マップの確認と追加。メイン パネルには、時間の経過に伴う空間データの視覚化がマップに表示され、ドロップダウンが表示され、WorkordersFunction に設定された視覚化する KQL クエリを選択します。以下は、緯度、経度、および WorkorderID の列を含むクエリ結果プレビュー テーブルで、ウィーン オーストリア地域の座標を持つ 9 つの作業指示レコードを示しています。[戻る] ボタンと [次へ] ボタンが右下に表示されます。

  5. [ ジオメトリとデータ更新間隔の設定 ] ステップで、フィールドを次のように設定し、[ 次へ] を選択します。

    • データ レイヤー名: WorkordersFunction

    • Geometry 列の場所: 緯度と経度のデータは別々の列に配置されている

    • 緯度列: 緯度

    • 経度列: 経度

    • データ更新間隔: 5 分

      Microsoft Fabric ダイアログ「マップ上の Eventhouse データの表示」のスクリーンショット。これは[ジオメトリの設定]と[データ更新間隔]の構成ステップを示しています。左側のサイドバーには、3 つのワークフロー ステップが表示され、プレビュー データが完了し、[ジオメトリの設定]と[データ更新間隔]が現在アクティブであることを示すチェックマークが付いています。メイン パネルには、[名前] フィールドに WorkordersFunction を含むデータ レイヤー セクションと、3 つのドロップダウンがある[Geometry]データ列セクションがあります。[ジオメトリ] 列の位置は、緯度と経度のデータが個別の列に配置される設定になっており、緯度列が[緯度]に、経度列が[経度]に設定されています。その下に、[データ更新] セクションがあり、[データ更新間隔] ドロップダウンは5分に設定されています。右下隅には[戻る]ボタンと[次へ]ボタンが表示されます。

  6. [ 確認してマップに追加] ステップで、設定を確認し、[ マップに追加] を選択します。

    Microsoft Fabricの「Eventhouseデータをマップに表示」ダイアログのスクリーンショットで、設定フローの最終的な「レビューとマップに追加」ステップを示しています。左側のサイドバーには、3つの連続したワークフローステップが表示され、「データのプレビュー」と「ジオメトリの設定およびデータ更新間隔」が緑のチェックマークで完了し、現在アクティブな「レビューとマップに追加」が青いドットで示されています。メインパネルには、設定の概要が表示されます。「データソース」セクションには、KQLデータベースが「WorkordersEventhouse」、クエリセットが「WorkordersFunction」として一覧表示されています。「データレイヤー」セクションには、「WorkordersFunction」というレイヤー名が必須として赤いアスタリスクで示されています。「ジオメトリデータ列」セクション内では、3つの必須フィールドが赤いアスタリスクで表示されており、「ジオメトリ列」は「緯度および経度データが個別の列に配置」と設定されています。緯度列は「緯度」に、経度列は「経度」に設定されています。「データ更新」セクションでは、更新間隔が5分に設定されており、これも必須であることが示されています。ダイアログのフッターには、「戻る」ボタンと「マップに追加」ボタンが右下に配置されており、「マップに追加」ボタンは強調表示されて、イベントハウスデータレイヤーをマップに追加する準備が整いました。

これで、関数の結果が更新されたマップに表示されます。

作業指示の場所を示す赤い円形マーカーが付いたオーストリアのウィーンのマップを表示する Microsoft Fabric Maps インターフェイスを示すスクリーンショット。左側の [エクスプローラー] ウィンドウには、WorkordersEventhouse エントリと WorkordersFunction エントリを含む KQL データベース ツリーが表示されます。マップの左上にある [データ レイヤー] パネルには、表示/非表示の切り替えとオプション メニューが表示された WorkordersFunction レイヤーが表示されます。

Azure Maps Route Directions API を使用して最適化されたマルチストップ ルートを生成する

このセクションでは、KQL データベースから作業指示書座標を取得し、 Azure Maps Route Directions REST API を呼び出す新しいノートブックを作成します。 サービスのマルチストップ最適化機能を有効にして、各場所にアクセスするための最も効率的な順序を決定し、その最適化されたシーケンスでルート ジオメトリを返します。 この出力は、後で推奨される技術者ルートをマップ上で視覚化するために使用されます。

このセクションを完了するには、Azure Maps アカウントとサブスクリプション キーを持つ Azure アカウントが必要です。 Azure アカウントをお持ちでない場合は、開始する前に 無料アカウント を作成してください。 Azure Maps アカウントの作成の詳細については、「Azure Maps アカウント の作成」を参照してください。 Azure Maps サブスクリプション キーの取得の詳細については、Azure Maps クイック スタート の「アカウントのサブスクリプション キーを取得 する」を参照してください。

最適なルートを取得するノートブックを Fabric ワークスペースに作成する

  1. ワークスペース内から、前に作成した eventhouse WorkordersEventhouse を開きます。

  2. KQL データベースの下の左側のナビゲーション パネルで、WorkordersEventhouse を選択します。

  3. 上部のメニュー バーに Notebook のオプションが表示されます。 それを選択して新しいノートブックを作成します。

    KQL データベースの下の左側のナビゲーション パネルで選択された WorkordersEventhouse データベースを示す Microsoft Fabric Eventhouse インターフェイスのスクリーンショット。上部のメニュー バーには、選択する項目であることを示す赤いボックスで強調表示されている Notebook など、いくつかのオプションが表示されます。メイン パネルには、インジェストとクエリ統計を含むデータ アクティビティ トラッカーが表示されます。

  4. 新しいノートブックで、 kustoUri 変数の値を保存します。 この値は、手順 6 で作成した新しいノートブック コードで使用します。

  5. [データ項目の追加] ドロップダウン リストから [OneLake カタログから] を選択して、ノートブックを WorkorderLocationsLakehouse に接続します。

    PySpark Python コードを含むコード セルを示す Microsoft Fabric ノートブック インターフェイスのスクリーンショット。左側のパネルには、[データ項目の追加] ボタンが赤いボックスで強調表示された [データ ソースが追加されていません] と表示されます。メイン コード領域は、KustoQuery が Workorders に設定された変数 kustoQuery、Fabric Microsoft URL を含む kustoUri、および WorkordersEventhouse に設定されたデータベースを含む KustoUri からデータを読み取るためのクエリの例を示しています。kustoUri は赤いボックスで強調表示され、このチュートリアルで提供されるノートブック コードで値をコピーして使用する必要があることを示します。

    Microsoft Fabric で Lakehouse を作成すると、同じ名前の SQL 分析エンドポイントが自動的に作成されます。

    どちらの項目もワークスペースに表示されますが、目的は異なります。

    • Lakehouse は、ノートブック、Spark 処理、およびデータ インジェストに使用されます。
    • SQL 分析エンドポイントは、Lakehouse データに対する読み取り専用の T-SQL クエリ サーフェスです。

    ノートブックをアタッチまたは作成するときは、SQL 分析エンドポイントではなく 、必ず Lakehouse を選択してください。 OneLake カタログに WorkorderLocationsLakehouse が 2 回表示される場合Lakehouse でフィルター処理します。

  6. 新しいノートブックが作成され、Lakehouse に接続されたら、ノートブックの 2 番目のセルに次のコードを入力し、既定のコードを置き換えてから、前の手順で保存した変数値を追加します。

    import os, json, requests
    from pyspark.sql import types as T
    from pyspark.sql.functions import col
    
    # ---- Configuration ----
    AZMAPS_SUBSCRIPTION_KEY = os.environ.get(
        'AZMAPS_SUBSCRIPTION_KEY',
        '<Your Azure Maps subscription key>'
    )
    API_VERSION = '2025-01-01'
    BASE_URL    = 'https://atlas.microsoft.com'
    
    # KQL query that invokes the stored function
    kustoQuery = """WorkordersFunction()"""
    # Your Kusto URI
    kustoUri = "" 
    # Your KQL database name
    database = "WorkordersEventhouse" 
    
    # The access credentials.
    accessToken = mssparkutils.credentials.getToken(kustoUri)
    kustoDf  = spark.read\
        .format("com.microsoft.kusto.spark.synapse.datasource")\
        .option("accessToken", accessToken)\
        .option("kustoCluster", kustoUri)\
        .option("kustoDatabase", database)\
        .option("kustoQuery", kustoQuery).load()
    
    # Write transformed response to a new file so the raw output is preserved
    OUTPUT_GEOJSON_PATH_TRANSFORMED = (
        'Files/OptimizedRoute.geojson' # GeoJSON output file 
    )
    
    # ---- Read Stores from KQL database table ----
    stores_df  = spark.read\
        .format("com.microsoft.kusto.spark.synapse.datasource")\
        .option("accessToken", accessToken)\
        .option("kustoCluster", kustoUri)\
        .option("kustoDatabase", database)\
        .option("kustoQuery", kustoQuery).load()\
        .select(
                    col("WorkorderID").alias("workorder_id"),
                    col("Latitude").alias("lat"),
                    col("Longitude").alias("lon")
                )
    
    # Ordered waypoints: origin first, then the rest by workorder_id
    # (API will re-order when optimizeWaypointOrder=True)
    stores_pd = stores_df.orderBy('workorder_id').toPandas()
    waypoints_lonlat = [[float(r['lon']), float(r['lat'])] for _, r in stores_pd.iterrows()]
    
    # ---- Build Directions request body (GeoJSON) ----
    features = []
    for idx, (lon, lat) in enumerate(waypoints_lonlat):
        features.append({
            "type": "Feature",
            "geometry": {"type": "Point", "coordinates": [lon, lat]},
            "properties": {"pointIndex": idx, "pointType": "waypoint"}
        })
    
    dir_body = {
        "type": "FeatureCollection",
        "features": features,
        "optimizeRoute": "fastestWithTraffic",
        "routeOutputOptions": ["routePath"],  # ensures route path geometry in response
        "travelMode": "truck",
        "optimizeWaypointOrder": True
    }
    
    # ---- Call Azure Maps Directions (POST) ----
    url     = f"{BASE_URL}/route/directions"
    params  = {"api-version": API_VERSION}
    headers = {
        "Accept": "application/geo+json",
        "Content-Type": "application/geo+json",
        "subscription-key": AZMAPS_SUBSCRIPTION_KEY
    }
    
    resp = requests.post(url, params=params, data=json.dumps(dir_body), headers=headers)
    resp.raise_for_status()
    resp_json = resp.json()  # exact payload as returned by the API
    
    # ---- Transform: move order.optimizedIndex -> properties.optimizedIndex for all Waypoint features to add as a data label in the map----
    for feat in resp_json.get("features", []):
        props = feat.get("properties") or {}
        if props.get("type") == "Waypoint":
            order = props.get("order") or {}
            opt_idx = order.pop("optimizedIndex", None)
            if opt_idx is not None:
                props["optimizedIndex"] = opt_idx + 1
            # reassign possibly-updated order (still contains inputIndex if present)
            props["order"] = order
            feat["properties"] = props
    
    # ---- Write transformed GeoJSON ----
    from notebookutils import mssparkutils
    mssparkutils.fs.put(OUTPUT_GEOJSON_PATH_TRANSFORMED, json.dumps(resp_json), True)
    
    print(f"Transformed Directions GeoJSON (waypoints carry properties.optimizedIndex) written to {OUTPUT_GEOJSON_PATH_TRANSFORMED}")
    
  7. AZMAPS_SUBSCRIPTION_KEY 変数の ノートブック コードに Azure Maps サブスクリプション キーを入力し、"< Azure Maps サブスクリプション キー>" を Azure Maps サブスクリプション キーに置き換えます。

    Important

    この例では、わかりやすくするために Azure Maps サブスクリプション キーをハードコーディングします。 運用環境ではシークレットをハードコーディングしないでください。 Azure Key Vault を使用してシークレットを安全に格納および管理し、実行時に参照します。 詳細については、「シークレットを 保護するためのベスト プラクティス」を参照してください。

  8. メニューの [ 名前を付けて保存] ボタンを選択し、ノートブックを OptimizeRoute として保存します。

  9. ノートブックを実行して、Lakehouse の Files ディレクトリに OptimizedRoute.geojson ファイルを作成します。

    ルート データを取得して GeoJSON ファイルを書き込む Python コードを含む右側のノートブック コード セルを示す Microsoft Fabric インターフェイスのスクリーンショット。左側の [エクスプローラー] ウィンドウには、テーブルフォルダーとファイル フォルダーが表示された OneLake と WorkorderLocation が展開されています。[ファイル] フォルダーには、WorkorderLocations.csv と OptimizedRoute.geojson が含まれており、新しく作成された出力ファイルを示す赤いボックスが強調表示されています。中央の [ファイル] パネルには、OptimizedRoute.geojson も強調表示されている両方のファイルが表示されます。下部のノートブック出力には、Transformed Directions GeoJSON ウェイポイントにプロパティが含まれるという成功メッセージが表示されます。

マップに lakehouse を追加する

  1. [エクスプローラー] ウィンドウで、[Fabric アイテム] を選択し、[追加] ボタンを選択します。
  2. [追加] ボタンを選択したときに表示されるメニューから [Lakehouse] を選択します。
  3. OneLake カタログから、前に作成した lakehouse WorkorderLocationsLakehouse を選択し、[追加] を選択します。

最適化されたルートをマップに表示する

  1. 新しいマップの [エクスプローラー ] ウィンドウで、前の手順で追加した lakehouse WorkorderLocationsLakehouse を選択します。

  2. Lakehouse の Files ディレクトリで OptimizedRoute.geojson に移動し、省略記号 (...) を選択してポップアップ メニューを表示します。

  3. ポップアップ メニューから [マップに表示 ] を選択します。

    WorkorderLocationsLakehouse が展開された状態で選択された [Lakehouse] タブを示す [Microsoft Fabric Maps Explorer] パネルのスクリーンショット。Files フォルダーには、OptimizedRoute.geojson ファイルと WorkorderLocations.csv ファイルが含まれています。OptimizedRoute.geojson の横にコンテキスト メニューが開き、赤い四角形で強調表示された [マップに表示] などのオプションが表示されます。[データ レイヤー] パネルには、WorkordersFunction が既存のレイヤーとして表示され、表示切り替えが表示されます。

  4. [データ レイヤー] パネルで、WorkordersFunction レイヤーの表示をオフに切り替えます。

完了すると、ファブリック マップ マップに新しいマップ レイヤーが表示されます。

9 つの番号付きウェイポイントを結ぶ青い線として表示された最適化されたルートを持つウィーン オーストリアのストリート マップを表示する Microsoft Fabric Maps のスクリーンショット。左側の [エクスプローラー] ウィンドウには、OptimizedRoute.geojson と WorkorderLocations.csv ファイルを含む Files フォルダーが含まれる WorkorderLocationsLakehouse で展開された [Lakehouse] タブが表示されます。[データ レイヤー] パネルには、可視性がオフになっている WorkordersFunction と、最適化された訪問シーケンスを示す 1 から 9 までの番号が付いた接続されたルート パスを示す OptimizedRoute という 2 つのレイヤーが表示されます。

マップ レイヤーの設定

Fabric Maps には、マップ上でのデータの表示方法を制御できるさまざまなレイヤー設定が用意されています。 このセクションでは、レイヤーの名前を変更し、シンボル スタイルを調整し、フィールド値に基づいてラベルを構成することで、ルート最適化プロセスから作成されたレイヤーをカスタマイズします。 これらの設定は、読みやすさを向上させ、作業指示書データを一目で簡単に解釈するのに役立ちます。

レイヤーの名前を変更する

  1. [データ レイヤー] パネルで、省略記号 (...) を選択して [OptimizedRoute オプション] メニューを開きます。

  2. オプション メニューで[ 名前の変更]を選択します。

    2 つのレイヤー WorkordersFunction と OptimizedRoute を示す Microsoft Fabric Maps データ レイヤー パネルのスクリーンショット。OptimizedRoute レイヤーのオプション メニューが展開され、赤い四角形が強調表示され、[名前の変更] オプションが強調表示されています。表示されるその他のメニュー オプションには、[拡大/縮小]、[複製]、[削除] があります。パネルは、ウィーンオーストリアエリアを示すストリートマップの背景の上に表示されます。

マップ レベルでラベルを削除する

マップ レベルでラベルのオンとオフを切り替えると、ベースマップ テキスト ラベルに影響します。 これらのラベルは、基になるマップ スタイルから取得され、次のものが含まれます。

  • 市区町村名
  • 国と地域の名前
  • 道路名と高速道路名
  • 水の特徴名 (河川、湖、海)
  • その他の管理地名または地理的地名

ラベルが表示されない場合、ベースマップはクリーンかつミニマルな外観になり、地名テキストはベースマップ上に表示されません。

ベースマップ ラベルをオフにするには:

  1. Fabric Maps でマップを開きます。

  2. メニュー バーから [マップ設定 ] を選択します。

  3. ラベル チェックボックスを見つけて、チェックを解除します。

    複数のウェイポイントを結ぶ紫色のルート線を持つウィーン オーストリアのストリート マップを表示する Microsoft Fabric Maps インターフェイスを示すスクリーンショット。左側には、[エクスプローラー] ウィンドウと[データ レイヤー] パネルが表示され、WorkordersFunction レイヤーと最適化されたルート レイヤーが一覧表示されます。上部のツール バーでは、[マップの設定] ボタンが赤い四角形で強調表示されています。右側には、[ラベル] チェックボックスがオフで赤い四角形で強調表示された [ベースマップ] 設定パネルが表示されます。

ファブリック マップのマップ設定の詳細については、「マップ設定の変更」を参照してください。

レイヤーにデータ ラベルを追加する

データ ラベルは、レイヤーのデータセット内の 1 つ以上のフィールドから取得されるデータドリブン注釈です。 これらは、作業指示の場所を表すマップ上のポイントなど、レイヤー レベルのマップ フィーチャに直接関連付けられています。 Fabric Maps データ ラベルの詳細については、「 データ ラベルの設定」を参照してください。

  1. [データ レイヤー] パネルで [最適化されたルート] を選択します。 最適化 されたルート 設定パネルが画面の右側に表示されます。

  2. [最適化されたルート設定] パネルで、[データ ラベルの設定>選択します。

  3. [ データ ラベルを有効にする] トグルを選択して、データ ラベルを有効にします。 その他のデータ ラベル設定が表示されます。

  4. 次のデータ ラベル設定を変更します。

    • データ ラベル: オプティマイズドインデックス
    • テキストの色: 白
    • テキスト サイズ スライダーを 20 に設定
    • テキスト ストロークの色: 黒
    • テキスト ストローク幅 スライダーを 2 に設定

    Microsoft Fabric Maps のスクリーンショットで、右側に [データ ラベルの設定] パネルが展開され、[データ ラベルを有効にする] がオン、データ ラベルドロップダウンが optimizedIndex に設定され、テキストの色は白のカラー ピッカーが表示され、テキスト サイズ スライダーが 20、テキスト ストロークの色が黒、テキスト ストロークの幅スライダーが 2 に設定されていることを示しています。メインマップエリアには、オーストリアのウィーンのストリートマップが表示され、1から9のラベルが付いた番号付きのウェイポイントを結ぶ紫色のルートラインが表示されており、訪問順序が最適化されています。左側の [データ レイヤー] パネルでは、WorkordersFunction の表示が非表示で、[Optimized Route] がアクティブレイヤーとして表示されています。

概要

このチュートリアルでは、Microsoft Fabric Real-Time Intelligence と Fabric Maps を使用して、エンドツーエンドのリアルタイムの作業指示ルーティング シナリオを構築する方法について説明しました。 ストリーミング作業指示書データは、KQL を使用して取り込み、変換、クエリを実行した後、マップ上で視覚化され、作業指示の場所の動的で継続的に更新されるビューが作成されます。 ルーティング ロジックと最適なパス計算を統合することで、このソリューションは、リアルタイムの地理空間分析がディスパッチャーとフィールド運用チームが、より迅速かつ適切な情報に基づく意思決定を行うのにどのように役立つかを示します。

このパターンは、フリート追跡、資産監視、インシデント対応など、他の場所ベースのシナリオに拡張できます。 Microsoft Fabric では、イベントドリブン データ、KQL ベースの分析、マップベースの視覚化を組み合わせることで、生ストリーミング データから実用的な地理的分析情報にほぼリアルタイムで移行できます。

次のステップ

このチュートリアルで取り上げる Fabric Maps の記事の詳細については、以下を参照してください。