假如使用AxureMaps的地图服务

200 阅读3分钟

前言

由于AzureMaps的文档写的过于简洁。这个简洁可不是我说的,是ChatGpt说的

Azure Maps 的官方文档 确实偏概括、不够细致,特别是对 azure-maps-drawing-tools 插件的说明 基本就只有示例代码,没有系统性的 API 文档或参数详解,这对开发者尤其是使用插件时调试是比较困难的。

所以汇总下常规用法

创建Web应用

先决条件

  • 创建 Azure Maps 帐户获取key

这里的第三部获取key需要自己去操作,因为本人调研的时候直接拿到的key故无从得知后台界面操作。

身份验证

AzureMaps提供了四种身份验证类型

aadAAD 隐式授予机制。 建议用于受登录保护的页面。 默认情况下,当映射控件初始化时,页面将被重定向到 AAD 登录名。 在 中AuthenticationOptions指定登录PublicClientApplication,以便更好地控制用户登录时间/方式。 文本值 "aad"
anonymous匿名身份验证机制。 建议用于公共页面。 允许提供负责获取身份验证令牌的回调。 文本值 "anonymous"
sas共享访问签名身份验证机制。 允许在请求中提供负责获取令牌的回调。 文本值 "sas"
subscriptionKey订阅密钥身份验证机制。 文本值 "subscriptionKey"

一般我们会使用anonymous或者subscriptionKey的方式来初始化地图

anonymous身份验证

如果想要更加安全的访问,官方推荐使用anonymous的方式来取得身份验证。如果使用这种方式来获取身份验证你在初始化地图的时候需要在authOptions配置authTypeanonymous。根据示例代码

 map = new atlas.Map("map", {
                 center: [-97.55859, 39.63953],
                 zoom: 3,
                 pitch: 60,
                 style: "grayscale_dark",
                 antialias: true,
                 authOptions: {
                     //Use Microsoft Entra ID authentication.
                     authType: 'anonymous',
                     clientId: 'e6b6ab59-eb5d-4d25-aa57-581135b927f0', // 这个客户端id从AzureMap后台拿
                     getToken: function (resolve, reject, map) {
                         //URL to your authentication service that retrieves an Microsoft Entra ID Token.
                         var tokenServiceUrl = 'https://samples.azuremaps.com/api/GetAzureMapsToken';
 ​
                         fetch(tokenServiceUrl).then(r => r.text()).then(token => resolve(token));
                     }
 ​
                     //从AzureMaps后台获取key来加载地图
                     //authType: 'subscriptionKey',
                     //subscriptionKey: '[YOUR_AZURE_MAPS_KEY]' 这里输入你申请的key
                 }
             });
 ​

subscriptionKey方式验证

subscriptionKey方式验证身份就跟我们国内的如高德地图一样。高德地图的初始化地图代码输入在高德地图后台申请的key来启动服务。

 <script type="text/javascript">
   window._AMapSecurityConfig = {
     securityJsCode: "「你申请的安全密钥」",
   };
 </script>
 <script src="https://webapi.amap.com/loader.js"></script>
 <script type="text/javascript">
   AMapLoader.load({
     key: "「你申请的应用Key」", //申请好的Web端开发者 Key,调用 load 时必填
     version: "2.0", //指定要加载的 JS API 的版本,缺省时默认为 1.4.15
   })
     .then((AMap) => {
       const map = new AMap.Map("container");
     })
     .catch((e) => {
       console.error(e); //加载错误提示
     });
 </script>

使用AzureMaps初始化的时候如果使用这种方式,anonymous身份验证代码块内注释有介绍。

在项目中使用

官方文档

有两种方式引入地图包

如何使用azure-maps-control npm包来创建地图

如果你有现成的项目需要引入该包则需要直接安装

 npm install azure-maps-control

还需要嵌入 CSS 样式表才能正确显示各种控件。 如果使用的是 JavaScript 捆绑程序来捆绑依赖项并打包代码,请参考所使用捆绑程序的文档,了解如何完成操作。 如果使用的是 webpack,则通常通过将 style-loadercss-loaderstyle-loader 提供的文档相结合来完成。

 npm install --save-dev style-loader css-loader

在源文件中,导入 atlas.min.css

JavaScript

 import "azure-maps-control/dist/atlas.min.css";

然后将加载程序添加到 webpack 配置的模块规则部分:

 module.exports = {
   module: {
     rules: [
       {
         test: /.css$/i,
         use: ["style-loader", "css-loader"]
       }
     ]
   }
 };

完成以上配置之后可以直接使用如下代码来初始化

 import * as atlas from "azure-maps-control";
 import "azure-maps-control/dist/atlas.min.css";
 ​
 const onload = () => {
   // Initialize a map instance.
   const map = new atlas.Map("map", {
     view: "Auto",
     // Add authentication details for connecting to Azure Maps.
     authOptions: {
       authType: "subscriptionKey",
       subscriptionKey: "<Your Azure Maps Key>"
     }
   });
 };
 ​
 document.body.onload = onload;

那么正常来说你页面上地图应该已经渲染了,地图渲染在页面上一个id为map的元素内。

错误

什么?你的地图没有渲染且页面上报了如下的错误?

 ERROR
 Failed to fetch
 TypeError: Failed to fetch
     at e.eval (webpack://azuremap/./node_modules/azure-maps-control/dist/atlas-esm.min.js?:170:1274720)
     at Object.eval [as next] (webpack://azuremap/./node_modules/azure-maps-control/dist/atlas-esm.min.js?:170:1260844)
     at eval (webpack://azuremap/./node_modules/azure-maps-control/dist/atlas-esm.min.js?:170:1259849)
     at new Promise (<anonymous>)
     at __awaiter$1 (webpack://azuremap/./node_modules/azure-maps-control/dist/atlas-esm.min.js?:170:1259600)
     at e._request (webpack://azuremap/./node_modules/azure-maps-control/dist/atlas-esm.min.js?:170:1274118)
     at eval (webpack://azuremap/./node_modules/azure-maps-control/dist/atlas-esm.min.js?:170:1266552)

两种解决方案

  • 挂梯子
  • 截止我博客发时可以生效的就是本地host添加一行
 13.107.42.21 atlas.microsoft.com