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

简介: 原文:【百度地图API】如何利用地图API制作汽车沿道路行驶的动画?——如何获得道路层数据有几个做汽车导航的朋友问我说,他们想在地图上制作一辆车沿着道路行驶的动画。可是,百度地图的道路数据并没有公开。
原文: 【百度地图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 >
目录
相关文章
|
5天前
|
安全 数据挖掘 API
【实时数据】商品详情API接口系列开发
商品详情API接口系列对于电商平台至关重要,它们为开发者提供了实时、准确的商品信息,使得在线销售和展示商品变得更加高效和精准。以下是几个主要的电商平台及其商品详情API接口的介绍:
|
1月前
|
安全 Java 大数据
|
19天前
|
SQL API 数据库
为API设置默认排序规则结果数据的正确性
Dataphin数据服务支持API调用时通过OrderByList自定义排序,确保数据返回符合业务需求。默认排序在API设计时至关重要,因为它影响用户体验、数据一致性及查询正确性。新版本 Dataphin 提供了排序优先级设置,允许在SQL脚本或OrderByList中指定排序,以适应不同场景。
|
2天前
|
SQL 弹性计算 API
云服务器 ECS产品使用问题之如何通过API调用阿里云服务器上SQL Server数据库中的数据
云服务器ECS(Elastic Compute Service)是各大云服务商阿里云提供的一种基础云计算服务,它允许用户租用云端计算资源来部署和运行各种应用程序。以下是一个关于如何使用ECS产品的综合指南。
|
5天前
|
存储 JSON API
随机图片API源码(附新图片数据
含1000+HTTP图片,存储于企业空间,速度媲美新浪。计划扩展更多类别。基础调用:`http:///dm`,JSON格式:`http:///dm?return=json`。返回示例: ```json {
15 0
|
10天前
|
数据采集 DataWorks 监控
DataWorks产品使用合集之可以使用API来访问数据吗
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
17 6
|
13天前
|
机器学习/深度学习 自然语言处理 监控
从数据到决策:拼多多商品详情API在市场分析中的应用
本文探讨了如何利用拼多多商品详情API进行市场分析,该API提供商品基本信息、价格销量、用户评价和商品属性等数据,助力商家和分析师理解消费者行为、预测市场趋势、分析竞争环境及优化产品策略。通过数据收集、分析和整合,企业可借助此工具制定精准市场策略。案例展示了市场趋势、竞争情报和用户评价情感分析的应用。未来,随着技术进步,此类API的应用将更加广泛,推动电商行业创新。
|
18天前
|
存储 JSON API
批量采集抖音商品详情数据:推荐你使用API(通过商品id取商品详情商品主图sku属性)
批量采集抖音商品详情,建议使用API接口。步骤包括:注册抖音开放平台获取App Key和Secret,调用商品详情API接口传入商品ID及相关参数,解析返回的JSON获取商品信息(如名称、价格、主图和SKU)。此外,接口列表提供商品搜索、销售量查询、历史价格、订单管理等多种功能。已封装的API接口地址:c0b.cc/R4rbK2,可测试并联系获取SDK文件。
15 1
|
22天前
|
监控 数据挖掘 API
京东商品API接口:电商数据自动化的钥匙
京东商品API接口为电商领域带来了巨大的便利和潜力。通过本篇文章,读者应该能够了解如何使用京东商品API接口,并通过示例代码学习如何实际调用API获取商品数据。 随着技术的不断发展,京东商品API接口将继续为电商自动化、数据分析和市场研究提供支持,帮助商家和开发者在竞争激烈的市场中保持领先。我们鼓励读者继续探索和学习,充分利用京东商品API接口带来的机遇。
|
1月前
|
定位技术 API
Angular 调用导入百度地图API接口,2024春招BAT面试真题详解
Angular 调用导入百度地图API接口,2024春招BAT面试真题详解