JS+ google.maps.api 实现基本的导航功能

一、准备条件:

1.谷歌地图开发者文档:https://developers.google.cn/maps/documentation/javascript/tutorial

2.申请一个API的Key。

 

二、如何实现(只提供JS代码):

1.先构造一张地图。

2.进行地址解析

3.根据地址解析获取到的坐标进行请求服务获取路线结果

4.在地图上绘制路线

5.路线显示选择

 

三、结果。

 4.源代码。

  <script>
    var directions = new google.maps.DirectionsService();  //获取路线请求的服务
    var renderer = new google.maps.DirectionsRenderer();   //路线显示
 
    var map, transitLayer;
    var infowindow;
    var markersArray = [];
    var from
    var to;
    var from_g;
    var to_g;

    function initialize() {   //构造地图
      var mapOptions = {
        zoom: 13,
        center: new google.maps.LatLng(40.7482333, -73.8681295),
        mapTypeId: google.maps.MapTypeId.ROADMAP
      };

      map = new google.maps.Map(document.getElementById('map'), mapOptions);

      google.maps.event.addDomListener(document.getElementById('go'), 'click',route); //获取路线单击事件

      transitLayer = new google.maps.TransitLayer();

      var control = document.getElementById('transit-wpr');
      map.controls[google.maps.ControlPosition.TOP_RIGHT].push(control);

      google.maps.event.addDomListener(control, 'click', function () {
        transitLayer.setMap(transitLayer.getMap() ? null : map);
      });

      geocoder = new google.maps.Geocoder(); //实例化地址解析

      //点击地图获取坐标
      google.maps.event.addListener(map, 'click', function (event) {
        placeMarker(event.latLng);
      });

    }


    function searchMap_from() {
      from = document.getElementById('from').value;
      codeAddress(from);
    }

    function searchMap_to() {
      to = document.getElementById('to').value;
      codeAddress(to);
    }
 
    function addDepart() {   //路线途径点信息的添加
      var depart = document.getElementById('depart');
      for (var i = 0; i < 24; i++) {
        for (var j = 0; j < 60; j += 15) {
          var x = i < 10 ? '0' + i : i;
          var y = j < 10 ? '0' + j : j;
          depart.innerHTML += '<option>' + x + ':' + y + '</option>';
        }
      }
    }

    function handle() {   //地址解析获取坐标
      from = document.getElementById('from').value;
      to = document.getElementById('to').value;
      if (isNaN(from)) {

        var fn = function (results, status) {
          if (status == google.maps.GeocoderStatus.OK) {
            if (results[0]) {
              from_g = results[0].geometry.location;
            }
          } else {
            from_g = from;
            alert("Geocoder failed due to: " + status);
          }

        }
        getGeocoder(from, fn)
      }

      if (isNaN(to)) {

        var fn = function (results, status) {
          if (status == google.maps.GeocoderStatus.OK) {
            if (results[0]) {
              to_g = results[0].geometry.location;
            }
          } else {
            to_g = to;
            alert("Geocoder failed due to: " + status);
          }

        }
        getGeocoder(to, fn)
      }
    }

    function route() {
      var departure = document.getElementById('depart').value;
      var bits = departure.split(':');
      var now = new Date();
      var tzOffset = (now.getTimezoneOffset() + 60) * 60 * 1000;

      var time = new Date();
      time.setHours(bits[0]);
      time.setMinutes(bits[1]);

      var ms = time.getTime() - tzOffset;
      if (ms < now.getTime()) {
        ms += 24 * 60 * 60 * 1000;
      }

      var departureTime = new Date(ms);

      from_g = null;
      to_g = null;
      handle(); //获取到坐标
      preDrawRoute();

      function preDrawRoute() {
        if (!from_g || !to_g) {
          setTimeout(preDrawRoute, 10);
          return;
        }
        drawRoute();
      }

      function drawRoute() {  //路线请求内容
        var request = {
          origin: from_g,
          destination: to_g,
          travelMode: google.maps.DirectionsTravelMode.DRIVING,
          provideRouteAlternatives: true,
          transitOptions: {
            departureTime: departureTime
          }
        };

        var panel = document.getElementById('panel');
        panel.innerHTML = '';
        directions.route(request, function (response, status) {   //绘制路线
          if (status == google.maps.DirectionsStatus.OK) {
            renderer.setDirections(response);
            renderer.setMap(map);
            renderer.setPanel(panel);
          } else {
            renderer.setMap(null);
            renderer.setPanel(null);
          }

        });
      }

    }

    function placeMarker(location) {  //点击地图在地图上某点显示坐标
      clearOverlays(infowindow); //清除地图中的标记
      marker = new google.maps.Marker({
        position: location,
        map: map
      });
      markersArray.push(marker);
      //根据经纬度获取地址
      if (geocoder) {
        geocoder.geocode({
          'location': location
        }, function (results, status) {
          if (status == google.maps.GeocoderStatus.OK) {
            if (results[0]) {
              attachSecretMessage(marker, results[0].geometry.location, results[0].formatted_address);
            }
          } else {
            alert("Geocoder failed due to: " + status);
          }
        });
      }
    }
    //在地图上显示经纬度地址
    function attachSecretMessage(marker, piont, address) {
      var message = "<b>坐标:</b>" + piont.lat() + "," + piont.lng() + "<br />" + "<b>地址:</b>" + address;
      var infowindow = new google.maps.InfoWindow({
        content: message,
        size: new google.maps.Size(50, 60)
      });
      infowindow.open(map, marker);
      if (typeof (mapClick) == "function") mapClick(piont.lng(), piont.lat(), address);
    }
    //删除所有标记阵列中消除对它们的引用
    function clearOverlays(infowindow) {
      if (markersArray && markersArray.length > 0) {
        for (var i = 0; i < markersArray.length; i++) {
          markersArray[i].setMap(null);
        }
        markersArray.length = 0;
      }
      if (infowindow) {
        infowindow.close();
      }
    }

    //地址查询
    function codeAddress(allAddress) {
      if (geocoder) {
        geocoder.geocode({
            'address': allAddress
          },
          function (results, status) {
            if (status == google.maps.GeocoderStatus.OK) {
              var beachMarker = new google.maps.Marker({
                map: map
              });
              map.setCenter(results[0].geometry.location);
              map.setZoom(15);
              beachMarker.setPosition(results[0].geometry.location); //显示图钉
              attachSecretMessage(beachMarker, results[0].geometry.location, results[0].formatted_address);

            } else {
              //alert("加载地图失败,原因为: "
              //    + status);
            }
          });
      }
    }

    function getGeocoder(allAddress, fn) {  //地址解析
      if (geocoder) {
        geocoder.geocode({
          'address': allAddress
        }, fn);
      }
    }
    google.maps.event.addDomListener(window, 'load', initialize);
  </script>

 

posted @ 2019-06-22 11:12  Kacy  阅读(1566)  评论(1编辑  收藏  举报