用百度地图API分析打交通大数据

百度地图API, 文档不全,例子不细致。 在网上还没有太多有用的例子。比如说下面几个需求的解决方案就找不到:

1. 如何用百度地图API查询一个地点的经纬度。

2. 如何用百度地图通过一个经纬度查询商圈和地址。

3.点击百度地图时, 获得点击位置的经纬度。

4. 如果按照时间轴动态显示热力图的变化。

我昨天玩了一下午百度地图javascript API,解决了上面的几个问题,顺道用少量打车用户的抽样数据做一个数据可视化, 给大家提供一个可以参考的例子

首先数据是来自北京市某个周日的出行数据, 其中包含出发地点和到达地点的经纬度。

{"passenger_phone":"XXX","start_location_lng":"116.31414794922","start_location_lat":"40.080762261285","end_location_lng":"116.3363","end_location_lat":"40.07079"}

{"passenger_phone":"XXX","start_location_lng":"116.734490","start_location_lat":"39.903438","end_location_lng":"116.735160","end_location_lat":"39.962470"}

由于数据是从spark里查询出来放在hadoop上,是map后的一个结果, 因此每条数据的间隔符号是换行。这导致我必须在js里把数据文件命名为txt文件, 并且在js里做一些特殊处理。

百度地图API, 因为需要频繁在js里根据鼠标点击获得地理位置和商圈信息,  因此在html创建了一个不可见的container用来加载地图查询模块

<div id="dummy" style ="display:none"></div>

用来加载百度地图javascript model用来查询地理信息。

var bmap4search= new BMap.Map("dummy");

var localSearch = new BMap.LocalSearch(bmap4search);

由于需要找出鼠标点击位置五公里范围内的人数, 因此需要一个计算地理距离的函数。

function rad(d)

{

return d * Math.PI / 180.0;

}

function getDistance(lng1,lat1, lng2,lat2)

{

radLat1 = rad(lat1);

radLat2 = rad(lat2);

a = radLat1 - radLat2;

b = rad(lng1) - rad(lng2);

s=2*Math.asin(

Math.sqrt(Math.pow(Math.sin(a/2), 2.0)+

Math.cos(radLat1)*Math.cos(radLat2)*Math.pow(Math.sin(b/2), 2.0)));

EARTH_RADIUS = 6378.137;

s = s * EARTH_RADIUS;

s = Math.round(s*10000) / 10000;

return s;

}

页面加载后, 首先显示用户出发热力图, 看上去回龙观还真像是北京的宇宙中心, 出行用户最密集。

用鼠标点击地图上的某一个点, 可以获得该点的地址信息。参考下一张图。

用鼠标点击回龙观位置, 动态获得一个坐标后, 按钮“点击显示5公里内......”亮了。 点击按钮可以查看这些回龙观的用户, 周日出行目的地是哪里。结果发现回龙观的群众周末大多数也只在回龙观附近晃荡。

至于播放时间轴热力图变化的问题, 其实是通过重新设置option时间的,方法与上图完全相同

myChart.setOption(map_option);

下面几张图是回龙观群众在临晨1点~5点按时间轴变化的出行热力图

临晨3点

临晨5点

早晨7点

可以看到上面亮了几个点, 放大地图看看。

发现分别是, 汉王大厦, 融泽嘉园售楼处, 回龙观镇医院。还有一个高速公路收费站口

下面是部分代码。

<!DOCTYPE html>

<html style="height: 100%">

<head>

<meta charset="utf-8">

<script type="text/javascript" src="http://api.map.baidu.com/api?v=2.0&ak=ZUONbpqGBsYGXNIYHicvbAbM"></script>

</head>

<body style="height: 100%; margin: 0">

<div style ="z-index=999">

<input type="button" value="点击切换到出发热力图" onclick="chg(0)" disabled=disabled ID="startBtn" NAME="Button1">

<input type="button" value="点击切换到到达热力图" onclick="chg(1)" ID="endBtn" NAME="Button1">

</div>

<div>

<div id=mytips style="z-order=999;background-color:#F0F8FF;width:100;height:16;border:2px solid gray;display:none;filter:progid:DXImageTransform.Microsoft.Shadow(color=#666666,direction=135,strength=5);left:5;top:5"></div>

