一、百度地图API的接入
百度地图API可以为我们提供多种关于地图绘制和计算的功能,因为我们的项目和出行旅游有着很大的关系,要为用户提供多种关于地理位置和行程规划的信息,所以自然少不了它的支持。
用法:
1.首先需要注册账号,成为开发者,并申请密钥:
密钥是接入百度地图API的一个必需的东西,有了它才能正常使用API所提供的接口。
2.由于我们所做的主要是浏览器端,所以需要用到的就是JavaScript API,从下面的窗口可以了解到我们所会用到的类和一些方法以及方法的参数、返回值等说明。
了解到这些之后,剩下我们需要做的就是熟悉开发文档,并且利用它实现我们自己想要实现的功能。
二、主要实现的功能
主要实现了查询附近景点和根据经纬度计算距离两个功能。
查询景点
1.首先要了解到的是如何把结构化地址(如山东省济南市文化西路44号)和经纬度进行互换:
var myGeo = new BMapGL.Geocoder();
// 将地址解析结果显示在地图上,并调整地图视野
myGeo.getPoint(address, function(point){}, '')
这里的address就是结构化地址,此时point里就贮存了位置的经纬度信息。
2.然后在查到该位置之后,就可以在此位置附近搜寻景点:
myGeo.getPoint(address, function(point){
if(point){
map.centerAndZoom(point, 11);
map.addOverlay(new BMapGL.Marker(point, {title: address}));
local = new BMapGL.LocalSearch(map, {renderOptions:{map: map},pageCapacity : 50});
index=0;
local.setSearchCompleteCallback(onSearchComplete);
local.search("景点");
map.enableScrollWheelZoom();
}
else{
alert('您选择的地址没有解析到结果!');
}
}, '')
3.不仅要搜出来,还要把景点信息放进数组里存起来,这里主要使用的就是回调函数onSearchComplete:
function onSearchComplete(results) {
var t = results.getNumPois();
var totalPages = results.getNumPages();
var currPage = results.getPageIndex();// 获取当前是第几页数据
for(var j=0;j<results.getCurrentNumPois();j++)
{
resultArray[index]=results.getPoi(j);
index = index+1;
}
if(results.getPageIndex()<results.getNumPages()-1)
local.gotoPage(results.getPageIndex()+1);
}
4.最后再将该数组返回,就可完成功能。
计算距离
大体思路就是将两个位置都转换成经纬度,然后利用半正矢公式计算出距离来。
半正矢公式
半正矢公式是一种根据两点的经度和纬度来确定大圆上两点之间距离的计算方法,在导航有着重要地位。它是球面三角学中“半正矢定理”公式的特例,该定理涉及了球面三角形的边和角。
经过学习之后可以得到,原来我们根据经纬度计算距离,是用这个来完成的:
1.首先是确定两点经纬度:
function calculateDistance(address1,address2)
{
var myGeo = new BMapGL.Geocoder();
var lat1,lng1,lat2,lng2;
myGeo.getPoint(address1, function(point){
if(point){
lat1 = point.lat;
lng1 = point.lng;
myGeo.getPoint(address2, function(point){
if(point){
lat2 = point.lat;
lng2 = point.lng;
s = getDistance(lng1,lat1,lng2,lat2);
}
else{
alert('您选择的地址没有解析到结果!');
}
}, '')
}
else{
alert('您选择的地址没有解析到结果!');
}
}, '')
return s;
}
2.然后利用半正矢公式计算距离:
function getDistance(lng1,lat1,lng2,lat2)
{
var radlng1 = lng1*(Math.PI/180);
var radlng2 = lng2*(Math.PI/180);
var radlat1 = lat1*(Math.PI/180);
var radlat2 = lat2*(Math.PI/180);
var a = radlat1-radlat2;
var b = radlng1-radlng2;
var s = 2 * Math.asin(Math.sqrt(Math.pow(Math.sin(a/2),2) + Math.cos(radlat1)*Math.cos(radlat2)*Math.pow(Math.sin(b/2),2)));
s = s*6378.137;
s = Math.round(s*10)/10;
return s;
}
这样我们的功能就实现成功了。