Partager via


Guide des développeurs du SDK REST JavaScript/TypeScript (préversion)

Le Kit de développement logiciel (SDK) REST TypeScript (SDK JavaScript)/JavaScript Azure Maps prend en charge la recherche en utilisant le service Search d’Azure Maps, comme la recherche d’une adresse, la recherche des limites d’une ville ou d’un pays et la recherche par coordonnées. Cet article vous aidera à créer des applications qui intègrent la puissance d’Azure Maps.

Notes

Le SDK JavaScript Azure Maps prend en charge la version LTS de Node.js. Pour plus d’informations, consultez Groupe de travail de la mise en production Node.js.

Prérequis

Conseil

Vous pouvez créer un compte Azure Maps par programmation. Voici un exemple qui utilise Azure CLI :

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

Créer un projet Node.js

L’exemple suivant crée un répertoire, puis un programme Node.js nommé mapsDemo en utilisant npm :

mkdir mapsDemo
cd mapsDemo
npm init

Installer le package de recherche

Pour utiliser le SDK JavaScript Azure Maps, vous devez installer le package de recherche. Chacun des services Azure Maps, y compris la recherche, le routage, le rendu et la géolocalisation, se trouve dans son propre package.

npm install @azure-rest/maps-search

Une fois le package installé, créez un fichier search.js dans le répertoire mapsDemo :

mapsDemo
+-- package.json
+-- package-lock.json
+-- node_modules/
+-- search.js

Services Azure Maps

Nom du service packages npm Exemples
action @azure-rest/maps-search exemples de recherches
Itinéraire @azure-rest/maps-route exemples d’itinéraires
Render @azure-rest/maps-render afficher l’exemple
Géolocalisation @azure-rest/maps-geolocation exemple de géolocalisation

Créer et authentifier un objet MapsSearchClient

Vous avez besoin d’un objet credential pour l’authentification lors de la création de l’objet MapsSearchClient utilisé pour accéder aux API de recherche Azure Maps. Vous pouvez utiliser des informations d’identification Microsoft Entra ou une clé d’abonnement Azure pour vous authentifier. Pour plus d’informations sur l’authentification, consultez Authentification avec Azure Maps.

Conseil

MapsSearchClient est l’interface principale pour les développeurs qui utilisent la bibliothèque de recherche Azure Maps. Pour en découvrir plus sur les méthodes de recherche disponibles, consultez bibliothèque de client Recherche Azure Maps.

Utilisation des informations d'identification Microsoft Entra

Vous pouvez vous authentifier auprès de Microsoft Entra ID à l’aide de la bibliothèque Azure Identity. Pour utiliser le fournisseur DefaultAzureCredential, vous devez installer le package @azure/identity :

npm install @azure/identity

Vous devez inscrire la nouvelle application Microsoft Entra et accorder l’accès à Azure Maps en attribuant le rôle nécessaire à votre principal de service. Pour plus d’informations, consultez Héberger un démon sur des ressources non-Azure. L’ID d’application (client), un ID de répertoire (locataire) et une clé secrète client sont retournés. Copiez ces valeurs et stockez-les dans un endroit sécurisé. Vous en aurez besoin dans les étapes qui suivent.

Définissez les valeurs de l’ID d’application (client), de l’ID de répertoire (tenant) et de la clé secrète client de votre application Microsoft Entra, ainsi que l’ID client de la ressource de carte en tant que variables d’environnement :

Variable d’environnement Description
AZURE_CLIENT_ID ID d’application (client) dans votre application inscrite
AZURE_CLIENT_SECRET Valeur de la clé secrète client dans votre application inscrite
AZURE_TENANT_ID ID d’annuaire (locataire) dans votre application inscrite
MAPS_CLIENT_ID ID client dans votre compte Azure Map

Vous pouvez utiliser un fichier .env pour ces variables. Vous devez installer le package dotenv :

npm install dotenv

Ensuite, ajoutez un fichier .env dans le répertoire mapsDemo et spécifiez les propriétés suivantes :

