使用 html5 显示导航路线 谷歌地图api

 

最近在项目遇到一个关于谷歌地图的问题,看了下谷歌地图api后实现了导航和定位的功能,特意记录下,以便以后查看.

整个流程从服务端获得目的地(简称 B)的经纬度地址,通过客户端获得用户(简称A)的经纬度地址,

如果成功获得B的经纬度就在地图上显示出A到B的驾车路径,

如果没有获得A的经纬度则在地图上显示B的位置并明确标识.

 拆分下整个需求,需要这些功能


1.渲染地图;

2.在地图上标识某地;

3.获得用户的经纬度;

4.在地图上显示导航路线.

--------------

1.显示地图;

看google的api

引入入地图api 

<script src="http://maps.google.com/maps/api/js?sensor=false&libraries=places"></script>

看看谷歌官方的例子,渲染地图很简单的……

这是自己的代码

<!DOCTYPE HTML>
<html lang="zh-ch">
<head>
<title>谷歌地图</title>
<meta charset="utf-8">

<meta name="viewport" content="width=device-width, initial-scale=1.0,user-scalable=no,maximum-scale=1" />

<meta name="apple-mobile-web-app-capable" content="yes">

<script src="http://maps.google.com/maps/api/js?sensor=false&libraries=places"></script>
<script src="map.js" type="text/javascript"></script>
<style>
#map_canvas{
position: absolute;
left: 0;
top:0;
height:50%;
width:50%;
background: #fff8dc;
}
</style>
</head>
<body>
<div id="map_canvas">
</div>

</body>
</html>

 

 js 代码initMap 渲染地图

var newMap = {a:{},b:{name:"目的地"}}; //全局变量
newMap.directionsDisplay = {};    
newMap.directionsService = new google.maps.DirectionsService(); //这两个是在导航的时候用到的
//初始化地图
function initMap(mapCenter) {
    newMap.directionsDisplay = new google.maps.DirectionsRenderer();
    var myOptions = {
        zoom:10,
        mapTypeId: google.maps.MapTypeId.ROADMAP, //地图类型
        center: mapCenter   //LatLng 对象
    }
    newMap.map = new google.maps.Map(document.getElementById("map_canvas"), myOptions);
newMap.directionsDisplay.setMap(newMap.map); }

 

js 方法 calcRoute() 导航
//导航方法
function calcRoute(start,end) {
    var request = {
        origin:start,  //开始的位置 (A)
        destination:end, //开始的位置 (B)
        travelMode: google.maps.TravelMode.DRIVING   //导航类型 驾驶
    };
    newMap.directionsService.route(request, function(result, status) {
        if (status == google.maps.DirectionsStatus.OK) {
            directionsDisplay.setDirections(result);
        }
    });
}

 

 2.获得用户的当前的地理位置信息

使用html5的方法来 geolocation.getCurrentPosition() 获得地址,这方法在移动设备上好用,pc上不好用. 这个和有没有网络没有关系,没有网络也是可用的

function getLatLng(){

    if( navigator.geolocation ) {
        function gpsSuccess(pos){

            if( pos.coords ){
                newMap.a.lat = pos.coords.latitude;
                newMap.a.lng = pos.coords.longitude;
            }
            else{
                newMap.a.lat = pos.latitude;
                newMap.a.lng = pos.longitude;
            }
            var userPositon = new google.maps.LatLng(newMap.a.lat,newMap.a.lng);
            var crsPositon = new google.maps.LatLng(newMap.b.lat,newMap.b.lng);
            initMap(userPositon);
            calcRoute(userPositon,crsPositon);
            addMarker(crsPositon,newMap.map,newMap.b.name);
            addMarker(userPositon,newMap.map, "您当前位置");
        }
        function gpsFail(){

            alert('无法获取您的地理位置信息');
            var obj = new google.maps.LatLng(newMap.b.lat,newMap.b.lng);
            initMap(obj);
            addMarker(obj,newMap.map, newMap.b.name);
        }
        navigator.geolocation.getCurrentPosition(gpsSuccess, gpsFail, {enableHighAccuracy:true, maximumAge: 3000000,timeout:20*1000});
    }
}

 还有一问题在地图上标识某地

//向地图上添加某地标识
function addMarker(location,map,contentString) {
    var marker = new google.maps.Marker({
        position: location,
        'draggable': false,
        'animation': google.maps.Animation.DROP,
        map: map
    });
    var infowindow = new google.maps.InfoWindow({
        content: contentString
    });
    google.maps.event.addListener(marker, 'click', function(){
        infowindow.open(map,marker);
    });
}

 

 把这些方法拼装起来ok

ok完整的例子

demo地址

posted @ 2012-06-15 16:35  在那花开时节  阅读(6939)  评论(14编辑  收藏  举报