<input type="button" value="点击显示5公里内嘀嘀新客的目的地或者来源" disabled=disabled onclick="showDS()" ID="src_dest_Btn" NAME="Button1">

</div>

<div id="dummy" style ="display:none"></div>

<div id="container" style="height: 100%">

</div>

<!-- 新添加的jQuery -->

<script type="text/javascript" src="./js/jquery-3.1.0.js"></script>

<!-- End -->

<script type="text/javascript" src="./js/echarts.js"></script>

<script type="text/javascript" src="./js/dataTool.js"></script>

<script type="text/javascript" src="./js/bmap.js"></script>

<script type="text/javascript">

var bmap4search= new BMap.Map("dummy");

var localSearch = new BMap.LocalSearch(bmap4search);

var dom = document.getElementById("container");

var myChart = echarts.init(dom);

var app = {};

option = null;

app.title = ‘热力图与百度地图扩展‘;

var startPoints=[];

var endPoints=[];

var dsPoints=[];

var radium=5;

var gc = new BMap.Geocoder();

var map_option;

var map_status="default";//全部乘客的出发或者达到

//$.get(‘./js/data/bejing_track_end.json‘, function (data) {

$.get(‘./js/data/test.txt‘, function (data) {

var array = data.split(‘\n‘);

for(var i in array)

{

if(array[i]!="")

{

eval("temp="+array[i]);

startPoints[i]=[temp.start_location_lng, temp.start_location_lat].concat([1]);

endPoints[i]=[temp.end_location_lng, temp.end_location_lat].concat([1]);

}

}

option_start = {

animation: true,

bmap: {

center: [116.301670, 39.971690],

zoom: 11,

roam: true

},

visualMap: {

show: false,

top: ‘top‘,

min: 0,

max: 5,

seriesIndex: 0,

calculable: true,

inRange: {

color: [‘blue‘, ‘blue‘, ‘green‘, ‘yellow‘, ‘red‘]

}

},

series: [{

type: ‘heatmap‘,

coordinateSystem: ‘bmap‘,

data: startPoints,

pointSize: 10,

blurSize: 6

}]

}

option_end = {

animation: true,

bmap: {

center: [116.301670, 39.971690],

zoom: 11,

roam: true

},

visualMap: {

show: false,

top: ‘top‘,

min: 0,

max: 5,

seriesIndex: 0,

calculable: true,

inRange: {

color: [‘blue‘, ‘blue‘, ‘green‘, ‘yellow‘, ‘red‘]

}

},

series: [{

type: ‘heatmap‘,

coordinateSystem: ‘bmap‘,

data: endPoints,

pointSize: 10,

blurSize: 6

}]

}

//用来展示5公里范围的人都去到那里, 或者从哪里来的。

option_ds = {

animation: true,

bmap: {

center: [116.301670, 39.971690],

zoom: 11,

roam: true

},

visualMap: {

show: false,

top: ‘top‘,

min: 0,

max: 5,

seriesIndex: 0,

calculable: true,

inRange: {

color: [‘blue‘, ‘blue‘, ‘green‘, ‘yellow‘, ‘red‘]

}

},

series: [{

type: ‘heatmap‘,

coordinateSystem: ‘bmap‘,

data: dsPoints,

pointSize: 10,

blurSize: 6

}]

}

var callback=function(center_point){

option_start.bmap.center = [center_point.lng, center_point.lat];

option_end.bmap.center = [center_point.lng, center_point.lat];

option_ds.bmap.center = [center_point.lng, center_point.lat];

map_option=option_start;

myChart.setOption(map_option);

var bmap = myChart.getModel().getComponent(‘bmap‘).getBMap();

bmap.addEventListener("click", function(e){ //鼠标点击事件

var pt = e.point;

if(map_status=="default")

$("#src_dest_Btn").removeAttr("disabled");

else

$("#src_dest_Btn").attr("disabled","disabled");

seashowtip(1, pt.lng,pt.lat);

}

);

if (!app.inNode) {

// 添加百度地图插件

bmap.addControl(new BMap.MapTypeControl());

}

}

searchByStationName("北京",callback);

});

function chg(type)

{

map_status="default";

if(type==0)

{

map_option = option_start;

$("#endBtn").removeAttr("disabled");

$("#startBtn").attr("disabled","disabled");

}else

{

map_option = option_end;

$("#startBtn").removeAttr("disabled");

$("#endBtn").attr("disabled","disabled");

}

$("#src_dest_Btn").attr("disabled","disabled");

myChart.setOption(map_option);

var my_tips=document.all.mytips;

my_tips.style.display="none";

};