AZURE_CLIENT_ID="<client-id>"
AZURE_CLIENT_SECRET="<client-secret>"
AZURE_TENANT_ID="<tenant-id>"
MAPS_CLIENT_ID="<maps-client-id>"

Une fois vos variables d’environnement créées, vous pouvez y accéder dans votre code JavaScript :

const MapsSearch = require("@azure-rest/maps-search").default; 
const { DefaultAzureCredential } = require("@azure/identity"); 
require("dotenv").config(); 
 
const credential = new DefaultAzureCredential(); 
const client = MapsSearch(credential, process.env.MAPS_CLIENT_ID); 

Utilisation d’informations d’identification de clé d’abonnement

Vous pouvez vous authentifier avec votre clé d’abonnement Azure Maps. Votre clé d’abonnement se trouve dans la section Authentification du compte Azure Maps, comme illustré dans la capture d’écran suivante :

Capture d’écran illustrant votre clé d’abonnement Azure Maps dans le Portail Azure.

Vous devez passer la clé d’abonnement à la classe AzureKeyCredential fournie par le Package d’authentification Azure Core. Pour des raisons de sécurité, il est préférable de spécifier la clé en tant que variable d’environnement plutôt que de l’inclure dans votre code source.

Pour ce faire, utilisez un fichier .env pour stocker la variable de clé d’abonnement. Vous devez installer le package dotenv pour récupérer la valeur :

npm install dotenv

Ensuite, ajoutez un fichier .env dans le répertoire mapsDemo et spécifiez la propriété :

MAPS_SUBSCRIPTION_KEY="<subscription-key>"

Une fois votre variable d’environnement créée, vous pouvez y accéder dans votre code JavaScript :

const MapsSearch = require("@azure-rest/maps-search").default;
const { AzureKeyCredential } = require("@azure/core-auth");
require("dotenv").config();

const credential = new AzureKeyCredential(process.env.MAPS_SUBSCRIPTION_KEY);
const client = MapsSearch(credential);

Utilisation d’informations d’identification de jeton de signature d’accès partagé (SAP)

Les jetons SAS (signature d’accès partagé) sont des jetons d’authentification créés à l’aide du format JWT (JSON Web Token). Ils sont signés par chiffrement pour prouver l’authentification d’une application auprès de l’API REST Azure Maps.

Vous pouvez obtenir le jeton SAP à l’aide du package AzureMapsManagementClient.accounts.listSas. Suivez la section Créer et authentifier une configuration AzureMapsManagementClient pour commencer.

Ensuite, suivez les identités managées pour Azure Maps pour créer une identité managée pour votre compte Azure Maps. Copiez l’ID principal (ID d’objet) de l’identité managée.

Ensuite, installez le package d’authentification Azure Core pour utiliser AzureSASCredential:

npm install @azure/core-auth

Enfin, vous pouvez utiliser le jeton SAP pour authentifier le client :

  const MapsSearch = require("@azure-rest/maps-search").default;
  const { AzureSASCredential } = require("@azure/core-auth");
  const { DefaultAzureCredential } = require("@azure/identity");
  const { AzureMapsManagementClient } = require("@azure/arm-maps");

  const subscriptionId = "<subscription ID of the map account>"
  const resourceGroupName = "<resource group name of the map account>";
  const accountName = "<name of the map account>";
  const mapsAccountSasParameters = {
    start: "<start time in ISO format>", // e.g. "2023-11-24T03:51:53.161Z"
    expiry: "<expiry time in ISO format>", // maximum value to start + 1 day
    maxRatePerSecond: 500,
    principalId: "<principle ID (object ID) of the managed identity>",
    signingKey: "primaryKey",
  };
  const credential = new DefaultAzureCredential();
  const managementClient = new AzureMapsManagementClient(credential, subscriptionId);
  const {accountSasToken} = await managementClient.accounts.listSas(
    resourceGroupName,
    accountName,
    mapsAccountSasParameters
  );
  if (accountSasToken === undefined) {
    throw new Error("No accountSasToken was found for the Maps Account.");
  }
  const sasCredential = new AzureSASCredential(accountSasToken);
  const client = MapsSearch(sasCredential);

