C# REST SDK 開発者ガイド

Azure Maps C# SDK では、アドレスの検索、異なる座標間のルーティング、特定の IP アドレスの地理的な場所の取得など、Azure Maps Rest API で使用できる機能がサポートされています。 この記事では、Azure Maps の機能が組み込まれた C# の位置情報認識アプリケーションの構築を開始するのに役立つ例を使用して C# REST SDK について説明します。

Note

Azure Maps C# SDK では、.NET Standard バージョン 2.0 以上と互換性がある任意の .NET バージョンがサポートされています。 対話型のテーブルについては、「.NET Standard バージョン」を参照してください。

前提条件

ヒント

Azure Maps アカウントはプログラムで作成できます。Azure CLI を使用した例を次に示します。

az maps account create --kind "Gen2" --account-name "myMapAccountName" --resource-group "<resource group>" --sku "G2"

.NET プロジェクトを作成する

次の PowerShell コード スニペットは、PowerShell を使用して .NET 7.0 でコンソール プログラム MapsDemo を作成する方法を示しています。 フレームワークとして任意の .NET Standard 2.0 互換バージョンを使用できます。

dotnet new console -lang C# -n MapsDemo -f net7.0 
cd MapsDemo 

必要なパッケージをインストールする

Azure Maps C# SDK を使用するには、必要なパッケージをインストールする必要があります。 検索、ルーティング、レンダリング、位置情報を含む各 Azure Maps サービスは、それぞれ独自のパッケージに含まれています。 Azure Maps C# SDK はパブリック プレビュー段階であるため、--prerelease フラグを追加する必要があります。

dotnet add package Azure.Maps.Rendering --prerelease
dotnet add package Azure.Maps.Routing --prerelease
dotnet add package Azure.Maps.Search --prerelease
dotnet add package Azure.Maps.Geolocation --prerelease

Azure Maps サービス

[サービス名] NuGet パッケージ サンプル
検索する Azure.Maps.Search 検索サンプル
ルーティング Azure.Maps.Routing  ルーティング サンプル
レンダリング Azure.Maps.Rendering レンダリング サンプル
位置情報 Azure.Maps.Geolocation 位置情報サンプル

MapsSearchClient の作成と認証

Azure Maps Search API へのアクセスに使用されるクライアント オブジェクトとして、Azure Maps サブスクリプション キーを使用して認証する際には AzureKeyCredential オブジェクトが必要であり、Microsoft Entra ID を使用して認証する際には TokenCredential オブジェクトと Azure Maps クライアント ID が必要です。 認証の詳細については、「Azure Maps による認証」を参照してください。

Microsoft Entra 資格情報の使用

Azure ID ライブラリを使用して、Microsoft Entra ID で認証することができます。 DefaultAzureCredential プロバイダーを使用するには、.NET 用の Azure ID クライアント ライブラリをインストールする必要があります。

dotnet add package Azure.Identity 

お使いのサービス プリンシパルに必要なロールを割り当てて、新しい Microsoft Entra アプリケーションを登録するとともに Azure Maps へのアクセス権を許可する必要があります。 詳細については、「Azure 以外のリソースでデーモンをホストする」を参照してください。 アプリケーション (クライアント) ID、ディレクトリ (テナント) ID、クライアント シークレットが返されます。 これらの値をコピーし、安全な場所に保存します。 これらは、次の手順で必要になります。

次のように、お使いの Microsoft Entra アプリケーションのアプリケーション (クライアント) ID、ディレクトリ (テナント) ID、クライアント シークレット、さらに Map リソースのクライアント ID の値を環境変数として設定します。

環境変数 説明
AZURE_CLIENT_ID 登録したアプリケーションのアプリケーション (クライアント) ID
AZURE_CLIENT_SECRET 登録したアプリケーションのクライアント シークレットの値
AZURE_TENANT_ID 登録したアプリケーションのディレクトリ (テナント) ID
MAPS_CLIENT_ID Azure Map リソースのクライアント ID

次のように、PowerShell で環境変数を作成して、これらの値を保存できるようになりました。

$Env:AZURE_CLIENT_ID="Application (client) ID"
$Env:AZURE_CLIENT_SECRET="your client secret"
$Env:AZURE_TENANT_ID="your Directory (tenant) ID"
$Env:MAPS_CLIENT_ID="your Azure Maps client ID"

