高德地图API之边界墙效果

标签: 无 分类: 未分类 创建时间:2022-08-01 03:29:19 更新时间:2025-01-17 10:39:24

根据参考文章1的文章说明,结合官方的GLCustome自定义图层,我补充了参考文章1中没有的代码,完成了一个动态渐变的范围墙示例,参考代码,使用方式,我就直接上代码了,原理的话,就去看参考文章1好了。

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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
// 引入自定义的类
import {WallLayer} from './WallLayer'

window.forceWebGL = true; // 强制启动WebGL
// window.forceWebGLBaseRender = true; // 开启GL
window._AMapSecurityConfig = { // 加载密钥
serviceHost:'xxx'
}
// 使用API加载高德地图
AMapLoader.load({
"key": "xxx", // 申请好的Web端开发者Key,首次调用 load 时必填
"version": "2.0", // 指定要加载的 JSAPI 的版本,缺省时默认为 1.4.15
"plugins": ['Map3D','AMap.DistrictSearch','AMap.DistrictLayer'], // 需要使用的的插件列表,如比例尺'AMap.Scale'等
"AMapUI": { // 是否加载 AMapUI,缺省不加载
"version": '1.1', // AMapUI 缺省 1.1
"plugins":[], // 需要加载的 AMapUI ui插件
},
"Loca":{ // 是否加载 Loca, 缺省不加载
"version": '2.0' // Loca 版本,缺省 1.3.2
},
}).then((AMap)=>{
let pitch=50;
// 加载地图
mainmap=window.mainmap=new AMap.Map('mapContainer',{
mapStyle: 'amap://styles/xxx', //设置地图的显示样式
center:[119.978873,30.273852], // 设置中心
zoom:11,
viewMode:'3D',
pitch:pitch,
showBuildingBlock:true, // 显示3D楼宇
skyColor:'', // 天空颜色
});

// 保存地图
store.commit("setMap",markRaw(mainmap));
store.commit("setMapComplated",true);

new WallLayer([120.002, 30.355],3000);
// 绘制影响范围
let eventCircle = new AMap.Circle({
center: [120.002, 30.355],
radius: 3000, //半径
borderWeight: 3,
strokeColor: "#FF33FF",
strokeWeight: 6,
strokeOpacity: 0.2,
fillOpacity: 0.4,
strokeStyle: 'dashed',
strokeDasharray: [10, 10],
// 线样式还支持 'dashed'
fillColor: '#1791fc',
zIndex: 5,
})
// 添加到地图上
eventCircle.setMap(mainmap);

}).catch(e => {
console.log(e);
});

使用上面的代码,就可以绘制一个具有动态效果的范围墙。

参考文章:
1.在高德地图中进行THREE开发-边界墙图层 这里使用了Threejs结合高德地图生成了一个范围墙,大部分的除了高德部分的代码都有了。
2.官方结合gl的例子

问题

(1) 坐标偏移问题
如果在地图的同一个位置上,添加一个圆,就会发现生成的范围墙和绘制的圆不能完全的套牢。

自定义图层 这个示例中用到了一个 map.customCoords; 这个属性,渲染的时候,必须设置这个位置的 customCoords.setCenter([116.52, 39.79]); 但是我把它换成了地图的中心,这个就不行了,这个设置中心有什么讲究吗?我在js参考文档里面没有找到这个属性说明。

@官方说:这是一个坐标系原点,会影响相机,如果想修改他,那么也要重新生成数据。

这里 是我的测试代码,我调用了 createInfluenceRange 借助于turf.js生成的圆,还有就是调用 createDistrict 这个获取区县范围直接生成范围,都和地图无法套合,生成的范围墙有偏移。后来我用了和张同学一模一样的代码,还是不行,但是在一个独立的demo中这段代码初始值就可以套合。差点崩溃了,后来我发现了一个问题,就是我改变浏览器的大小,这个红框的大小也会变化,问题可能并不是关于这个坐标中心的问题,而是为什么我进入地图,这个地图容器的大小为什么会变化,这个地图容器的定位方式是不是有问题?

【解决方案】
这个问题主要就是我创建的范围墙和底图生成的圆没法套和,经过我不断的尝试,以及询问相关人员,发现同样的代码,当我地图存在于一个 router-view 之内的时候,也就是说刚开始地图不存在的时候,宽高需要动态获取的时候,这个时候初始化的范围墙就有可能有问题,获取到的threejs坐标,就会有偏差,目前我只能这么猜测,因为没有其他更好的原因了。

还有一个奇怪的地方,就是当我在 router-view 中初始化地图的时候,感觉整个地图特别的卡,难道这是我的错觉吗?希望是我的错觉好了。

文章目录
小额赞助
本人提供免费与付费咨询服务,感谢您的支持!赞助请发邮件通知,方便公布您的善意!
**光 3.01 元
Sun 3.00 元
bibichuan 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.
幸福是年华的沉淀,微笑是寂寞的悲伤。