高德地图API使用笔记

标签: 无 分类: 未分类 创建时间:2021-10-27 08:40:18 更新时间:2025-09-26 04:44:40

1.前言

这几天,我在研究使用高德地图API,因为已有的项目使用的高德API是1.4,Loca是1.3,我这里直接升级到了API 2.0,Loca 2.0了,并且没有使用vue-amap,直接使用了原生的api进行创建。首先我这里有一个问题,如果你看Loca 2.0 的参考,会发现没有地方进行数据的绑定,下面是layer的全部方法:

其实还有一个方法就是setSource(),它接受一个 Loca.GeoJSONSource 对象,可以设置相关的数据源。

参考文章:
1.概述 Loca的教程,这里有Loca 2.0的引入
2.Loca 这是Loca 2.0的api参考文档
3.Loca 2.0的示例 Loca 2.0的示例
4.地图 JS API v2.0 正式版 js api教程
5.地图 JSAPI 2.0 js api参考文档
6.JS API 示例 官方的js API示例
7.基于高德地图js v1.4.15绘制三维户室效果

2.图层点击

参考文章:
1.大小点—中国城市人口数量及GDP排行

3.绘制虚线

在官方的文档中,其实有说明,LineLayer 图层是支持 虚线 配置的,但是实际上并没有这个参数的说明。我后来在 示例中找到了dashArray这个参数的使用,

1
2
3
4
5
// 高德配置
dashArray: [10, 0, 10, 0]

// 释义 "1"是第一段虚线长度,"2"紧跟着的间隔,"3"是第二段虚线的长度,"4"是第二段虚线后边的间隔
lineDash:[1,2,3,4]

官方开发人员在群里说,下一个版本会改成 dash 参数,我当前用的版本是Loca 2.0。

参考文章:
1.OpenLayers 画虚线 lineDash及lineDashOffset用法 openlayer中的虚线的配置及其说明。
2.北京部分公共交通线路

4.问题汇总

我这里的问题,都是基于 JS API 2.0 和 Loca API 2.0的,后期官方可能会修复部分的问题。

(1) 地图切换后无法渲染要素
使用vue的时候,在路由中第一次进入的时候可以显示绘制的图层,但是切换到其他的路由,再切换回来之后,地图可以显示,也可以打印出来地图和loca变量,但是上面的图层没有显示出来,没有报错,图层也加上了,这是什么原因?

【解决方案】
官方给出的答案,是在路由切换的时候,将组件进行销毁操作,这个问题,后期官方会进行修改。


(2) 无法在同一个位置绘制点
我监听地图函数,点击点时候创建了一个Marker,并在这个marker周围用new AMap.Circle 绘制了一个圆,当我从地图上移除了这个marker和circle之后,再次点击同一个位置,地图的click就不会响应了,但是在这个圆之外,就可以响应地图点击事件,再次创建一个marker和圆,感觉是地图上的circle没有清除,但是实际上,地图上已经没有了这个圆。

1
2
3
4
5
6
// 删除图像和marker
map.remove(state.marker);
state.marker=null;
state.circle.destroy();
map.remove(state.circle);
state.circle=null;

【解决方案】
群里的大佬给出的方案,就是不要将地图上的对象放到响应式的数据中。

(3) 地图上的infowindows中的滚动条滚动时导致地图缩放
在使用infowindows的时候,如果infowindows中有滚动条,使用鼠标滚轮滚动的时候,就会导致地图也滚动。

【解决方法】
还是高德钉钉群里的大佬说的,就是监听鼠标滚轮事件,然后禁止事件冒泡,我这里使用的时el-scroll,并且是vue 3.0,主要代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
<template>
<div class="info-wrap">
<div class="name">{{currAttr.JZMC}}</div>
<el-scrollbar style="height: 200px;" class="scroll-wrap" ref="scrollbar">
</el-scrollbar>
</div>
</template>

<script>

export default {
setup(){
const scrollbar = ref(); // scrollbar是页面ref后面对应的名字
// 组件挂载时执行
onMounted(()=>{
nextTick(()=>{
// 监听鼠标滚轮事件,禁止冒泡,解决高德info穿透的bug
let scrollWrap=scrollbar.value.scrollbar;
scrollWrap.addEventListener("wheel",function(e){
e.stopPropagation();
return false;
})
})
});

return {
scrollbar,
}
}
}

