最新要闻
- 旗袍发型教程_旗袍发型-天天即时看
- 阿斯巴甜将被世卫列为“可能致癌物质”:元气森林、奈雪火速回应
- 丫丫解锁新玩具竹笼:一刻也没闲着
- 无糖可乐不能喝了?或含致癌物阿斯巴甜
- 天天观焦点:Steam将AI作图游戏拒之门外!除非能证明拥有版权
- 环球热讯:红米Redmi Pad 2平板跑分曝光:配骁龙680 或近期发布
- 新市街道开展“健康无毒 喜迎大运”6.26禁毒宣传日活动
- 天天观点:内爆致5人遇难!美国泰坦号观光潜艇失事残骸打捞上岸
- 1200mAh锂电池+三档风力调节:佳格手持小风扇8.9元狂促_全球今日讯
- 世界时讯:最好的Windows掌机!ROG Ally暴力魔改8TB SSD:容量陡增8倍
- 当前热讯:重要提醒!暴雪国服游戏退款申请明日将截止
- 【当前独家】张颂文北影毕业典礼演讲:希望你们每天都在进步
- 【世界速看料】不吝赐教的意思(赐教的意思)
- 联发科MT6825芯片组获上海MWC 2023亚洲突破性设备创新大奖!手机卫星可双向通信_焦点资讯
- 支持Type-C充电:英菲克F1无线鼠标24.9元抄底
- 天天热消息:做错N多年!央视科普:鸡蛋别再放到冰箱门上了
手机
光庭信息跌4.57% 2021上市超募11亿2022扣非降74% 时快讯
搜狐汽车全球快讯 | 大众汽车最新专利曝光:仪表支持拆卸 可用手机、平板替代-环球关注
- 光庭信息跌4.57% 2021上市超募11亿2022扣非降74% 时快讯
- 搜狐汽车全球快讯 | 大众汽车最新专利曝光:仪表支持拆卸 可用手机、平板替代-环球关注
- 视点!美国首位女总统即将诞生?拜登恐怕要提前下岗,美政坛迎来变局?
- 当前速递!用理想仪器实现更好的颗粒 德国新帕泰克亮相CPHI & PMEC China获好评
- 微粒贷怎么申请开通 开通方法如下
- 焦点简讯:心疼!这位40岁的云南缉毒警,已是满头白发
家电
记录--写一个高德地图巡航功能的小DEMO
这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助
风格设置
加载地图
使用AMapLoader.load
加载地图,从控制台申请一个属于自己的key
import AMapLoader from "@amap/amap-jsapi-loader";...const AMap = await AMapLoader.load({ "key": "您自己申请的KEY", // 申请好的Web端开发者Key,首次调用 load 时必填 "version": "2.0", "plugins": ["AMap.Walking", "AMap.Driving"], // 需要使用的的插件列表,如比例尺"AMap.Scale"等 "Loca": { version: "2.0.0" }})
使用new AMap.Map
实例化地图,并设置mapStyle
为"amap://styles/grey"
,也可以在官网上自己设计属于自己的风格,主要讲的不是这部分所以大概交代一下就过去了,实例化Map后返回一个map实例,后续的操作都需要用到。
添加GLCustomLayer图层
new AMap.GLCustomLayer({ zIndex: 100, init:()=>{}, render: ()=>{}})
threejs的加载和创建需要在init
属性的方法里操作,render主要是用来渲染一些镜头信息和WebGLRenderer
的重绘。
【资料图】
在init方法中创建一个THREEJS的透视相机
camera = new THREE.PerspectiveCamera(60, window.innerWidth / window.innerHeight, 100, 1 << 30);
镜头信息的获取
前文实例化Map后获取一个map的实例,其中提供了customCoords
数据转换的工具,可以从这里获取到镜头信息,后续转化经纬度到3D世界坐标时候也会用到,转换工具需要提前获取到,方便后续的工作。
var { near, far, fov, up, lookAt, position } = customCoords.getCameraParams();
转换工具提供一个getCameraParams
方法,其中包含相机位置等其他属性
fov — 摄像机视锥体垂直视野角度near — 摄像机视锥体近端面far — 摄像机视锥体远端面
其中大部分属性都和threejs的透视相机属性相同,在render方法中更新相机,这样做的作用就是在后续做巡航功能时会实时更新相机位置
camera.near = near;camera.far = far;camera.fov = fov;camera.position.set(...position);camera.up.set(...up);camera.lookAt(...lookAt);camera.updateProjectionMatrix();
初始化loca
可视化图层需要用到Loca
容器,需要在地图外绘制的图层,需要在可视化图层上绘制,
创建可视化作品前,首先要创建一个 Loca 容器,这个容器可以帮您加载高德地图作为底图,或者帮您关联已有的高德地图作为底图。在使用地图的时,您可以使用任何一个 JS API 已有的功能,Loca 容器不会影响原有地图的任何功能和特性。这里创建的 Loca 容器您可以理解为是可视化图层的管理器。
注意:创建地图时候 Loca 版本要和map的版本一致,否则会报错
var loca = new (window as any).Loca.Container({ map, zIndex: 9});将创建好的
AMap.GLCustomLayer
添加到map图层const customLayer = await createGLCustomLayer(AMap, customCoords) map.add(customLayer);
createGLCustomLayer
方法就是之前定义的初始化AMap.GLCustomLayer
方法。返回一个GLCustomLayer
实例,这样就可以在地图内插入可视化内容。
加载模型
回到new AMap.GLCustomLayer
提供的init属性中,创建一个3d场景并把模型加载到场景中,
renderer = new THREE.WebGLRenderer({ context: gl, // 地图的 gl 上下文});// 自动清空画布这里必须设置为 false,否则地图底图将无法显示renderer.autoClear = false;scene = new THREE.Scene();加载模型方法跟threejs相同,使用
gltfloder
api,加载方法返回一个promise,再使用// 初始化模型function initGltf(): Promise{ return new Promise((resolve, reject) => { var loader = new GLTFLoader(); loader.load("https://a.amap.com/jsapi_demos/static/gltf/Duck.gltf", (gltf: any) => { let object = gltf.scene; resolve(object) }); })}
模型添加到场景
const { x, y, z } = setRotation(new THREE.Vector3(90, 90, 0))object.scale.set(15, 15, 15);group.add(object)group.add(new THREE.AxesHelper(100))scene.add(group)object.name = "duck"
我在模型上添加了一个AxesHelper
辅助线,官网上表示蓝色代表z轴,但是放在地图中发生了坐标方向不一致的问题,threejs的向上方向是y轴,地图中z是向上方向,这一点可能要注意一下了
用于简单模拟3个坐标轴的对象.红色代表 X 轴. 绿色代表 Y 轴. 蓝色代表 Z 轴.
旋转模型
const { x, y, z } = setRotation(new THREE.Vector3(90, -90, 0))group.rotation.set(x, y, z)获取旋转角度的方法
export function setRotation(rotation: THREE.Vector3) { var x = Math.PI / 180 * (rotation.x || 0); var y = Math.PI / 180 * (rotation.y || 0); var z = Math.PI / 180 * (rotation.z || 0); return new THREE.Vector3(x, y, z)}
计算轨迹
使用viewControl
现在模型已经加载好,接下来就是要获取轨迹数据,镜头跟踪在Loca中有相应的apiviewControl
,使用这个api调用addTrackAnimate
方法,提供对应参数即可;
loca.viewControl.addTrackAnimate({ path: pathArr, // 镜头轨迹,二维数组,支持海拔 duration: 120000, // 时长 timing: [[0, 0.3], [1, 0.7]], // 速率控制器 rotationSpeed: 1800, // 每秒旋转多少度}, function () { console.log("完成",);});
pathArr
是一个轨迹数组,const pathArr = [[116.310348, 39.89702], [116.310541, 39.884855], [116.320963, 39.889154], [116.322894, 39.889608], [116.325542, 39.889822], [116.328074, 39.889761], [116.349104, 39.889429], [116.348517, 39.89747], [116.355205, 39.898413], [116.35656, 39.90021], [116.355802, 39.93225]]为了方便查看,我们在使用Loca提供的绘制引导线功能将这几个关键点连接的引导线画一下
// 导航线var polyline = new AMap.Polyline({ path: pathArr, // 设置线覆盖物路径 showDir: true, strokeColor: "#3366bb", // 线颜色 strokeWeight: 10, // 线宽 zIndex: 1});map.add(polyline)
以上工作做完后,需要调用一下loca.animate.start();
方法,否则可视化图层不会更新,相应数据也获取不到,现在画面变成这样了
除了以上这种方法去实现镜头的移动,还可以通过插入坐标的方式去实现,也是传统threejs中使用的方法,就是利用tweenjs
的动画,运动过程中改变map.setCenter
,实现跟踪,这部分代码在changeObject
方法中,感兴趣的可以去 仓库 查看,
镜头跟踪
移动模型
利用requestAnimationFrame
函数写一个循环渲染的方法,在调用的同时获取镜头中心坐标,通过customCoords
转换工具将经纬度转为3D世界的坐标,并将该坐标赋值给object模型,再通过map提供的getRotation
方法,获取地图的旋转角度,并将该角度赋值给object模型的y轴,使模型沿着y轴旋转,至于旋转的速度,在前面定义addTrackAnimate
时的rotationSpeed
属性定义的
const render = () => { requestAnimationFrame(() => { render() }) if (object) { const center = map.getCenter() var position = customCoords.lngLatsToCoords([ [center.lng, center.lat] ])[0]; const v3 = new THREE.Vector3(position[1], 0, position[0]) object.position.copy(v3) const rotation = map.getRotation() object.rotation.y = rotation * Math.PI / 180 } map.render(); TWEEN && TWEEN.update()}
以上文章内容有一些关于threejs的基础知识,可以先提前了解一下,否则有很多好玩有趣的效果实现不出来。
其他
关于飞线,只是作为装饰,显得画面不那么呆板,在官网上也有案例,简单贴一个代码吧
// 飞线var geo = new (window as any).Loca.GeoJSONSource({ url: "https://a.amap.com/Loca/static/loca-v2/demos/mock_data/bj_bus.json",});var layer = new (window as any).Loca.PulseLineLayer({ // loca, zIndex: 10, opacity: 1, visible: true, zooms: [1, 30],});var headColors = ["#EFBB51", "#7F3CFF", "#4CC19B", "#0B5D74", "#E06AC4", "#223F9B", "#F15C1A", "#7A0FA6"];layer.setSource(geo);layer.setStyle({ altitude: 0, lineWidth: 2, // 脉冲头颜色 headColor: (_, feature) => { return headColors[feature.properties.type - 1]; }, // 脉冲尾颜色 trailColor: "rgba(128, 128, 128, 0.5)", // 脉冲长度,0.25 表示一段脉冲占整条路的 1/4 interval: 0.25, // 脉冲线的速度,几秒钟跑完整段路,可以通过计算距离动态改变时间 duration: 5000,});// 飞线结束loca.add(layer);
本文转载于:
https://juejin.cn/post/7242145254056673335
如果对您有所帮助,欢迎您点个关注,我会定时更新技术文档,大家一起讨论学习,一起进步。
关键词:
记录--写一个高德地图巡航功能的小DEMO
旗袍发型教程_旗袍发型-天天即时看
世界实时:债市日报:6月29日
阿斯巴甜将被世卫列为“可能致癌物质”:元气森林、奈雪火速回应
丫丫解锁新玩具竹笼:一刻也没闲着
无糖可乐不能喝了?或含致癌物阿斯巴甜
天天观焦点:Steam将AI作图游戏拒之门外!除非能证明拥有版权
环球热讯:红米Redmi Pad 2平板跑分曝光:配骁龙680 或近期发布
新市街道开展“健康无毒 喜迎大运”6.26禁毒宣传日活动
天天观点:内爆致5人遇难!美国泰坦号观光潜艇失事残骸打捞上岸
1200mAh锂电池+三档风力调节:佳格手持小风扇8.9元狂促_全球今日讯
世界时讯:最好的Windows掌机!ROG Ally暴力魔改8TB SSD:容量陡增8倍
当前热讯:重要提醒!暴雪国服游戏退款申请明日将截止
【当前独家】张颂文北影毕业典礼演讲:希望你们每天都在进步
【世界速看料】不吝赐教的意思(赐教的意思)
Spring Cloud 如何引入云原生网关,创新微服务架构|天天最新
拈花云科基于 Apache DolphinScheduler 在文旅业态下的实践
.NET 个人博客-添加RSS订阅功能 世界快播
如何将视频文件.h264和音频文件.mp3复用为输出文件output.mp4?
天天热资讯!商品日报(6月29日):尿素再度拉涨超5% 供应利多刺激甲醇盘中涨超3%
联发科MT6825芯片组获上海MWC 2023亚洲突破性设备创新大奖!手机卫星可双向通信_焦点资讯
支持Type-C充电:英菲克F1无线鼠标24.9元抄底
天天热消息:做错N多年!央视科普:鸡蛋别再放到冰箱门上了
要求罚金30亿美元!Chatgpt涉嫌信息盗窃被起诉 全球视讯
官方辟谣激情誓师女生考508分:女生考了600多分 考得特别好 环球焦点
全球低水足迹倡议(LWFi)联盟扩容,伊利“双足迹”开启全链减碳新篇章_世界视点
IDA的使用-1_世界新消息
clop勒索软件攻击活动频发,西门子能源中招_世界观察
精彩看点:构建数字工厂丨数据分析与图表视图模型的配置用法
券商数字化创新场景数据中台实践
热门看点:C# 序列化大小写 序列化对象为大小写 JsonConvert.SerializeObject
新款2024MGCyberster泄露 当前热讯
第十四届夏季达沃斯论坛闭幕
天天快讯:暴露年龄!时隔16年 Office“大眼夹”回归Windows 11:功能焕然一新
16.5亿打造!《封神》妲己首次亮相引热议 网友称妆造诡异在拍画皮吗
苹果之后 三星被指侵犯加州理工Wi-Fi专利:索赔可达数十亿美元-世界新消息
“快乐水”不快乐了!阿斯巴甜将被定为可能致癌物质|天天热资讯
华为发布F5.5G智简全光联接四大创新:万兆时代来了
讯息:大宗交易:蓝色光标成交6967.8万元,折价1.96%(06-29)
解读 RocketMQ 5.0 全新的高可用设计
探秘华为云盘古大模型:AI for industries的身体力行_报道
天天速读:高铁踹老头底被曝
科创板收盘播报:科创50指数跌0.67% 新股时创能源较发行价涨63.91%|全球热闻
如何使用 iOS 17 将照片变成 iMessage 贴纸
多家高校下月起停用微信支付 微信团队致歉:即刻修正
鳄鱼独居16年产子 科学家:濒临灭绝物种的生存策略
南极人纯棉抗菌袜子8双14.9元:吸湿排汗 亲肤透气
【全球报资讯】多家高校下月起停用微信支付 腾讯回应网友不买账:专家称反垄断太有意义
Intel四代至强命运多舛:突曝严重Bug 部分停止出货
精彩看点:司法部出手!这项业务,有大变化!
【后端面经-Java】公平锁和加锁流程 全球简讯
讯息:玖章算术与百度智能云达成合作,「NineData SQL 开发」成为百度智能云主推的数据库工具
【高端访谈】中非经贸博览会将助力刚中贸易提质升级——访刚果(金)外贸部长布萨_当前视讯
央企改革三年重点任务考核结果出炉:三大运营商排名一一曝光
摩托骑手被汽车撞下高架 现场惨!官方通报:系被追尾 伤者暂无生命危险
立白洗衣液大促:山茶幽香、除菌除螨 10斤到手38元_每日简讯
MWC牌面!魅族Flyme Auto上央视:车机互联打通软硬件|当前快看
露牙媚眼羞涩笑主播圈粉中老年人:当当网李国庆在线求合作
每日消息!索尼ZV-E1“打鸡血”:免费升级4K 120p拍摄
年内8家“袖珍”IPO公司登陆港交所-天天观天下
鼎通科技(688668):该股换手率大于8%(06-29)_世界速讯
性能4倍于1060!RTX 4060今天开售:2399元 英伟达诚意感受到没-当前速读
世界即时看!疑因不满项目谈判被提前泄露:特斯拉或已放弃在西班牙建厂!
今日讯!内蒙古康巴什区:让“梧桐树”更加枝繁叶茂
环球播报:装机选500W电源就是万金油?你又错了
海南环岛旅游公路主线路基段即将完工:12月底通车 串联全省景点|独家
Windows自带杀软又出问题:Defender新版CPU占用过高|环球焦点
每部手机都有的出厂标签要改了!工信部:7月1日起正式启用新型进网许可标志
90后宝妈沙漠边缘送奶茶月入7000 我能赚钱生娃:直言男人除了赚钱还能干啥? 当前速递
卢卡申科:普京曾有意杀死普里戈任,我劝他不要鲁莽行事
数字经济催生的低代码开发浪潮,JNPF带你轻松实现应用程序拓展! 天天日报
直播平台源码功能分享:直播回放功能的实现_当前看点
【天天快播报】云顶新耀-B早盘持续走高涨近9% 中金维持跑赢行业评级
能在车上点外卖了!特斯拉或将推出应用商城 可支持第三方应用与服务 热点聚焦
法庭文件出纰漏 五星大饭店运营成本曝光|实时焦点
剑指比亚迪海豚 宝骏云朵外观细节图发布:全球顶级设计师操刀 环球观察
40度高温杀回马枪!南方多地加入高温群聊蒸桑拿
传奇女歌手麦当娜进ICU:因细菌感染_每日看点
宁德时代联合长安汽车等共设动力电池公司
js的Set数据类型
Linux_Centos 增加中文字体支持|环球视点
直播系统聊天技术(九):千万级实时直播弹幕的技术实践
天天看热讯:【Oracle】使用PL/SQL实现冒泡排序
BackboneJS教程_编程入门自学教程_菜鸟教程-免费教程分享 环球关注
环球快讯:智能合约在数字人民币中的应用与治理
2023年普通高校招生录取工作即将开始,教育部发出提醒——高校招生录取期间谨防受骗
世界速讯:47度高温!印度遭极端“烤验”:近期已造成多人死亡
网易游戏公布暑假未成年人限玩时间:大模型干预不理性消费_全球热头条
全球观速讯丨比NS还小却塞进AMD 7840U!AYANEO公布新掌机AIR 1S
焦点热门:599元 小米电视EA32上架:升级5GHz Wi-Fi、分辨率不足1080P
1099元起 Redmi Note 12R发布:首发第二代骁龙4
女子称喂奶后发现医院母婴室装有摄像头?院方回应 信息
天天新资讯:k8s 深入篇———— 守护容器[九]
Spring Boot 项目设计业务操作日志功能,写得太好了!-世界即时看
毕业季,科学城幼儿园大班萌娃用画笔勾勒未来|当前热文
辽宁:全链条打击证券犯罪 去年以来追赃挽损7.14亿余元
上海电气印度业务被诈骗88亿 反被索赔21亿?官方辟谣-环球微头条
腾讯回应数百人部门解散:正常架构调整 不涉及人员优化 每日聚焦
iPhone上市开售16周年:共38款机型 售价越来越贵_独家焦点
全国首位视障播音硕士毕业:键盘盲打完成6万字论文 9年读了百本盲书-天天热门