azure-maps-search-dotnet
microsoft/skills
Intégrez les services de localisation d'Azure Maps dans vos applications .NET pour bénéficier de fonctionnalités de géocodage, de calcul d'itinéraires, de rendu, de géolocalisation et d'accès aux données météorologiques.
...Développer toutAzure Maps (.NET)
Le SDK Azure Maps pour .NET fournit des services basés sur la localisation : géocodage, calcul d'itinéraires, rendu, géolocalisation et météo.
Installation
# Recherche (géocodage, géocodage inversé)
dotnet add package Azure.Maps.Search --prerelease
# Calcul d'itinéraires (itinéraires, matrice d'itinéraires)
dotnet add package Azure.Maps.Routing --prerelease
# Rendu (tuiles de carte, images statiques)
dotnet add package Azure.Maps.Rendering --prerelease
# Géolocalisation (conversion d'une adresse IP en emplacement)
dotnet add package Azure.Maps.Geolocation --prerelease
# Météo
dotnet add package Azure.Maps.Weather --prerelease
# Gestion des ressources (gestion des comptes, jetons SAS)
dotnet add package Azure.ResourceManager.Maps --prerelease
# Requis pour l'authentification
dotnet add package Azure.Identity
Versions actuelles:
Azure.Maps.Search: v2.0.0-beta.5Azure.Maps.Routing: v1.0.0-beta.4Azure.Maps.Rendering: v2.0.0-beta.1Azure.Maps.Geolocation: v1.0.0-beta.3Azure.ResourceManager.Maps: v1.1.0-beta.2
Variables d'environnement
AZURE_MAPS_SUBSCRIPTION_KEY= # Requis uniquement pour l'authentification via AzureKeyCredential
AZURE_MAPS_CLIENT_ID= # Requis : ID client Azure Maps
AZURE_TOKEN_CREDENTIALS=prod # Requis uniquement si DefaultAzureCredential est utilisé en production
Authentification
Clé d’abonnement (clé partagée)
using Azure;
using Azure.Maps.Search;
var subscriptionKey = Environment.GetEnvironmentVariable("AZURE_MAPS_SUBSCRIPTION_KEY");
var credential = new AzureKeyCredential(subscriptionKey);
var client = new MapsSearchClient(credential);
Identifiants de jeton Microsoft Entra
using Azure.Identity;
using Azure.Maps.Search;
// Développement local : DefaultAzureCredential. En production : définissez AZURE_TOKEN_CREDENTIALS=prod ou AZURE_TOKEN_CREDENTIALS=
var credential = new DefaultAzureCredential(
DefaultAzureCredential.DefaultEnvironmentVariableName
);
// Ou utilisez directement des informations d'identification spécifiques en production :
// Voir https://learn.microsoft.com/dotnet/api/overview/azure/identity-readme?view=azure-dotnet#credential-classes
// var credential = new ManagedIdentityCredential();
var clientId = Environment.GetEnvironmentVariable("AZURE_MAPS_CLIENT_ID");
var client = new MapsSearchClient(credential, clientId);
Signature d’accès partagé (SAS)
using Azure;
using Azure.Core;
using Azure.Identity;
using Azure.ResourceManager;
using Azure.ResourceManager.Maps;
using Azure.ResourceManager.Maps.Models;
using Azure.Maps.Search;
// Authentification avec Azure Resource Manager
ArmClient armClient = new ArmClient(new DefaultAzureCredential());
// Récupération de la ressource de compte Maps
ResourceIdentifier mapsAccountResourceId = MapsAccountResource.CreateResourceIdentifier(
subscriptionId, resourceGroupName, accountName);
MapsAccountResource mapsAccount = armClient.GetMapsAccountResource(mapsAccountResourceId);
// Générer un jeton SAS
MapsAccountSasContent sasContent = new MapsAccountSasContent(
MapsSigningKey.PrimaryKey,
principalId,
maxRatePerSecond: 500,
start: DateTime.UtcNow.ToString("O"),
expiry: DateTime.UtcNow.AddDays(1).ToString("O"));
e de réponse sas = mapsAccount.GetSas(sasContent);
// Créer un client avec le jeton SAS
var sasCredential = new AzureSasCredential(sas.Value.AccountSasToken);
var client = new MapsSearchClient(sasCredential);
Hiérarchie des clients
Azure.Maps.Search
└── MapsSearchClient
├── GetGeocoding() → Géocodage d’adresses
├── GetGeocodingBatch() → Géocodage par lots
├── GetReverseGeocoding() → Conversion de coordonnées en adresse
├── GetReverseGeocodingBatch() → Géocodage inversé par lots
└── GetPolygon() → Récupération des polygones de délimitation
Azure.Maps.Routing
└── MapsRoutingClient
├── GetDirections() → Itinéraires
├── GetImmediateRouteMatrix() → Matrice d’itinéraires (synchrone, ≤100)
├── GetRouteMatrix() → Matrice d’itinéraires (asynchrone, ≤700)
└── GetRouteRange() → Portée isochrone/accessible
Azure.Maps.Rendering
└── MapsRenderingClient
├── GetMapTile() → Tuiles de carte
├── GetMapStaticImage() → Images de carte statiques
└── GetCopyrightCaption() → Informations sur les droits d'auteur
Azure.Maps.Geolocation
└── MapsGeolocationClient
└── GetCountryCode() → Conversion d'une adresse IP en pays/région
Azure.Maps.Weather
└── MapsWeatherClient
├── GetCurrentWeatherConditions() → Conditions météo actuelles
├── GetDailyForecast() → Prévisions quotidiennes
├── GetHourlyForecast() → Prévisions horaires
└── GetSevereWeatherAlerts() → Alertes météo
Workflows principaux
1. Géocodage (adresse vers coordonnées)
using Azure;
using Azure.Maps.Search;
var credential = new AzureKeyCredential(subscriptionKey);
var client = new MapsSearchClient(credential);
s de la réponse result = client.GetGeocoding("1 Microsoft Way, Redmond, WA 98052");
foreach (var feature in result.Value.Features)
{
Console.WriteLine($"Coordonnées : {string.Join(",", feature.Geometry.Coordinates)}");
Console.WriteLine($"Adresse : {feature.Properties.Address.FormattedAddress}");
Console.WriteLine($"Confiance : {feature.Properties.Confidence}");
}
2. Géocodage par lots
using Azure.Maps.Search.Models.Queries;
List queries = new List
{
new GeocodingQuery() { Query = "400 Broad St, Seattle, WA" },
new GeocodingQuery() { Query = "1 Microsoft Way, Redmond, WA" },
new GeocodingQuery() { AddressLine = "Space Needle", Top = 1 },
};
Réponse results = client.GetGeocodingBatch(queries);
foreach (var batchItem in results.Value.BatchItems)
{
foreach (var feature in batchItem.Features)
{
Console.WriteLine($"Coordonnées : {string.Join(",", feature.Geometry.Coordinates)}");
}
}
3. Géocodage inversé (coordonnées vers adresse)
using Azure.Core.GeoJson;
GeoPosition coordinates = new GeoPosition(-122.138685, 47.6305637);
Response result = client.GetReverseGeocoding(coordinates);
foreach (var feature in result.Value.Features)
{
Console.WriteLine($"Adresse : {feature.Properties.Address.FormattedAddress}");
Console.WriteLine($"Localité : {feature.Properties.Address.Locality}");
}
4. Obtenir le polygone de délimitation
using Azure.Maps.Search.Models;
GetPolygonOptions options = new GetPolygonOptions()
{
Coordinates = new GeoPosition(-122.204141, 47.61256),
ResultType = BoundaryResultTypeEnum.Locality,
Resolution = ResolutionEnum.Small,
};
Response result = client.GetPolygon(options);
Console.WriteLine($"Droits d'auteur des limites : {result.Value.Properties?.Copyright}");
Console.WriteLine($"Nombre de polygones : {result.Value.Geometry.Count}");
5. Itinéraires
using Azure;
using Azure.Core.GeoJson;
using Azure.Maps.Routing;
using Azure.Maps.Routing.Models;
var client = new MapsRoutingClient(new AzureKeyCredential(subscriptionKey));
List routePoints = new List()
{
new GeoPosition(-122,34, 47,61), // Seattle
new GeoPosition(-122,13, 47,64) // Redmond
};
RouteDirectionQuery query = new RouteDirectionQuery(routePoints);
Response result = client.GetDirections(query);
foreach (var route in result.Value.Routes)
{
Console.WriteLine($"Distance : {route.Summary.LengthInMeters} mètres");
Console.WriteLine($"Durée : {route.Summary.TravelTimeDuration}");
foreach (RouteLeg leg in route.Legs)
{
Console.WriteLine($"Points de l'étape : {leg.Points.Count}");
}
}
6. Itinéraires avec options
RouteDirectionOptions options = new RouteDirectionOptions()
{
RouteType = RouteType.Fastest,
UseTrafficData = true,
TravelMode = TravelMode.Bicycle,
Language = RoutingLanguage.EnglishUsa,
InstructionsType = RouteInstructionsType.Text,
};
RouteDirectionQuery query = new RouteDirectionQuery(routePoints)
{
RouteDirectionOptions = options
};
Response result = client.GetDirections(query);
7. Matrice d’itinéraires
RouteMatrixQuery routeMatrixQuery = new RouteMatrixQuery
{
Origins = new List()
{
new GeoPosition(-122,34, 47,61),
new GeoPosition(-122,13, 47,64)
},
Destinations = new List()
{
new GeoPosition(-122,20, 47,62),
new GeoPosition(-122,40, 47,65)
},
};
// Synchrone (jusqu’à 100 combinaisons d’itinéraires)
Response result = client.GetImmediateRouteMatrix(routeMatrixQuery);
foreach (var cell in result.Value.Matrix.SelectMany(row => row))
{
Console.WriteLine($"Distance : {cell.Response?.RouteSummary?.LengthInMeters}");
Console.WriteLine($"Durée : {cell.Response?.RouteSummary?.TravelTimeDuration}");
}
// Asynchrone (jusqu’à 700 combinaisons d’itinéraires)
RouteMatrixOptions routeMatrixOptions = new RouteMatrixOptions(routeMatrixQuery)
{
TravelTimeType = TravelTimeType.All,
};
GetRouteMatrixOperation asyncResult = client.GetRouteMatrix(WaitUntil.Completed, routeMatrixOptions);
8. Plage d'itinéraires (isochrone)
RouteRangeOptions options = new RouteRangeOptions(-122.34, 47.61)
{
TimeBudget = new TimeSpan(0, 20, 0) // 20 minutes
};
e de réponse result = client.GetRouteRange(options);
// result.Value.ReachableRange contient le polygone
Console.WriteLine($"Points limites : {result.Value.ReachableRange.Boundary.Count}");
9. Récupérer les tuiles de carte
using Azure;
using Azure.Maps.Rendering;
var client = new MapsRenderingClient(new AzureKeyCredential(subscriptionKey));
int zoom = 10;
int tileSize = 256;
// Convertir les coordonnées en index de tuile
MapTileIndex tileIndex = MapsRenderingClient.PositionToTileXY(
new GeoPosition(13.3854, 52.517), zoom, tileSize);
// Récupérer la tuile de carte
GetMapTileOptions options = new GetMapTileOptions(
MapTileSetId.MicrosoftImagery,
new MapTileIndex(tileIndex.X, tileIndex.Y, zoom)
);
Response mapTile = client.GetMapTile(options);
// Enregistrer dans un fichier
using (FileStream fileStream = File.Create("./MapTile.png"))
{
mapTile.Value.CopyTo(fileStream);
}
10. Géolocalisation par adresse IP
using System.Net;
using Azure;
using Azure.Maps.Geolocation;
var client = new MapsGeolocationClient(new AzureKeyCredential(subscriptionKey));
IPAddress ipAddress = IPAddress.Parse("2001:4898:80e8:b::189");
Response result = client.GetCountryCode(ipAddress);
Console.WriteLine($"Code ISO du pays : {result.Value.IsoCode}");
11. Météo actuelle
using Azure;
using Azure.Core.GeoJson;
using Azure.Maps.Weather;
var client = new MapsWeatherClient(new AzureKeyCredential(subscriptionKey));
var position = new GeoPosition(-122.13071, 47.64011);
var options = new GetCurrentWeatherConditionsOptions(position);
de réponse result = client.GetCurrentWeatherConditions(options);
foreach (var condition in result.Value.Results)
{
Console.WriteLine($"Température : {condition.Temperature.Value} {condition.Temperature.Unit}");
Console.WriteLine($"Météo : {condition.Phrase}");
Console.WriteLine($"Humidité : {condition.RelativeHumidity} %");
}
Référence des types de clés
Rechercher un package
| Type | Objectif |
|---|---|
MapsSearchClient |
Client principal pour les opérations de recherche |
GeocodingResponse |
Résultat du géocodage |
GeocodingBatchResponse |
Résultat de géocodage par lots |
GeocodingQuery |
Requête de géocodage par lots |
ReverseGeocodingQuery |
Requête de géocodage inversé par lots |
GetPolygonOptions |
Options pour la récupération de polygones |
Limites |
Résultat du polygone de délimitation |
BoundaryResultTypeEnum |
Type de limite (localité, district administratif, etc.) |
ResolutionEnum |
Résolution du polygone (Petit, Moyen, Grand) |
Paquet de routage
| Type | Objectif |
|---|---|
MapsRoutingClient |
Client principal pour les opérations de calcul d'itinéraire |
RouteDirectionQuery |
Requête d'itinéraire |
RouteDirectionOptions |
Options de calcul d'itinéraire |
RouteDirections |
Résultat de l'itinéraire |
Étape d'itinéraire |
Segment d'un itinéraire |
RouteMatrixQuery |
Requête concernant la matrice d'itinéraires |
Résultat de la matrice d'itinéraire |
Résultat de la matrice d'itinéraires |
RouteRangeOptions |
Options pour l'isochrone |
Résultat de la plage d'itinéraires |
Résultat de l'isochrone |
RouteType |
Type d'itinéraire (le plus rapide, le plus court, éco, palpitant) |
TravelMode |
Mode de déplacement (voiture, camion, vélo, piéton) |
Pack de rendu
| Type | Objectif |
|---|---|
MapsRenderingClient |
Client principal pour le rendu |
GetMapTileOptions |
Options des tuiles de carte |
MapTileIndex |
Coordonnées des tuiles (X, Y, zoom) |
MapTileSetId |
Identifiant de l'ensemble de tuiles |
Types courants
| Type | Objectif |
|---|---|
GeoPosition |
Position géographique (longitude, latitude) |
GeoBoundingBox |
Boîte englobante de la zone géographique |
Bonnes pratiques
- Utilisez l'Entra ID en production — À privilégier par rapport aux clés d'abonnement
- Opérations par lots — Utilisez le géocodage par lots pour plusieurs adresses
- Mise en cache des résultats — Les résultats de géocodage ne changent pas fréquemment
- Utilisez des tailles de tuiles adaptées — 256 ou 512 pixels en fonction de l'affichage
- Gérer les limites de débit — Mettre en œuvre un recul exponentiel
- Utilisez la matrice d'itinéraires asynchrone — Pour les calculs de matrice volumineux (>100)
- Prendre en compte les données de trafic — Définir
UseTrafficData = truepour obtenir des heures d'arrivée estimées précises
Gestion des erreurs
try
{
Response result = client.GetGeocoding(address);
}
catch (RequestFailedException ex)
{
Console.WriteLine($"Statut : {ex.Status}");
Console.WriteLine($"Erreur : {ex.Message}");
switch (ex.Status)
{
case 400:
// Paramètres de requête non valides
break;
case 401:
// Échec de l'authentification
break;
case 429 :
// Limitation de débit - mettre en place un délai d'attente
break;
}
}
SDK associés
| SDK | Objectif | Installer |
|---|---|---|
Azure.Maps.Search |
Géocodage, recherche | dotnet add package Azure.Maps.Search --prerelease |
Azure.Maps.Routing |
Itinéraires, matrice | dotnet add package Azure.Maps.Routing --prerelease |
Azure.Maps.Rendering |
Dossets de carte, images | dotnet add package Azure.Maps.Rendering --prerelease |
Azure.Maps.Geolocation |
Géolocalisation par adresse IP | dotnet add package Azure.Maps.Geolocation --prerelease |
Azure.Maps.Weather |
Données météorologiques | dotnet add package Azure.Maps.Weather --prerelease |
Azure.ResourceManager.Maps |
Gestion des comptes | dotnet add package Azure.ResourceManager.Maps --prerelease |
Liens de référence
| Ressource | URL |
|---|---|
| Documentation Azure Maps | https://learn.microsoft.com/azure/azure-maps/ |
| Référence de l'API de recherche | https://learn.microsoft.com/dotnet/api/azure.maps.search |
| Référence de l'API de calcul d'itinéraire | https://learn.microsoft.com/dotnet/api/azure.maps.routing |
| Source GitHub | https://github.com/Azure/azure-sdk-for-net/tree/main/sdk/maps |
| Tarifs | https://azure.microsoft.com/pricing/details/azure-maps/ |
---
name: azure-maps-search-dotnet
description: Integrate Azure Maps location-based services into .NET applications for geocoding, routing, rendering, geolocation, and weather data.
license: MIT
---
# Azure Maps (.NET)
Azure Maps SDK for .NET providing location-based services: geocoding, routing, rendering, geolocation, and weather.
## Installation
```bash
# Search (geocoding, reverse geocoding)
dotnet add package Azure.Maps.Search --prerelease
# Routing (directions, route matrix)
dotnet add package Azure.Maps.Routing --prerelease
# Rendering (map tiles, static images)
dotnet add package Azure.Maps.Rendering --prerelease
# Geolocation (IP to location)
dotnet add package Azure.Maps.Geolocation --prerelease
# Weather
dotnet add package Azure.Maps.Weather --prerelease
# Resource Management (account management, SAS tokens)
dotnet add package Azure.ResourceManager.Maps --prerelease
# Required for authentication
dotnet add package Azure.Identity
```
**Current Versions**:
- `Azure.Maps.Search`: v2.0.0-beta.5
- `Azure.Maps.Routing`: v1.0.0-beta.4
- `Azure.Maps.Rendering`: v2.0.0-beta.1
- `Azure.Maps.Geolocation`: v1.0.0-beta.3
- `Azure.ResourceManager.Maps`: v1.1.0-beta.2
## Environment Variables
```bash
AZURE_MAPS_SUBSCRIPTION_KEY=<your-subscription-key> # Only required for AzureKeyCredential auth
AZURE_MAPS_CLIENT_ID=<your-client-id> # Required: Azure Maps client ID
AZURE_TOKEN_CREDENTIALS=prod # Required only if DefaultAzureCredential is used in production
```
## Authentication
### Subscription Key (Shared Key)
```csharp
using Azure;
using Azure.Maps.Search;
var subscriptionKey = Environment.GetEnvironmentVariable("AZURE_MAPS_SUBSCRIPTION_KEY");
var credential = new AzureKeyCredential(subscriptionKey);
var client = new MapsSearchClient(credential);
```
### Microsoft Entra Token Credential
```csharp
using Azure.Identity;
using Azure.Maps.Search;
// Local dev: DefaultAzureCredential. Production: set AZURE_TOKEN_CREDENTIALS=prod or AZURE_TOKEN_CREDENTIALS=<specific_credential>
var credential = new DefaultAzureCredential(
DefaultAzureCredential.DefaultEnvironmentVariableName
);
// Or use a specific credential directly in production:
// See https://learn.microsoft.com/dotnet/api/overview/azure/identity-readme?view=azure-dotnet#credential-classes
// var credential = new ManagedIdentityCredential();
var clientId = Environment.GetEnvironmentVariable("AZURE_MAPS_CLIENT_ID");
var client = new MapsSearchClient(credential, clientId);
```
### Shared Access Signature (SAS)
```csharp
using Azure;
using Azure.Core;
using Azure.Identity;
using Azure.ResourceManager;
using Azure.ResourceManager.Maps;
using Azure.ResourceManager.Maps.Models;
using Azure.Maps.Search;
// Authenticate with Azure Resource Manager
ArmClient armClient = new ArmClient(new DefaultAzureCredential());
// Get Maps account resource
ResourceIdentifier mapsAccountResourceId = MapsAccountResource.CreateResourceIdentifier(
subscriptionId, resourceGroupName, accountName);
MapsAccountResource mapsAccount = armClient.GetMapsAccountResource(mapsAccountResourceId);
// Generate SAS token
MapsAccountSasContent sasContent = new MapsAccountSasContent(
MapsSigningKey.PrimaryKey,
principalId,
maxRatePerSecond: 500,
start: DateTime.UtcNow.ToString("O"),
expiry: DateTime.UtcNow.AddDays(1).ToString("O"));
Response<MapsAccountSasToken> sas = mapsAccount.GetSas(sasContent);
// Create client with SAS token
var sasCredential = new AzureSasCredential(sas.Value.AccountSasToken);
var client = new MapsSearchClient(sasCredential);
```
## Client Hierarchy
```
Azure.Maps.Search
└── MapsSearchClient
├── GetGeocoding() → Geocode addresses
├── GetGeocodingBatch() → Batch geocoding
├── GetReverseGeocoding() → Coordinates to address
├── GetReverseGeocodingBatch() → Batch reverse geocoding
└── GetPolygon() → Get boundary polygons
Azure.Maps.Routing
└── MapsRoutingClient
├── GetDirections() → Route directions
├── GetImmediateRouteMatrix() → Route matrix (sync, ≤100)
├── GetRouteMatrix() → Route matrix (async, ≤700)
└── GetRouteRange() → Isochrone/reachable range
Azure.Maps.Rendering
└── MapsRenderingClient
├── GetMapTile() → Map tiles
├── GetMapStaticImage() → Static map images
└── GetCopyrightCaption() → Copyright info
Azure.Maps.Geolocation
└── MapsGeolocationClient
└── GetCountryCode() → IP to country/region
Azure.Maps.Weather
└── MapsWeatherClient
├── GetCurrentWeatherConditions() → Current weather
├── GetDailyForecast() → Daily forecast
├── GetHourlyForecast() → Hourly forecast
└── GetSevereWeatherAlerts() → Weather alerts
```
## Core Workflows
### 1. Geocoding (Address to Coordinates)
```csharp
using Azure;
using Azure.Maps.Search;
var credential = new AzureKeyCredential(subscriptionKey);
var client = new MapsSearchClient(credential);
Response<GeocodingResponse> result = client.GetGeocoding("1 Microsoft Way, Redmond, WA 98052");
foreach (var feature in result.Value.Features)
{
Console.WriteLine($"Coordinates: {string.Join(",", feature.Geometry.Coordinates)}");
Console.WriteLine($"Address: {feature.Properties.Address.FormattedAddress}");
Console.WriteLine($"Confidence: {feature.Properties.Confidence}");
}
```
### 2. Batch Geocoding
```csharp
using Azure.Maps.Search.Models.Queries;
List<GeocodingQuery> queries = new List<GeocodingQuery>
{
new GeocodingQuery() { Query = "400 Broad St, Seattle, WA" },
new GeocodingQuery() { Query = "1 Microsoft Way, Redmond, WA" },
new GeocodingQuery() { AddressLine = "Space Needle", Top = 1 },
};
Response<GeocodingBatchResponse> results = client.GetGeocodingBatch(queries);
foreach (var batchItem in results.Value.BatchItems)
{
foreach (var feature in batchItem.Features)
{
Console.WriteLine($"Coordinates: {string.Join(",", feature.Geometry.Coordinates)}");
}
}
```
### 3. Reverse Geocoding (Coordinates to Address)
```csharp
using Azure.Core.GeoJson;
GeoPosition coordinates = new GeoPosition(-122.138685, 47.6305637);
Response<GeocodingResponse> result = client.GetReverseGeocoding(coordinates);
foreach (var feature in result.Value.Features)
{
Console.WriteLine($"Address: {feature.Properties.Address.FormattedAddress}");
Console.WriteLine($"Locality: {feature.Properties.Address.Locality}");
}
```
### 4. Get Boundary Polygon
```csharp
using Azure.Maps.Search.Models;
GetPolygonOptions options = new GetPolygonOptions()
{
Coordinates = new GeoPosition(-122.204141, 47.61256),
ResultType = BoundaryResultTypeEnum.Locality,
Resolution = ResolutionEnum.Small,
};
Response<Boundary> result = client.GetPolygon(options);
Console.WriteLine($"Boundary copyright: {result.Value.Properties?.Copyright}");
Console.WriteLine($"Polygon count: {result.Value.Geometry.Count}");
```
### 5. Route Directions
```csharp
using Azure;
using Azure.Core.GeoJson;
using Azure.Maps.Routing;
using Azure.Maps.Routing.Models;
var client = new MapsRoutingClient(new AzureKeyCredential(subscriptionKey));
List<GeoPosition> routePoints = new List<GeoPosition>()
{
new GeoPosition(-122.34, 47.61), // Seattle
new GeoPosition(-122.13, 47.64) // Redmond
};
RouteDirectionQuery query = new RouteDirectionQuery(routePoints);
Response<RouteDirections> result = client.GetDirections(query);
foreach (var route in result.Value.Routes)
{
Console.WriteLine($"Distance: {route.Summary.LengthInMeters} meters");
Console.WriteLine($"Duration: {route.Summary.TravelTimeDuration}");
foreach (RouteLeg leg in route.Legs)
{
Console.WriteLine($"Leg points: {leg.Points.Count}");
}
}
```
### 6. Route Directions with Options
```csharp
RouteDirectionOptions options = new RouteDirectionOptions()
{
RouteType = RouteType.Fastest,
UseTrafficData = true,
TravelMode = TravelMode.Bicycle,
Language = RoutingLanguage.EnglishUsa,
InstructionsType = RouteInstructionsType.Text,
};
RouteDirectionQuery query = new RouteDirectionQuery(routePoints)
{
RouteDirectionOptions = options
};
Response<RouteDirections> result = client.GetDirections(query);
```
### 7. Route Matrix
```csharp
RouteMatrixQuery routeMatrixQuery = new RouteMatrixQuery
{
Origins = new List<GeoPosition>()
{
new GeoPosition(-122.34, 47.61),
new GeoPosition(-122.13, 47.64)
},
Destinations = new List<GeoPosition>()
{
new GeoPosition(-122.20, 47.62),
new GeoPosition(-122.40, 47.65)
},
};
// Synchronous (up to 100 route combinations)
Response<RouteMatrixResult> result = client.GetImmediateRouteMatrix(routeMatrixQuery);
foreach (var cell in result.Value.Matrix.SelectMany(row => row))
{
Console.WriteLine($"Distance: {cell.Response?.RouteSummary?.LengthInMeters}");
Console.WriteLine($"Duration: {cell.Response?.RouteSummary?.TravelTimeDuration}");
}
// Asynchronous (up to 700 route combinations)
RouteMatrixOptions routeMatrixOptions = new RouteMatrixOptions(routeMatrixQuery)
{
TravelTimeType = TravelTimeType.All,
};
GetRouteMatrixOperation asyncResult = client.GetRouteMatrix(WaitUntil.Completed, routeMatrixOptions);
```
### 8. Route Range (Isochrone)
```csharp
RouteRangeOptions options = new RouteRangeOptions(-122.34, 47.61)
{
TimeBudget = new TimeSpan(0, 20, 0) // 20 minutes
};
Response<RouteRangeResult> result = client.GetRouteRange(options);
// result.Value.ReachableRange contains the polygon
Console.WriteLine($"Boundary points: {result.Value.ReachableRange.Boundary.Count}");
```
### 9. Get Map Tiles
```csharp
using Azure;
using Azure.Maps.Rendering;
var client = new MapsRenderingClient(new AzureKeyCredential(subscriptionKey));
int zoom = 10;
int tileSize = 256;
// Convert coordinates to tile index
MapTileIndex tileIndex = MapsRenderingClient.PositionToTileXY(
new GeoPosition(13.3854, 52.517), zoom, tileSize);
// Fetch map tile
GetMapTileOptions options = new GetMapTileOptions(
MapTileSetId.MicrosoftImagery,
new MapTileIndex(tileIndex.X, tileIndex.Y, zoom)
);
Response<Stream> mapTile = client.GetMapTile(options);
// Save to file
using (FileStream fileStream = File.Create("./MapTile.png"))
{
mapTile.Value.CopyTo(fileStream);
}
```
### 10. IP Geolocation
```csharp
using System.Net;
using Azure;
using Azure.Maps.Geolocation;
var client = new MapsGeolocationClient(new AzureKeyCredential(subscriptionKey));
IPAddress ipAddress = IPAddress.Parse("2001:4898:80e8:b::189");
Response<CountryRegionResult> result = client.GetCountryCode(ipAddress);
Console.WriteLine($"Country ISO Code: {result.Value.IsoCode}");
```
### 11. Current Weather
```csharp
using Azure;
using Azure.Core.GeoJson;
using Azure.Maps.Weather;
var client = new MapsWeatherClient(new AzureKeyCredential(subscriptionKey));
var position = new GeoPosition(-122.13071, 47.64011);
var options = new GetCurrentWeatherConditionsOptions(position);
Response<CurrentConditionsResult> result = client.GetCurrentWeatherConditions(options);
foreach (var condition in result.Value.Results)
{
Console.WriteLine($"Temperature: {condition.Temperature.Value} {condition.Temperature.Unit}");
Console.WriteLine($"Weather: {condition.Phrase}");
Console.WriteLine($"Humidity: {condition.RelativeHumidity}%");
}
```
## Key Types Reference
### Search Package
| Type | Purpose |
|------|---------|
| `MapsSearchClient` | Main client for search operations |
| `GeocodingResponse` | Geocoding result |
| `GeocodingBatchResponse` | Batch geocoding result |
| `GeocodingQuery` | Query for batch geocoding |
| `ReverseGeocodingQuery` | Query for batch reverse geocoding |
| `GetPolygonOptions` | Options for polygon retrieval |
| `Boundary` | Boundary polygon result |
| `BoundaryResultTypeEnum` | Boundary type (Locality, AdminDistrict, etc.) |
| `ResolutionEnum` | Polygon resolution (Small, Medium, Large) |
### Routing Package
| Type | Purpose |
|------|---------|
| `MapsRoutingClient` | Main client for routing operations |
| `RouteDirectionQuery` | Query for route directions |
| `RouteDirectionOptions` | Route calculation options |
| `RouteDirections` | Route directions result |
| `RouteLeg` | Segment of a route |
| `RouteMatrixQuery` | Query for route matrix |
| `RouteMatrixResult` | Route matrix result |
| `RouteRangeOptions` | Options for isochrone |
| `RouteRangeResult` | Isochrone result |
| `RouteType` | Route type (Fastest, Shortest, Eco, Thrilling) |
| `TravelMode` | Travel mode (Car, Truck, Bicycle, Pedestrian) |
### Rendering Package
| Type | Purpose |
|------|---------|
| `MapsRenderingClient` | Main client for rendering |
| `GetMapTileOptions` | Map tile options |
| `MapTileIndex` | Tile coordinates (X, Y, Zoom) |
| `MapTileSetId` | Tile set identifier |
### Common Types
| Type | Purpose |
|------|---------|
| `GeoPosition` | Geographic position (longitude, latitude) |
| `GeoBoundingBox` | Bounding box for geographic area |
## Best Practices
1. **Use Entra ID for production** — Prefer over subscription keys
2. **Batch operations** — Use batch geocoding for multiple addresses
3. **Cache results** — Geocoding results don't change frequently
4. **Use appropriate tile sizes** — 256 or 512 pixels based on display
5. **Handle rate limits** — Implement exponential backoff
6. **Use async route matrix** — For large matrix calculations (>100)
7. **Consider traffic data** — Set `UseTrafficData = true` for accurate ETAs
## Error Handling
```csharp
try
{
Response<GeocodingResponse> result = client.GetGeocoding(address);
}
catch (RequestFailedException ex)
{
Console.WriteLine($"Status: {ex.Status}");
Console.WriteLine($"Error: {ex.Message}");
switch (ex.Status)
{
case 400:
// Invalid request parameters
break;
case 401:
// Authentication failed
break;
case 429:
// Rate limited - implement backoff
break;
}
}
```
## Related SDKs
| SDK | Purpose | Install |
|-----|---------|---------|
| `Azure.Maps.Search` | Geocoding, search | `dotnet add package Azure.Maps.Search --prerelease` |
| `Azure.Maps.Routing` | Directions, matrix | `dotnet add package Azure.Maps.Routing --prerelease` |
| `Azure.Maps.Rendering` | Map tiles, images | `dotnet add package Azure.Maps.Rendering --prerelease` |
| `Azure.Maps.Geolocation` | IP geolocation | `dotnet add package Azure.Maps.Geolocation --prerelease` |
| `Azure.Maps.Weather` | Weather data | `dotnet add package Azure.Maps.Weather --prerelease` |
| `Azure.ResourceManager.Maps` | Account management | `dotnet add package Azure.ResourceManager.Maps --prerelease` |
## Reference Links
| Resource | URL |
|----------|-----|
| Azure Maps Documentation | https://learn.microsoft.com/azure/azure-maps/ |
| Search API Reference | https://learn.microsoft.com/dotnet/api/azure.maps.search |
| Routing API Reference | https://learn.microsoft.com/dotnet/api/azure.maps.routing |
| GitHub Source | https://github.com/Azure/azure-sdk-for-net/tree/main/sdk/maps |
| Pricing | https://azure.microsoft.com/pricing/details/azure-maps/ |
Tous les fichiers
0 fichiersInstaller azure-maps-search-dotnet
Téléchargez et décompressez les fichiers de compétences dans votre répertoire .claude/skills/.
Télécharger le ZIPClonez le dépôt et copiez les fichiers de compétence dans votre projet.
git clone https://github.com/microsoft/skills/tree/main/.github/plugins/azure-sdk-dotnet/skills/azure-maps-search-dotnet # Copy SKILL.md to your .claude/skills/ directory
Copier





Maison