function showDS()

{

//显示5公里范围内的新客的目的地或者来源。

if(dsPoints && dsPoints.length>0)

{

map_status="passenger_within5km";

$("#startBtn").removeAttr("disabled");

$("#endBtn").removeAttr("disabled");

option_ds.series[0].data=dsPoints;

map_option=option_ds;

myChart.setOption(map_option);

}

}

function calPopulationAround2(ln, la)

{

var result=[];

var points = map_option.series[0].data;

for(var i in points)

{

var track = points[i];

if(getDistance(track[0],track[1], ln, la)<radium/2)

{

result[index] = track;

index+=1;

}

}

return result;

};

function calPopulationAround(ln, la)

{

//计算5公里内的乘客坐标, 以及他们的来源或者目的地。

if(map_status!="default")

return calPopulationAround2(ln, la);

var result=[];

var points = startPoints;

var ds_points = endPoints;

if(!$("#startBtn").attr("disabled"))

{

points = endPoints;

ds_points=startPoints;

}

dsPoints=[];

var index=0;

for(var i in points)

{

var track = points[i];

if(getDistance(track[0],track[1], ln, la)<radium/2)

{

result[index] = track;

dsPoints[index] = ds_points[i];

index+=1;

}

}

return result;

};

function seashowtip(flag,ln,la){

var my_tips=document.all.mytips;

var points= calPopulationAround(ln,la);

searchByPoint(ln,la, function(result){

var tipsName = ""+result.address+",附近商圈:("+ result.business +"),坐标("+ln+","+la+")周围"+radium+"公里范围内首单人数:"+points.length+"人";

if(flag){

my_tips.innerHTML=tipsName;//为div块上添加内容

my_tips.style.display="";

my_tips.style.width=150;

my_tips.style.zIndex=999;

my_tips.style.display="block";

//my_tips.style.left=event.clientX+10+document.body.scrollLeft;

//my_tips.style.top=event.clientY+document.body.scrollTop;

}else{

my_tips.style.display="none";

}

});

}

function rad(d)

{

return d * Math.PI / 180.0;

}

function getDistance(lng1,lat1, lng2,lat2)

{

radLat1 = rad(lat1);

radLat2 = rad(lat2);

a = radLat1 - radLat2;

b = rad(lng1) - rad(lng2);

s=2*Math.asin(

Math.sqrt(Math.pow(Math.sin(a/2), 2.0)+

Math.cos(radLat1)*Math.cos(radLat2)*Math.pow(Math.sin(b/2), 2.0)));

EARTH_RADIUS = 6378.137;

s = s * EARTH_RADIUS;

s = Math.round(s*10000) / 10000;

return s;

}

function searchByStationName(keyword, cb) {

  //var keyword = "石景山区";

//根据地址来查询经纬度。

  localSearch.setSearchCompleteCallback(function (searchResult) {

    var poi = searchResult.getPoi(0);

    cb(poi.point);

  });

  localSearch.search(keyword);

}

function searchByPoint(lng,lat, cb)

{//根据经纬度查询地址

var poi= new BMap.Point(lng,lat);

gc.getLocation(poi, function(rs){

cb(rs);

});

}

</script>

</body>

</html>

时间: 2024-12-09 22:39:48

用百度地图API分析打交通大数据的相关文章

【百度地图API】今日小年大进步,齐头共进贺佳节——API优化升级上线,不再增加内存消耗

原文:[百度地图API]今日小年大进步,齐头共进贺佳节--API优化升级上线,不再增加内存消耗 任务描述: 今天是2011年01月26日,小年夜.百度地图API在小年夜献给广大API爱好者一份给力的礼物!那就是,百度地图API内存消耗优化升级了! 此次API优化升级后,内存消耗保持平稳,绝大部分测试中,内存消耗趋于一条直线.(如图所示) 如何实现: a)         本次测试全部采用IE6浏览器: b)         本次测试的覆盖物全部采取随机方式创建: c)         本次测试覆

【百度地图API】情人节求爱大作战——添加标注功能

