内网环境下的高德地图v2.0使用

一、背景

        在一个项目中,客户仅允许使用内网环境,又提出要使用高德地图的路线规划、路况、覆盖物等功能。

        本文适合场景:当前已完成外网地图整合开发,因需求需要转移至内网中的项目。

二、分析

        1、前端拦截+代理服务器

                初始的想法是部署一台代理服务器,代理服务器网络既能连接内网,又能连接外网,通过前端对指向amap固定url的请求进行拦截,将请求转发至代理服务器,由代理服务器的nginx将请求转发至高德后台获取数据,并返回到前端。

                但这种方案存在一个问题,使用高德V2.0及以上版本时,调用amap是js自动调取的,非XHR的请求,使用前端拦截器无法正常拦截到,如下图,因此,这种方案不可行。

       2、缓存JS API方式

                通过分析高德地图的整体流程,发现在地图初始化时会优先去调取一个https://webapi.amap.com/maps的接口,返回js文件,后续的瓦片、路况等等后台接口的url均暗藏在此js中,并在此js中做了负载均衡,如下图所示;

                 因此,只要复制上述的js文件,修改其中的默认请求url,理论上是可以实现将自动调取的接口定向到代理服务器的,按照此方法进行尝试。

三、尝试实现

        1、代理服务器:

              <1> 现将 https://webapi.amap.com/maps 返回的数据保存为js文件,修改其中vdata、restapi部分的代码(需要全部替换)。

 

将修改好的js保存并放到代理服务器目录,我这里放到nginx/html中,命名为map.js。(这里安装代理服务器nginx过程不再赘述,此步骤仅在测试中手动处理,后续可根据情况编写脚本实现)

                

                <2>配置代理服务,在nginx/conf/nginx.conf中添加以下配置,此处需要注意,若是在高德账号控制台中已经指定了可访问的域名,需要在转发请求规则中配置请求头(转发规则匹配map.js)。

                 <3> 前端页面配置及拦截器处理:将页面引入JS API的代码改成代理服务器的js地址,如下图:

                 完成上述步骤之后,即可实现内网环境下通过代理服务访问地图服务。

                

                <3>编写后台定时缓存服务,将map.js定时缓存并保存到对应位置,我这里每天保存一次。

整体流程如下:

          定时任务:每日更新map.js,将其中的vdata、restapi等接口改为代理服务器地址。

          前端页面:打开页面——》获取map.js——》根据map.js中的地址访问代理服务器指定的接口——》代理服务器将请求转发出去。

在本地环境下于Vue 3中使用高德地图有多种方法。在高德地图发布2.0版本之前,通常有两种通用加载方式: - **在`public/index.html`直接添加`script`标签**:这种方式必须在`head`中引入,如在`public/index.html`文件的`<head>`标签里添加相关`script`标签来引入高德地图的资源 [^2]。示例代码如下: ```html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Vue 3 App</title> <!-- 引入高德地图脚本 --> <script src="https://webapi.amap.com/maps?v=2.0&key=YOUR_API_KEY"></script> </head> <body> <div id="app"></div> <script type="module" src="/src/main.js"></script> </body> </html> ``` - **异步加载并传入回调函数**:在需要的时候进行异步加载,并传入回调函数。可以在Vue组件中通过编程的方式来实现异步加载。示例代码如下: ```vue <template> <div id="map-container"></div> </template> <script setup> import { onMounted } from 'vue'; onMounted(() => { const script = document.createElement('script'); script.src = 'https://webapi.amap.com/maps?v=2.0&key=YOUR_API_KEY&callback=initMap'; document.head.appendChild(script); window.initMap = () => { const map = new AMap.Map('map-container', { zoom: 10, center: [116.397428, 39.90923] }); }; }); </script> <style scoped> #map-container { width: 100%; height: 400px; } </style> ``` 此外,若要在内网离线使用高德地图,可参考相关教程完成内网离线使用高德地图的详细配置,解决加载报错、渲染卡顿、没网无法使用、瓦片资源不全、本地服务器部署等问题 [^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值