Géocodage

L’extrait de code suivant montre comment, dans une application console simple, importer le @azure-rest/maps-search package et obtenir les coordonnées d’une adresse à l’aide de la requête GetGeocoding :

const MapsSearch = require("@azure-rest/maps-search").default;
const { isUnexpected } = require("@azure-rest/maps-search");
const { AzureKeyCredential } = require("@azure/core-auth");
require("dotenv").config();

async function main() {
  const credential = new AzureKeyCredential(
    process.env. MAPS_SUBSCRIPTION_KEY
  );
  const client = MapsSearch(credential);

  const response = await client.path("/geocode", "json").get({
    queryParameters: {
      query: "1301 Alaskan Way, Seattle, WA 98101, US",
    },
  });
  if (isUnexpected(response)) {
    throw response.body.error;
  }
  const [ lon, lat ] = response.body.features[0].geometry.coordinates;
  console.log(`The coordinate is: (${lat}, ${lon})`);
}

main().catch((err) => {
  console.error(err);
});

L’extrait de code montre comment utiliser la méthode MapsSearch de la bibliothèque de client Azure Maps Search pour créer un objet client avec vos informations d’identification Azure. Vous pouvez utiliser votre clé d’abonnement Azure Maps ou les informations d’identification Microsoft Entra. Le path paramètre spécifie le point de terminaison de l’API, qui dans ce cas est « /geocode ». La méthode get envoie une requête HTTP GET avec les paramètres de requête. La requête recherche la coordonnée « 1301 Alaskan Way, Seattle, WA 98101, US ». Le SDK retourne les résultats sous la forme d’un objet GeocodingResponseOutput et les écrit dans la console. Les résultats sont classés par score de confiance dans cet exemple et seul le premier résultat s’affiche à l’écran. Pour plus d’informations, consultez GetGeocoding.

Exécutez search.js avec Node.js :

node search.js 

Géocodage inversé per lots

La Recherche Azure Maps fournit également des méthodes de requête par lots. L’exemple suivant montre comment appeler une méthode de recherche inversée par lots :

  const batchItems = [
    // This is an invalid query
    { coordinates: [2.294911, 148.858561] },
    {
      coordinates: [-122.34255, 47.6101],
    },
    { coordinates: [-122.33817, 47.6155] },
  ];
  const response = await client.path("/reverseGeocode:batch").post({
    body: { batchItems },
  });

Dans cet exemple, trois coordonnées sont incluses dans le corps de la requête batchItems. La premier élément n’est pas valide. Consultez Remise des requêtes ayant échoué pour obtenir un exemple montrant comment gérer l’élément non valide.

Une fois que vous avez obtenu la réponse, vous pouvez la journaliser :

 
function logResponseBody(resBody) {
  const { summary, batchItems } = resBody;

  const { totalRequests, successfulRequests } = summary;
  console.log(`${successfulRequests} out of ${totalRequests} requests are successful.`);

  batchItems.forEach(({ response }, idx) => {
    if (response.error) {
      console.log(`Error in ${idx + 1} request: ${response.error.message}`);
    } else {
      console.log(`Results in ${idx + 1} request:`);
      response.features.forEach((feature) => {
        console.log(`  ${feature.properties.address.freeformAddress}`);
      });
    }
  });
} 

Gestion des requêtes ayant échoué

Gérez les demandes ayant échoué en vérifiant la propriété error dans l’élément de lot de réponse. Consultez la fonction logResponseBody dans l’exemple de recherche inversée par lots terminé suivant.

Exemple de recherche inversée par lots terminé

Exemple de code complet de la recherche inversée d’adresses par lots :

const MapsSearch = require("@azure-rest/maps-search").default,
  { isUnexpected } = require("@azure-rest/maps-search");
const { AzureKeyCredential } = require("@azure/core-auth");
require("dotenv").config();