</script>

5.数据解析

参考文章:
1.某德地图矢量瓦片逆向(快速wasm逆向),c/c++/c#可调用,执行wasm2c翻译出来的c代码一 执行wasm2c翻译出来的c代码,快速wasm逆向,c/c++/c#/python可调用
2.地图数据下载技术集合

6.绘制区域

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// 显示行政区
var disLayer=new AMap.DistrictLayer.Province({
zIndex:9,
adcode:['330110'],
depth:2,
styles:{
'fill':'rgba(0,0,0,0.6)',
'province-stroke':'cornflowerblue',
'city-stroke': 'white',//中国地级市边界
'county-stroke': 'rgba(255,255,255,1)',//中国区县边界
'stroke-width':2,
}
});
// 添加到地图上
mainmap.addLayer(disLayer);

参考文章:
1.高德地图绘制区域边界线

6.Deepin上的浏览器显示版本过低

我在Deepin上进行开发,无论使用自带的浏览器,还是使用最新的deb安装的谷歌浏览器,都出现了问题。显示:浏览器版本过低,请升级最新版本的浏览器,或使用高版本火狐、谷歌等浏览器。

我以为是自己浏览器版本不对,从官方下载了谷歌,也下载了火狐,都是显示这个错误,我的谷歌的浏览器:版本 96.0.4664.45(正式版本) (64 位)。

[尝试]
经过高德钉钉开发群里的 @吴桐 进行了点播,输出了浏览器的显卡信息:

1
2
3
4
5
6
7
8
9
10
(function () {
var canvas = document.createElement('canvas'),
gl = canvas.getContext('experimental-webgl'),
debugInfo = gl.getExtension('WEBGL_debug_renderer_info');

console.log(gl.getParameter(debugInfo.UNMASKED_RENDERER_WEBGL));
})();

/// 结果输出了
// ANGLE (Intel, Mesa Intel(R) UHD Graphics 630 (CFL GT2), OpenGL 4.6 (Core Profile) Mesa 20.3.4)

[解决]
在加载js代码的以前,强制开启GPU,这个问题同样出现在手机端浏览器中,在电脑端会显示出地形渲染,在手机端就会显示一片空白,也是通过在脚本加载之前 forceWebGL 进行处理。

1
window.forceWebGL = true; // 强制启动WebGL 

参考文章:
1.如何启用或禁用 Chrome 硬件加速功能 使用 chrome://gpu/ 查看是否开启了硬件加速

7.手机无法开启地形渲染

我在2.1Bate版本中开启了地形,用了上面的 forceWebGL 属性,出现的问题就是在地图放大到一定的级别的时候,会有地形显示,但是缩小到一定的范围之后,就是空白。手机是iphone6s,无论是在谷歌浏览器,还是safari浏览器,还是钉钉、微信自带的浏览器都是这个问题。

我做了很多测试,都是不行的,这是手机上不同分辨率下的截图,可以看到,缩小到一定的级别,连道路网都没有了,这可以排除网络的问题。

当我关闭地形显示,重新部署,虽然缩小地图不再出现空白了,但是只渲染了注记层,有时候渲染出来了地图道路图层,但是当移动地图的时候,发现只有注记层跟着移动,底图道路面等不跟着移动。而且我自己使用Loca加载的geojson也会复制一份跟随注记移动,但是会原始的那一份还是不动。

最初的问题,就是开启了地形显示之后,手机上就是一片空白,然后我开启了window.forceWebGL = true; 地图缩小到一定的级别,还是空白,但是放大到十几二十几级,地形和底图什么的都先显示了,我后来关闭了地形显示,再次测试,还是出现了问题。重新部署,虽然缩小地图不再出现空白了,但是只渲染了注记层,有时候渲染出来了地图道路图层,但是当移动地图的时候,发现只有注记层跟着移动,底图道路面等不跟着移动。而且我自己使用Loca加载的geojson也会复制一份跟随注记移动,但是会原始的那一份还是不动。手机是iphone6s,浏览器无论是用谷歌浏览器,还是safari浏览器,还是在钉钉里面用钉钉直接打开这个网址,都是同样的问题。

