记录--写一个高德地图巡航功能的小DEMO

这篇具有很好参考价值的文章主要介绍了记录--写一个高德地图巡航功能的小DEMO。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助

记录--写一个高德地图巡航功能的小DEMO

记录--写一个高德地图巡航功能的小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相同,使用gltfloderapi,加载方法返回一个promise,再使用
// 初始化模型
function initGltf(): Promise<THREE.Object3D> {
    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'

记录--写一个高德地图巡航功能的小DEMO

我在模型上添加了一个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)
}
 

记录--写一个高德地图巡航功能的小DEMO

计算轨迹

使用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();方法,否则可视化图层不会更新,相应数据也获取不到,现在画面变成这样了

记录--写一个高德地图巡航功能的小DEMO


除了以上这种方法去实现镜头的移动,还可以通过插入坐标的方式去实现,也是传统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的基础知识,可以先提前了解一下,否则有很多好玩有趣的效果实现不出来。

记录--写一个高德地图巡航功能的小DEMO

其他

关于飞线,只是作为装饰,显得画面不那么呆板,在官网上也有案例,简单贴一个代码吧

 // 飞线
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文章来源地址https://www.toymoban.com/news/detail-508792.html

到了这里,关于记录--写一个高德地图巡航功能的小DEMO的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 申请高德地图API【流程记录】

    现在我们需要使用高德地图的api进行功能的实现,这就需要我们申请一个高德地图的key 1.进入官网 登录账号 点击高德开放平台 | 高德地图API (amap.com)。进行登录 选择控制台 注册为开发者 填写邮箱获取验证码后,进行支付宝扫码进行实名认证 注册完成 点击确认即可 2.申请

    2024年01月17日
    浏览(39)
  • 记录--在高德地图实现卷帘效果

    今天介绍一个非常简单的入门级小案例,就是地图的卷帘效果实现,各大地图引擎供应商都有相关示例,很奇怪高德居然没有,我看了下文档发现其实也是可以简单实现的,演示代码放到文末。本文用到了图层掩模,即图层遮罩,让图层只在指定范围内显示。 1.创建目标图层

    2024年02月13日
    浏览(54)
  • 记录--在高德地图实现流动的线图层

    有朋友反馈说最近分享的内容不太好理解,那么今天来分享个早前开发的图层制作过程,基于GIS数据代码生成流动的车行线,上手很简单。下面我将在实现思路、具体开发、数据来源这几方面逐步讲解,希望读者能从中获取对数据可视化开发的兴趣。文中使用到高德地图JSA

    2024年02月06日
    浏览(43)
  • Android中集成高德地图SDK实现地图定位和导航功能(一)

    名称和应用类型随便填 1.添加key 2.获取SHA1值 2.1.使用windwos+R 输入cmd 打开控制窗口 输入 where keytool 获取keytool的路径 2.2.在环境变量中配置keytools 的路径 2.3 然后接着cmd窗口中输入 keytool -v -list -keystore 后面是你签名证书的我的是keytool -v -list -keystore C:Users86181.androiddebug.keystor

    2024年02月12日
    浏览(88)
  • Android中集成高德地图SDK实现地图定位和导航功能(二)

    我们接着上一篇文章开始继续实现android中集成高德地图的SDK实现地图 定位,搜索,导航的功能 可以参考官方文档 android6.0以后需要动态申请权限 这里我就不做详细解释了 在androidMainfest文件的appliation 标签中添加之前在高的开发者平台上的key,代码如下 我的key是ba63b… 首先要

    2024年02月09日
    浏览(46)
  • Android高德地图定位实现签到打卡功能(全网最详细+收藏)

    前言         本章根据高德地图API,实现打卡签到功能。用到了定位SDK 和地图SDK、覆盖物。打卡范围图形可以支持多种形状,如: 圆形 、 长方形 、 多边形。 核心逻辑:     获取当前定位信息,然后通过Marker绘制小图标进行展示,并在onLocationChanged回调方法中不断重新绘

    2024年02月03日
    浏览(45)
  • flutter实现调用原生安卓的高德地图导航功能(插件化)

    查看了高德地图flutter插件的文档,都没有能支持导航的功能,并且flutter的高德插件支持的功能特别少,没办法,只能使用安卓原生的导航,flutter去调用了,具体实现方式如下: 创建 Flutter 插件 使用--template=plugin 声明创建的是同时包含了 iOS 和 Android 代码的 plugin; 使用--o

    2024年02月16日
    浏览(51)
  • Unity 关于制作一个2D的小地图

    实际效果:   需求:1.实现右上角小地图,实现同步本地地图           2.实现小地图内的角色图标和实际角色同步 实现原理: 1.在所需要的地图上划分为一下结构 图层Tilemap6_Minimap的Layer为Minimap 同时这里说一个问题,在同层级的图片,序列越晚渲染越上层 2.使用另一个摄像

    2024年02月14日
    浏览(43)
  • 高德地图API使用~Web开发~从创建到具体功能展示

    首先在拥有一个自己账号,其次高德开放平台注册一个自己的key值和密钥  然后在publicindex.html文件下,放上这段代码 然后找一个页面,  放上去。刷新,于是你就得到了一个这样的地图。  需要注意的点,初始化加载地图的时候,调用方法应该写在mounted而不是created中。其

    2024年02月06日
    浏览(41)
  • 记录下uniapp开发结合webview调用高德地图(路线规划,多路选择,双向通信)

    uniapp结合webview实现(微信和app上)简单版导航打车应用,总体实现方案是 在uniapp上嵌入web网页,在web网页上调用高德地图api实现渲染地图及路线 去高德开放平台注册账号并创建web应用,再生成web安全密钥和key 如果需要运行到微信上则需要开通微信公众平台上应用需要的定位

    2024年02月19日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包