async function main() {
  const credential = new AzureKeyCredential(process.env.MAPS_SUBSCRIPTION_KEY);
  const client = MapsSearch(credential);

  const batchItems = [
    // This is an invalid query
    { coordinates: [2.294911, 148.858561] },
    {
      coordinates: [-122.34255, 47.6101],
    },
    { coordinates: [-122.33817, 47.6155] },
  ];

  const response = await client.path("/reverseGeocode:batch").post({
    body: { batchItems },
  });

  if (isUnexpected(response)) {
    throw response.body.error;
  }

  logResponseBody(resumeResponse.body);
}

function logResponseBody(resBody) {
  const { summary, batchItems } = resBody;

  const { totalRequests, successfulRequests } = summary;
  console.log(`${successfulRequests} out of ${totalRequests} requests are successful.`);

  batchItems.forEach(({ response }, idx) => {
    if (response.error) {
      console.log(`Error in ${idx + 1} request: ${response.error.message}`);
    } else {
      console.log(`Results in ${idx + 1} request:`);
      response.features.forEach((feature) => {
        console.log(`  ${feature.properties.address.freeformAddress}`);
      });
    }
  });
} 

main().catch(console.error);

Utilisation du SDK V1

Nous travaillons à rendre toutes les fonctionnalités V1 disponibles dans V2. En attendant, veuillez installer les packages SDK V1 suivants si nécessaire :

npm install @azure-rest/map-search-v1@npm:@azure-rest/map-search@^1.0.0
npm install @azure-rest/map-search-v2@npm:@azure-rest/map-search@^2.0.0

Vous pouvez ensuite importer les deux packages :

const MapsSearchV1 = require("@azure-rest/map-search-v1").default;
const MapsSearchV2 = require("@azure-rest/map-search-v2").default;

L’exemple suivant illustre la création d’une fonction qui accepte une adresse et des POI de recherche autour de celle-ci. Utilisez le SDK V2 pour obtenir les coordonnées de l’adresse (/geocode) et le SDK V1 pour rechercher des POI autour de celui-ci (/search/nearby).

const MapsSearchV1 = require("@azure-rest/map-search-v1").default;
const MapsSearchV2 = require("@azure-rest/map-search-v2").default;
const { AzureKeyCredential } = require("@azure/core-auth");
const { isUnexpected: isUnexpectedV1 } = require("@azure-rest/maps-search-v1");
const { isUnexpected: isUnexpectedV2 } = require("@azure-rest/maps-search-v2");
require("dotenv").config();

/** Initialize the MapsSearchClient */
const clientV1 = MapsSearchV1(new AzureKeyCredential(process.env.MAPS_SUBSCRIPTION_KEY));
const clientV2 = MapsSearchV2(new AzureKeyCredential(process.env.MAPS_SUBSCRIPTION_KEY));

async function searchNearby(address) {
  /** Make a request to the geocoding API */
  const geocodeResponse = await clientV2
    .path("/geocode")
    .get({ queryParameters: { query: address } });
  /** Handle error response */
  if (isUnexpectedV2(geocodeResponse)) {
    throw geocodeResponse.body.error;
  }

  const [lon, lat] = geocodeResponse.body.features[0].geometry.coordinates;
  
  /** Make a request to the search nearby API */
  const nearByResponse = await clientV1.path("/search/nearby/{format}", "json").get({
    queryParameters: { lat, lon },
  });
  /** Handle error response */
  if (isUnexpectedV1(nearByResponse)) {
    throw nearByResponse.body.error;
  }
  /** Log response body */
  for(const results of nearByResponse.body.results) {
    console.log(
      `${result.poi ? result.poi.name + ":" : ""} ${result.address.freeformAddress}. (${
        result.position.lat
      }, ${result.position.lon})\n`
    );
  }
}

async function main(){
  searchNearBy("15127 NE 24th Street, Redmond, WA 98052");
}

main().catch((err) => {
    console.log(err);
})

Informations supplémentaires