我怀疑jssdk 2.1Beta 和loca 2.0是不是不兼容呢,只要不使用loca加载json,就不会出现问题。如果使用了loca加载了数据,就会出现缩小到一定的级别,就会出现空白的现象。在高德开发者交流群里,官方给出的回应是,现在不支持,结果就没有了下文了,看来,只能等到官方自己修复了。

8.配置密钥

浙政钉里面的地图无法显示自定义样式,已经开启了 window.forceWebGL = true; 这怎么解决? 群里有人说要配置密钥,于是我就尝试了配置密钥。其实我以前配置过一次,后来忘记了。

前端配置:

1
2
3
4
5
// 在使用 AMapLoader.load API加载高德地图之前
window._AMapSecurityConfig = { // 加载密钥
serviceHost:'https://openmap.tech/_AMapService'
}

后端配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 自定义地图服务代理
location /_AMapService/v4/map/styles {
set $args "$args&jscode=密钥";
proxy_pass https://webapi.amap.com/v4/map/styles;
}
# 海外地图服务代理
location /_AMapService/v3/vectormap {
set $args "$args&jscode=ccaa0ac9b3067bef75f9d32ee853a78c";
proxy_pass https://fmap01.amap.com/v3/vectormap;
}
# Web服务API 代理
location /_AMapService/ {
set $args "$args&jscode=ccaa0ac9b3067bef75f9d32ee853a78c";
proxy_pass https://restapi.amap.com/;
}

参考文章:
1.JSAPI 的加载

9.浙政钉上无法显示自定义样式

在火狐浏览器中,在其他的一些浏览器中,都是可以显示自定义的样式,但是在浙政钉上,确实显示不了。官方没有答案,就在高德开发者群里的交流圈问了,刚开始让我配置密钥,可是我配置了密钥也不行。有人回答说:“window.forceWebGLBaseRender = true 试试”,结果试来试去,都不行。最后回答说:“那就没办法了,没有硬件加速,用不了自定义地图和3D地图”

高德地图在浙政钉中有如下问题:

  • 1.无法使用影像地图
  • 2.无法使用loca模块

【解决方案】
我问了高德的开发人员,他说没有GPU加速,无法使用自定义地图和3D地图。我问了钉钉的开发人员,他说目前钉钉内置的浏览器不支持GPU加速,我参考了钉钉的开发文档,没有方法能直接调用系统默认的浏览器打开外部页面。现在只能是说检测到钉钉环境,就弹出一个窗口,说让用户自己在浏览器中打开页面。

小额赞助
本人提供免费与付费咨询服务,感谢您的支持!赞助请发邮件(ititchuan@gmail.com)通知,方便公布您的善意!
**光 3.01 元
Sun 3.00 元
ititchuan 3.00 元
微信公众号
广告位
诚心邀请广大金主爸爸洽谈合作
每日一省
isNaN 和 Number.isNaN 函数的区别?

1.函数 isNaN 接收参数后,会尝试将这个参数转换为数值,任何不能被转换为数值的的值都会返回 true,因此非数字值传入也会返回 true ,会影响 NaN 的判断。

2.函数 Number.isNaN 会首先判断传入参数是否为数字,如果是数字再继续判断是否为 NaN ,不会进行数据类型的转换,这种方法对于 NaN 的判断更为准确。

每日二省
为什么0.1+0.2 ! == 0.3,如何让其相等?

一个直接的解决方法就是设置一个误差范围,通常称为“机器精度”。对JavaScript来说,这个值通常为2-52,在ES6中,提供了Number.EPSILON属性,而它的值就是2-52,只要判断0.1+0.2-0.3是否小于Number.EPSILON,如果小于,就可以判断为0.1+0.2 ===0.3。

每日三省
== 操作符的强制类型转换规则?

1.首先会判断两者类型是否**相同,**相同的话就比较两者的大小。

2.类型不相同的话,就会进行类型转换。

3.会先判断是否在对比 null 和 undefined,是的话就会返回 true。

4.判断两者类型是否为 string 和 number,是的话就会将字符串转换为 number。

5.判断其中一方是否为 boolean,是的话就会把 boolean 转为 number 再进行判断。

6.判断其中一方是否为 object 且另一方为 string、number 或者 symbol,是的话就会把 object 转为原始类型再进行判断。

每日英语
Happiness is time precipitation, smile is the lonely sad.
幸福是年华的沉淀,微笑是寂寞的悲伤。