環境変数を設定した後、次のようにプログラムでこれらの変数を使用して AzureMapsSearch クライアントをインスタンス化できます。

using System;
using Azure.Identity; 
using Azure.Maps.Search; 

var credential = new DefaultAzureCredential(); 
var clientId = Environment.GetEnvironmentVariable("MAPS_CLIENT_ID"); 
var client = new MapsSearchClient(credential, clientId); 

重要

前のコード スニペットで作成されたその他の環境変数は、このコード サンプルでは使用されていませんが、DefaultAzureCredential() で必要になります。 同じ名前付け規則を使用してこれらの環境変数を正しく設定しないと、実行時エラーが発生します。 たとえば、AZURE_CLIENT_ID が見つからないか無効な場合は、InvalidAuthenticationTokenTenant エラーが発生します。

サブスクリプション キー資格情報の使用

Azure Maps サブスクリプション キーを使用して認証できます。 以下のスクリーンショットに示されているように、サブスクリプション キーは Azure Maps アカウントの [認証] セクションに表示されます。

Azure portal の Azure Maps サブスクリプション キーを示すスクリーンショット。

次のように、PowerShell で環境変数を作成して、サブスクリプション キーを保存できるようになりました。

$Env:SUBSCRIPTION_KEY="your subscription key"

環境変数を作成したら、次のようにコードでアクセスできます。

using System;
using Azure; 
using Azure.Maps.Search; 

// Use Azure Maps subscription key authentication 
var subscriptionKey = Environment.GetEnvironmentVariable("SUBSCRIPTION_KEY") ?? string.Empty;
var credential = new AzureKeyCredential(subscriptionKey);
var client = new MapsSearchClient(credential); 

住所をジオコーディングする

住所の座標を取得するには、GetGeocoding メソッドを呼び出します。

using System;
using Azure; 
using Azure.Maps.Search; 
using Azure.Maps.Search.Models;

// Use Azure Maps subscription key authentication 
var subscriptionKey = Environment.GetEnvironmentVariable("SUBSCRIPTION_KEY") ?? string.Empty;
var credential = new AzureKeyCredential(subscriptionKey);
var client = new MapsSearchClient(credential); 

Response<GeocodingResponse> searchResult = client.GetGeocoding(
    "1 Microsoft Way, Redmond, WA 98052");

for (int i = 0; i < searchResult.Value.Features.Count; i++)
{
    Console.WriteLine("Coordinate:" + string.Join(",", searchResult.Value.Features[i].Geometry.Coordinates));
}

住所のバッチ ジオコーディング

このサンプルでは、住所のバッチ検索を実行する方法を示します。

using System;
using Azure; 
using Azure.Maps.Search; 
using System.Collections.Generic;
using Azure.Maps.Search.Models;
using Azure.Maps.Search.Models.Queries;

// Use Azure Maps subscription key authentication 
var subscriptionKey = Environment.GetEnvironmentVariable("SUBSCRIPTION_KEY") ?? string.Empty;
var credential = new AzureKeyCredential(subscriptionKey);
var client = new MapsSearchClient(credential); 

List<GeocodingQuery> queries = new List<GeocodingQuery>
{
    new GeocodingQuery()
    {
        Query ="15171 NE 24th St, Redmond, WA 98052, United States"
    },
    new GeocodingQuery()
    {
        AddressLine = "400 Broad St"
    },
};
Response<GeocodingBatchResponse> results = client.GetGeocodingBatch(queries);

//Print coordinates
for (var i = 0; i < results.Value.BatchItems.Count; i++)
{
    for (var j = 0; j < results.Value.BatchItems[i].Features.Count; j++)
    {
        Console.WriteLine("Coordinates: " + string.Join(",", results.Value.BatchItems[i].Features[j].Geometry.Coordinates));
    }
}

座標の逆ジオコーディング

座標を人間が理解できる番地に変換できます。 このプロセスはリバース ジオコーディングとも呼ばれています。

using System;
using Azure; 
using Azure.Maps.Search; 
using Azure.Core.GeoJson;
using Azure.Maps.Search.Models;