原文:[百度地图API]情人节求爱大作战--添加标注功能 任务描述: 2月2日是除夕,2月14立马来!即将到来的情人节,你想送TA一份什么礼物呢? 不如,在你们居住的地方,画个大大的桃心,表达你对TA的爱意吧! 如何实现: 给地图增加一个事件监听,addEventListener: 当鼠标点击地图时,首先获取改点坐标,其次在改点坐标处增加一个红色标注. 图示: 运行代码,请点击这里. 代码如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Tr

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

原文:[百度地图API]如何利用地图API制作汽车沿道路行驶的动画?--如何获得道路层数据 有几个做汽车导航的朋友问我说,他们想在地图上制作一辆车沿着道路行驶的动画.可是,百度地图的道路数据并没有公开.所以,应该怎么办呢? 一. 我们先来学习如何把百度地图“弄”出来.把下面这段代码保存为htm格式,用浏览器打开,就能看到百度地图了. <html><head><meta http-equiv="Content-Type" content="text

【百度地图API】自定义可编辑的交通路线

原文:[百度地图API]自定义可编辑的交通路线 任务描述: 我想自己绘制一条从地铁站出口到天安门的道路,而且还需要根据我的喜好来改变这条路线. 如何实现: 鼠标左击地图,绘制路线:双击后,绘制结束:绘制结束后,路线可编辑. TIPS: API1.1以后,可以使用enableEditing()来开启折线可编辑功能. 图示: 运行代码,请点击这里. 代码: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" &

百度地图API开发应用

           百度地图API开发应用房地产销售分析管理系统   上海为卓信息科技有限公司--专业gis地图开发项目服务   系统概述 俗话说,安居才能乐业.随着社会的发展,人们生活质量水平的普遍提高,过去那种只要有个地方能住就行的观念已经在潜移默化中慢慢开始转变.房屋面积大不大,小区环境好不好,买东西方不方便,这些都已经成为消费者筛选住房好坏的标准了.但是作为普通购房者,不可能每个小区.每间房屋都去查看.面对那么多有购房需求的消费者,房地产销售公司怎么才能吸引他们来购买自己产品呢? 需求

第三方服务——百度地图API哪个好用?

之前我们能用的地图软件还寥寥无几,而且一个地图包动辄就上百M,还不支持GPS,没有实时路况,没有卫星图,一年也未必更新一次.现如今的地图功能已经极大丰富了,开发者的项目选择性也很大,地图哪个受众比较多比较好用呢?开发者不做“Outman”让你的项目与时俱进!Dev带你来了解一下. 百度地图API 百度地图API是一套为开发者免费提供的基于百度地图的应用程序接口,提供基本地图.位置搜索.周边搜索.公交驾车导航.定位服务.地理编码及逆地理编码等丰富功能.通过地图API,一方面解决移动开发者服务器端日

百度地图API和高德地图API资料集锦

[高德地图API]从零开始学高德JS API(五)路线规划--驾车|公交|步行 [高德地图API]从零开始学高德JS API(四)搜索服务--POI搜索|自动完成|输入提示|行政区域|交叉路口|自有数据检索 [高德地图API]从零开始学高德JS API(三)覆盖物--标注|折线|多边形|信息窗口|聚合marker|麻点图|图片覆盖物 [高德地图API]从零开始学高德JS API(二)地图控件与插件--测距.圆形编辑器.鼠标工具.地图类型切换.鹰眼鱼骨 [高德地图API]从零开始学高德JS API

初次使用百度地图API

因为项目需要,不得不使用百度地图的API,以前从未了解过API,这不是唬人,真的,所以对百度地图API充满了恐惧,但是到后面,已经麻木了.期间遇到过很多错误,每一个都弄得头大,借博客的名义把平时遇到的错误解决方法写一写. 在这里我就直接引用百度地图提供的demo代码: <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; ch

Android应用中使用百度地图API并加入标注(一)

网上一些资料这样的的内容已经过时了,这里是最新的内容,假设哪里不正确,请吐槽... 1)下载百度地图移动版API(Android)开发包      要在Android应用中使用百度地图API,就须要在project中引用百度地图API开发包,这个开发包包括两个文件: 下载地址:http://pan.baidu.com/s/1i31enrB 2)申请API Key //包名 格式:比如:B7:6C:CF:E2:47:50:9B:3E:34:F7:08:72:F3:AC:F1:BE:55:D3:77