`
hanbaobao
  • 浏览: 21420 次
最近访客 更多访客>>
社区版块
存档分类
最新评论

【百度地图API】如何利用地图API制作汽车沿道路行驶的动画?——如何获得道路层数据

阅读更多

有几个做汽车导航的朋友问我说,他们想在地图上制作一辆车沿着道路行驶 的动画。可是,百度地图道路数据没有公开 。所以,应该怎么办呢?

一、

我们先来学习如何把百度地图“弄”出来。把下面这段代码保存为htm格式,用浏览器打开,就能看到百度地图了。 

< html >
< head >
< meta http-equiv ="Content-Type" content ="text/html; charset=gb2312" />
< title > 点沿直线运动 </ title >
< script type ="text/javascript" src ="http://api.map.baidu.com/api?v=1.2&services=true" ></ script >
</ head >
< body >
< div style ="width:520px;height:340px;border:1px solid gray" id ="container" ></ div >
</ body >
</ html >
< script type ="text/javascript" >
var map = new BMap.Map( " container " ); // 创建地图容器
map.centerAndZoom( new BMap.Point( 116.404 , 39.915 ), 15 ); // 设置中心点和地图级别
</ script >

二、

再分析一下汽车导航制作者的这个需求:

1、车辆——用自定义图片的marker实现

var carMk = new BMap.Marker(pts[ 0 ],{icon:myIcon});
var myIcon = new BMap.Icon( " Mario.png " , new BMap.Size( 32 , 70 ), { // 小车图片
// offset: new BMap.Size(0, -5), //相当于CSS精灵
imageOffset: new BMap.Size( 0 , 0 ) // 图片的偏移量。为了是图片底部中心对准坐标点。
});

2、获取道路数据——虽然百度地图API并未公开道路层数据,但我们可以巧妙的“拿到”。具体请往下看。

三、

如何利用百度地图API拿到道路层的数据呢?

答案很简单:驾车导航。

首先讨论一下,为什么要用驾车导航,而不用步行和公交导航?

1、步行导航:步行导航显然能“穿越”公园、甚至小区,得到的肯定不是道路层的数据;

2、公交导航:公交导航虽然都是道路层的数据,但很局限,因为只有有公交车的地方,才有公交方案。并且,公交方法是包含了地铁线路的。

3、驾车导航:拥有所有道路层的数据,并且没有地铁、小区里、花园内这样的无效数据。

驾车导航示例:

var myP1 = new BMap.Point( 116.380967 , 39.913285 ); // 起点
var myP2 = new BMap.Point( 116.424374 , 39.914668 ); // 终点
var driving2 = new BMap.DrivingRoute(map, {renderOptions:{map: map, autoViewport: true }}); // 驾车实例
driving2.search(myP1, myP2); // 显示一条公交线路

四、

那么,如何获得道路层的数据呢?

我们可以想象一下,驾车导航的路线,在API中是属于折线。

折线是由无数的点构成的。

也就是说,只要找到这些点,我们就能获取道路层的数据了。

我们发现,Route里有个接口getPath,可以获得路线的地理坐标点数组。并且,以point数组的形式返回。

Route类参考:http://dev.baidu.com/wiki/map/index.php?title=Class:%E6%9C%8D%E5%8A%A1%E7%B1%BB/Route

利用创建好的驾车实例DrivingRoute,先search,得到一个驾车方案;

驾车方案中,选择第一条Route;

最后获得该Route的全部点。

注意,由于ajax的异步加载 机制,我们需要利用搜索后的回调函数setSearchCompleteCallback,来进行道路数据的获得。

driving.setSearchCompleteCallback( function (){
var pts = driving.getResults().getPlan( 0 ).getRoute( 0 ).getPath(); // 通过驾车实例,获得一系列点的数组
var paths = pts.length; // 获得有几个点
}

五、

道路数据获取完毕。接下来是汽车图片的展示。可以通过改变marker的坐标点来实现,改变marker坐标的接口setPosition。

我们假设每100毫秒改变一次,利用延时函数setTimeout。

同样,由于ajax异步加载原因,需要异步给i赋值。

i = 0 ;
function resetMkPoint(i){
carMk.setPosition(pts[i]);
if (i < paths){
setTimeout(
function (){
i
++ ;
resetMkPoint(i);
},
100 );
}
}
setTimeout(
function (){
resetMkPoint(
1 );
console.log(i);
},
100 )

六、

接下来,可以点击这里,运行示例。

点击左侧的“开始”按钮,动画开始播放。

点击下侧的“获取代码”按钮,可得到全部源代码。

七、

最后,放出全部源代码:

< html >
< head >
< meta http-equiv ="Content-Type" content ="text/html; charset=gb2312" />
< title > 点沿直线运动 </ title >
< script type ="text/javascript" src ="http://api.map.baidu.com/api?v=1.2&services=true" ></ script >
</ head >
< body >
< div style ="width:520px;height:340px;border:1px solid gray" id ="container" ></ div >
< input type ="button" value ="开始" onclick ="run();" />
</ body >
</ html >
< script type ="text/javascript" >
var map = new BMap.Map( " container " );
map.centerAndZoom(
new BMap.Point( 116.404 , 39.915 ), 15 );
var myP1 = new BMap.Point( 116.380967 , 39.913285 ); // 起点
var myP2 = new BMap.Point( 116.424374 , 39.914668 ); // 终点
var myIcon = new BMap.Icon( " Mario.png " , new BMap.Size( 32 , 70 ), { // 小车图片
// offset: new BMap.Size(0, -5), //相当于CSS精灵
imageOffset: new BMap.Size( 0 , 0 ) // 图片的偏移量。为了是图片底部中心对准坐标点。
});
var driving2 = new BMap.DrivingRoute(map, {renderOptions:{map: map, autoViewport: true }}); // 驾车实例
driving2.search(myP1, myP2); // 显示一条公交线路

function run(){
var driving = new BMap.DrivingRoute(map); // 驾车实例
driving.search(myP1, myP2);
driving.setSearchCompleteCallback(
function (){
var pts = driving.getResults().getPlan( 0 ).getRoute( 0 ).getPath(); // 通过驾车实例,获得一系列点的数组
var paths = pts.length; // 获得有几个点

var carMk = new BMap.Marker(pts[ 0 ],{icon:myIcon});
map.addOverlay(carMk);
i
= 0 ;
function resetMkPoint(i){
carMk.setPosition(pts[i]);
if (i < paths){
setTimeout(
function (){
i
++ ;
resetMkPoint(i);
},
100 );
}
}
setTimeout(
function (){
resetMkPoint(
5 );
console.log(i);
},
100 )

});
}
</ script >

分享到:
评论

相关推荐

    高德地图marker沿轨迹移动效果,适用步行、行车、运动等APP

    综上所述,实现高德地图Marker沿轨迹移动的关键在于处理轨迹数据、创建平滑动画以及合理管理地图交互。通过熟练掌握这些技术,开发者能够为用户构建出更加生动、真实的地图应用体验。记得在实践中不断优化和调整,以...

    安卓Android源码——百度手机地图 实例集合.zip

    5. **路径规划**:根据起点和终点,利用百度地图API计算出最佳行驶路线,包括驾车、步行和骑行等多种模式。这涉及到路线查询接口,解析返回的路线数据,然后在地图上绘制路线。 6. **地理编码与反地理编码**:将...

    安卓APP——地图定位器

    【安卓APP——地图定位器】 在移动互联网时代,地图定位器是智能手机中不可或缺的一部分,尤其在安卓平台上,它为用户提供精确的位置服务、导航以及路线规划等功能。安卓APP地图定位器通常利用GPS(全球定位系统)...

    Google Maps API之IAnimationControllerGE类使用

    在IT领域,Google Maps API是开发地图应用时广泛使用的工具,它允许开发者集成地图功能到自己的网站或应用程序中。在给定的标题“Google Maps API之IAnimationControllerGE类使用”中,我们聚焦于一个特定的类——`...

    HTML+CSS+JS数据可视化大屏平台模板实例23-智慧车联网

    3. 地图集成:利用地图API(如Google Maps API或Mapbox)展示车辆轨迹,结合JavaScript绘制点、线和多边形,形成直观的地理信息可视化。 4. 数据交互:例如,当用户点击某个车辆图标时,可以弹出详细信息窗口,显示...

    核心动画09

    【标题】"核心动画09"揭示了iOS开发中的一个重要概念——Core Animation,它是苹果操作系统中用于创建丰富、流畅视觉效果的关键技术。Core Animation能够帮助开发者实现复杂的2D动画效果,尤其是在用户界面的设计中...

    WebGIS 让小车沿着指定路径行走

    具体到“多车轨迹”这个文件,可能包含多个车辆的行驶轨迹数据,这些数据可能以KML(Keyhole Markup Language)或GPX(GPS eXchange Format)格式存储,它们是用于记录地理空间轨迹的标准格式。开发者需要解析这些...

    汽车的运动

    在本项目中,"汽车的运动"是一个利用计算机图形学原理用C++编程实现的程序。这个程序的主要目标是展示汽车在屏幕上动态行驶的效果,从而为观察者提供一种直观、生动的视觉体验。通过理解并应用图形学的核心概念,...

    火车查询系统

    在深入探讨这一系统之前,我们首先要理解其涉及到的关键技术——动画和数据库。 一、动画技术在火车查询系统中的应用 在用户界面设计中,动画不仅能够提升用户体验,还能使信息展示更加生动直观。在火车查询系统中...

    android 3D赛车

    首先,我们要理解3D游戏开发的基础——三维坐标系统。在Android平台上,通过OpenGL ES,开发者可以创建一个虚拟的3D空间,其中包含顶点、多边形、纹理等元素。在这个空间中,每个物体都有其在X、Y、Z三个轴上的坐标...

    MSC_Adams_v2012_64机械设计软件.rar

    1. **车辆动力学**:在汽车行业中,Adams用于优化悬挂系统、转向系统、发动机舱布局等,提高行驶稳定性和舒适性。 2. **航空工程**:在飞机设计中,它可以帮助分析飞行器的操纵性和颤振问题。 3. **机器人技术**:...

    Geisterfahrer-Spiel:基于 JavaScript 的逆向驾驶游戏

    **JavaScript逆向驾驶游戏——"幽灵司机"的深度解析** 在编程世界中,JavaScript作为最流行的客户端脚本语言,广泛应用于网页动态效果、交互设计以及游戏开发等多个领域。"幽灵司机"游戏就是这样一个利用JavaScript...

    paperboy:Igdt2014 课程作业的存储库

    《JavaScript在游戏开发工具课程中的应用——以"paperboy"为例》 在IT行业中,JavaScript是一种广泛应用于网页和网络应用开发的编程语言,其灵活性和跨平台特性使其在游戏开发领域也占据了一席之地。本篇文章将围绕...

    易语言LOGO支持库应用之海龟赛车

    在易语言中,这个支持库提供了类似的API,允许程序员控制一个虚拟海龟在屏幕上移动和绘制图形,非常适合用于创建简单的动画或游戏。 海龟赛车游戏通常涉及到以下几个核心概念和技术: 1. **坐标系统**:在LOGO支持...

    Xuenn.TrainLab:火车实验室

    最后,考虑到项目的实时性,项目可能运用了AJAX(异步JavaScript和XML)进行数据的动态获取和更新,虽然在现代Web开发中,fetch API已经逐渐取代了AJAX,但在旧版本的Xuenn.TrainLab中,我们仍有可能看到AJAX的身影...

    Corrida-Carros-Web:Jogos Digitais的原始设计

    项目名称“Corrida-Carros-Web”直译为“赛车-汽车-网络”,鲜明地揭示了游戏的核心内容——在网络环境中驾驶赛车进行竞速。 本项目基于JavaScript技术构建,这是一种广泛应用于网页开发的脚本语言,具有轻量级、...

    jixiansaiche.rar_DirextX编程_Visual_C++_

    7. **动画与物理模拟**:赛车的行驶、转弯、碰撞后的动作都需要通过动画和物理模拟来实现。Direct3D可以配合简单的物理引擎库来完成这部分工作。 8. **音效与音乐播放**:DirectSound组件用于处理游戏中的声音效果...

    CarRacingStage3

    开发者利用Canvas提供的绘图API,如`fillRect`、`beginPath`、`stroke`等方法,绘制赛车、赛道和其他视觉元素,并通过重绘实现动态效果。 4. **物理模拟** 赛车游戏需要模拟真实的物理运动,如摩擦力、加速度和...

Global site tag (gtag.js) - Google Analytics