// Use Azure Maps subscription key authentication 
var subscriptionKey = Environment.GetEnvironmentVariable("SUBSCRIPTION_KEY") ?? string.Empty;
var credential = new AzureKeyCredential(subscriptionKey);
var client = new MapsSearchClient(credential); 

GeoPosition coordinates = new GeoPosition(-122.138685, 47.6305637);
Response<GeocodingResponse> result = client.GetReverseGeocoding(coordinates);

//Print addresses
for (int i = 0; i < result.Value.Features.Count; i++)
{
    Console.WriteLine(result.Value.Features[i].Properties.Address.FormattedAddress);
}

座標セットを一括逆ジオコーディングする

Azure Maps Search には、いくつかのバッチ クエリ API も用意されています。 Reverse Geocoding Batch API は、単一の API 呼び出しを使用して、クエリのバッチを Reverse Geocoding API に送信します。 この API で、呼び出し元は最大 100 クエリをバッチ処理できます。

using System;
using Azure; 
using Azure.Maps.Search; 
using System.Collections.Generic;
using Azure.Core.GeoJson;
using Azure.Maps.Search.Models;
using Azure.Maps.Search.Models.Queries;

// Use Azure Maps subscription key authentication 
var subscriptionKey = Environment.GetEnvironmentVariable("SUBSCRIPTION_KEY") ?? string.Empty;
var credential = new AzureKeyCredential(subscriptionKey);
var client = new MapsSearchClient(credential);

List<ReverseGeocodingQuery> items = new List<ReverseGeocodingQuery>
{
    new ReverseGeocodingQuery()
    {
        Coordinates = new GeoPosition(-122.349309, 47.620498)
    },
    new ReverseGeocodingQuery()
    {
        Coordinates = new GeoPosition(-122.138679, 47.630356),
        ResultTypes = new List<ReverseGeocodingResultTypeEnum>(){ ReverseGeocodingResultTypeEnum.Address, ReverseGeocodingResultTypeEnum.Neighborhood }
    },
};
Response<GeocodingBatchResponse> result = client.GetReverseGeocodingBatch(items);
//Print addresses
for (var i = 0; i < result.Value.BatchItems.Count; i++)
{
    Console.WriteLine(result.Value.BatchItems[i].Features[0].Properties.Address.AddressLine);
    Console.WriteLine(result.Value.BatchItems[i].Features[0].Properties.Address.Neighborhood);
}

特定の場所のポリゴンを取得する

このサンプルでは、ポリゴンを検索する方法を示します。

using System;
using Azure; 
using Azure.Maps.Search; 
using Azure.Core.GeoJson;
using Azure.Maps.Search.Models;
using Azure.Maps.Search.Models.Options;

// Use Azure Maps subscription key authentication 
var subscriptionKey = Environment.GetEnvironmentVariable("SUBSCRIPTION_KEY") ?? string.Empty;
var credential = new AzureKeyCredential(subscriptionKey);
var client = new MapsSearchClient(credential);

GetPolygonOptions options = new GetPolygonOptions()
{
    Coordinates = new GeoPosition(-122.204141, 47.61256),
    ResultType = BoundaryResultTypeEnum.Locality,
    Resolution = ResolutionEnum.Small,
};
Response<Boundary> result = client.GetPolygon(options);

var count = ((GeoJsonPolygon)((GeoJsonGeometryCollection)result.Value.Geometry).Geometries[0]).Coordinates.Count;
for (var i = 0; i < count; i++)
{
    var coorCount = ((GeoJsonPolygon)((GeoJsonGeometryCollection)result.Value.Geometry).Geometries[0]).Coordinates[i].Count;
    for (var j = 0; j < coorCount; j++)
    {
        Console.WriteLine(string.Join(",",((GeoJsonPolygon)((GeoJsonGeometryCollection)result.Value.Geometry).Geometries[0]).Coordinates[i][j]));
    }
}

検索とレンダリングでの V1 SDK の使用

Search v1 の使用方法の詳細については、「.NET 用 Azure Maps Search クライアント ライブラリ」を参照してください。 Render v1 の使用方法の詳細については、「.NET 用Azure Maps Render クライアント ライブラリ」を参照してください。

追加情報

.NET ドキュメントの Azure.Maps 名前空間