google地图api js调用完整教程(路径回放)

google地图api js调用完整教程(路径回放)

1,申请一个Google map api得key
目前来看,Google key激活要绑定一些国际银行卡(比如万事达,visa)
申请key详细地址 https://www.wppop.com/get-google-api-key.html
官方文档地址 https://developers.google.cn/maps/documentation/javascript/get-api-key

2,开始使用
首先引入js

 <!-- google地图js 国内使用这个地址,这是Google提供给国内的地址-->
    <script src="http://ditu.google.cn/maps/api/js?key=你的key&callback=initMap&libraries=drawing"
            type="text/javascript"></script>
            
 <!-- google地图js 国外使用这个地址-->
<script async defer
    src="https://maps.googleapis.com/maps/api/js?key=YOUR_API_KEY&callback=initMap">
    </script>

3,初始化我的第一地图

<!DOCTYPE html>
<html>
  <head>
    <style>
      #map {
        height: 400px;  
        width: 100%;  
       }
    </style>
  </head>
  <body>
    <h3>My Google Maps Demo</h3>
    <!--The div element for the map -->
    <div id="map"></div>
    <script>
function initMap() {
  var uluru = {lat: -25.344, lng: 131.036};
  var map = new google.maps.Map(
      document.getElementById('map'), {zoom: 4, center: uluru});
  var marker = new google.maps.Marker({position: uluru, map: map});
}
    </script>
  <script src="http://ditu.google.cn/maps/api/js?key=你的key&callback=initMap&libraries=drawing"
            type="text/javascript"></script>
  </body>
</html>

效果见图
在这里插入图片描述

4,简单的一些用法我就不多讲,官方文档都有,下面我主要讲高级用法,比如定位跟踪,路径回放

4.1定位跟踪

 <div id="page-content">
	<div class="col-lg-12">
		<div class="panel">
			<div class="panel-heading">
				<h3 class="panel-title">GPS轨迹跟踪</h3>
			</div>
			<div class="panel-body">
				<div class="pull-left" id="query-devname"
					style="padding-bottom: 10px;">
					<select id="dev_id" type="text" name="keyword" data-placeholder="请选择一个设备编号"						 
						v-model="lookupType" class="form-control">
						<option value=""></option>
		                #for(t:DevList)
		                     <option data-name="#(t.dev_name)" value="#(t.dev_name)">#(t.dev_id)</option>
		                #end
					</select>
				</div>
				<div class="btn-group">
					<button id="btn_search" onclick="initMap()" type="button"
						class="btn btn-primary btn-space">
						<span class="fa fa-search" aria-hidden="true"
							class="btn-icon-space"></span> 搜索
					</button>
				</div>
				<div id="pathmap" style="width: 100%; height: 600px;"></div>
			</div>
		</div>
	</div>
</div>
<script>

	
	function initMap() {
		var selectDev=$('#dev_id option:selected').text();
        var selectName=$('#dev_id option:selected').val();
		if(selectDev!=""){
            $.when($.ajax(gzmine+"/api/legacy/device/state/"+ encodeURIComponent(selectDev)+"?page=1&rows=1")).done(function(state){
                if(state.rows.length!=0){

                    //以下示例使用DROP在瑞典斯德哥尔摩创建标记
                    // 动画。 单击标记将在BOUNCE之间切换动画
                    //动画,没有动画。

                    var marker;

                        var uluru = {lat: parseFloat(state.rows[0].lat), lng:  parseFloat(state.rows[0].lng)};
                        var map = new google.maps.Map(document.getElementById('pathmap'), {
                            zoom: 13,
                            center: uluru,
                            scaleControl: true,
                            mapTypeId: 'terrain'
                        });

                    //画图工具
                    var drawingManager = new google.maps.drawing.DrawingManager({
                        //drawingMode: google.maps.drawing.OverlayType.MARKER,
                        drawingControl: true,
                        drawingControlOptions: {
                            position: google.maps.ControlPosition.TOP_RIGHT,
                            drawingModes: ['marker', 'circle', 'polygon', 'polyline', 'rectangle']
                        },
                        markerOptions: {icon: '#(ctx)/common/img/google-icon/hua.png'},
                        circleOptions: {
                            fillColor: '#ffff00',
                            fillOpacity: 1,
                            strokeWeight: 5,
                            clickable: false,
                            editable: true,
                            zIndex: 1
                        }
                    });
                    drawingManager.setMap(map);

					    map.setTilt(45);
						var dir ="#(ctx)/common/img/dev-icon/";
						var src= dir + selectName+'.png';
                        var image = {
                            url: src,
                            //该标记宽32像素,高32像素。
                            scaledSize: new google.maps.Size(32, 32)
                        };

                        var contentString = '<div id="content">'+
                            '<div id="siteNotice">'+
                            '</div>'+
                            '<h3 id="firstHeading" class="firstHeading">'+selectDev+'</h3>'+
                            '<div id="bodyContent">'+
                            '<p>驾驶员:'+state.rows[0].driver+'</p>'+
                            '<p>里程:'+state.rows[0].odometer+'</p>'+
                            '</div>'+
                            '</div>';

                        var infowindow = new google.maps.InfoWindow({
                            content: contentString
                        });
                        marker = new google.maps.Marker({
                            map: map,
                            animation: google.maps.Animation.DROP,
                            position: uluru,
                            icon: image
                        });
                        infowindow.open(map, marker);
                        marker.addListener('click', function() {
                            infowindow.open(map, marker);
                        });
                        marker.addListener("dblclick", function(){
							doPjax('#(ctx)/admin/devlocation/getDetailPage?devid='+encodeURIComponent(selectDev)+'&devname='+encodeURIComponent(selectName));
						});

                }else{
                    alert("该设备没有定位数据!")
				}
            })
        }
	}
	$(document).ready(function() {
		$('#dev_id').chosen({width : '95%'});
		
	});
</script>

效果图
在这里插入图片描述

4.2路径回放

<style>
 .progress{position: relative; width:300px;}
 .progress_bg{height: 10px; border: 1px solid #ddd; border-radius: 5px; overflow: hidden;background-color:#f2f2f2;}
 .progress_bar{background: #5FB878; width: 0; height: 10px; border-radius: 5px;}
 .progress_btn{width: 20px; height: 20px; border-radius: 5px; position: absolute;background:#000; left: 0px; margin-left: -10px; top:-5px; cursor: pointer;border:1px #ddd solid;box-sizing:border-box;}
 .progress_btn:hover{border-color:#F7B824;}
 </style>
<div id="page-content">
	<div class="col-lg-12">
		<div class="panel">
			<div class="panel-heading">
				<h3 class="panel-title">GPS轨迹跟踪</h3>
			</div>
			<div class="panel-body">
				<div class="pull-left" id="query-devname"
					style="padding-bottom: 10px;">
					<select id="dev_id" type="text" name="keyword" data-placeholder="请选择一个设备编号"						 
						v-model="lookupType" class="form-control">
						<option value=""></option>
		                #for(t:DevList)
		                     <option data-name="#(t.dev_name)" value="#(t.dev_name)">#(t.dev_id)</option>
		                #end
					</select>
				</div>
				<div style="float: left; margin-right: 5px;">
					<input id="beginTime" type="text" class="form-control" name="beginTime"
						placeholder='开始时间'>
				</div>
				<div style="float: left; margin-right: 5px;">
					<input id="endTime" type="text" class="form-control" name="endTime"
						placeholder='结束时间'>
				</div>
				<div style="float: left; margin-right: 5px;">
					<button id="btn_search1" onclick="initMap()" type="button"
						class="btn btn-primary btn-space">
						<span class="fa fa-search" aria-hidden="true"
							class="btn-icon-space"></span> 查询
					</button>
				</div>
				<div style="float: left; margin-right: 5px;">
					<button id="btn_search2" onclick="runMap()" type="button"
						class="btn btn-primary btn-space">
						<span class="fa fa-search" aria-hidden="true"
							class="btn-icon-space"></span> 播放
					</button>			
				</div>
				<div style="float: left; margin-right: 5px;">
					<button id="btn_search3" onclick="pause()" type="button"
						class="btn btn-primary btn-space">
						<span class="fa fa-search" aria-hidden="true"
							class="btn-icon-space"></span> 暂停
					</button>			
				</div>
				<div style="float: left; margin-right: 5px;">
					<button id="btn_search4" onclick="stop()" type="button"
						class="btn btn-primary btn-space">
						<span class="fa fa-search" aria-hidden="true"
							class="btn-icon-space"></span> 停止
					</button>			
				</div>		
				<div style="float: left; margin-right: 5px;">		
					<div class="progress progress-striped active"><div style="width: 0%;" id="carBar" class="progress-bar progress-bar-dark"></div></div>
				</div>
				<div style="float: left; margin-right: 5px;">
				播放速度:
				</div>
				<div style="float: left; margin-right: 5px;">
				<div class="progress">
					<div class="progress_bg">
						<div class="progress_bar" style="width: 50%;"></div>
					</div>
					<div class="progress_btn"></div>
					<div class="text">0%</div>
				</div>
				</div>
			</div>
		</div>
	</div>
</div>
<script>
	var clock;
	var currentNode=0;
    var flightPath;
    var total=0;
    var carMk=null;
    var tag = false,ox = 0,left = 150,bgleft = 0;
    var map;
	
	function initMap() {
		currentNode=0;
        var loc={};
        var loc2={};
        data=[];
        data2=[];

		if($('#dev_id option:selected').text()!=""){
			$.when($.ajax(gzmine+"/api/legacy/device/state/"+ encodeURIComponent($('#dev_id option:selected').text())+"?page=1&rows=2000&begin="+$('#beginTime').val()+"&end="+$('#endTime').val()),$.ajax(ctx+"/admin/devinfo/getDevNameById?devId="+encodeURIComponent($('#dev_id option:selected').text()))).done(function(state,devName){
				if(state[0].total!=0){
					$.each(state[0].rows,function(index, value){
                        loc={
                            speed:value.speed,
                            driver:value.driver,
                            odometer:value.odometer,
                            time:value.time
                        }
						loc2={
                            lat:parseFloat(value.lat),
							lng:parseFloat(value.lng),
						}
                        if(loc2.lng>0&&loc2.lat>0){
                            data.push(loc)
							data2.push(loc2)
                    		}
					})
                    total=data2.length;
                    initTable();

					map = new google.maps.Map(document.getElementById('tracemap'), {
                        zoom: 13,
                        center: data2[0],
                        scaleControl: true,
                        mapTypeId: 'hybrid'
                    });

                    //画图工具
                    var drawingManager = new google.maps.drawing.DrawingManager({
                        //drawingMode: google.maps.drawing.OverlayType.MARKER,
                        drawingControl: true,
                        drawingControlOptions: {
                            position: google.maps.ControlPosition.TOP_RIGHT,
                            drawingModes: ['marker', 'circle', 'polygon', 'polyline', 'rectangle']
                        },
                        markerOptions: {icon: '#(ctx)/common/img/google-icon/hua.png'},
                        circleOptions: {
                            fillColor: '#ffff00',
                            fillOpacity: 1,
                            strokeWeight: 5,
                            clickable: false,
                            editable: true,
                            zIndex: 1
                        }
                    });
                    drawingManager.setMap(map);
                    map.setTilt(45);

                    var start = data2[0];
                    var color1="blue";
                    for (var i = 1; i < data2.length; i++) {
                            if(data[i].speed>30){
                                color1="red";
                            }else {
                                color1="blue";
                            }
                        flightPath = new google.maps.Polyline({
                            path:  [ {lat: start.lat, lng: start.lng},{lat: data2[i].lat, lng: data2[i].lng}],
                            geodesic: true,
                            strokeColor: color1,
                            strokeOpacity: 1.0,
                            strokeWeight: 2
                        });
                        flightPath.setMap(map);
                        start=data2[i];
                    }

                    addMarker(data2[0], map,'起');
                    addMarker(data2[data2.length-1], map,'终');

				} else{
					alert("时间段内无状态信息")
				}
			})
		}
	}

    // 起始点
    function addMarker(location, map,lab) {
        var marker = new google.maps.Marker({
            position: location,
            label: lab,
            map: map
        });
    }

	function runMap() {
        var selectName=$('#dev_id option:selected').val();
        var selectDev=$('#dev_id option:selected').text();
        var dir ="#(ctx)/common/img/dev-icon/";
        var src= dir + selectName+'.png';
        var image = {
            url: src,
            //该标记宽32像素,高32像素。
            scaledSize: new google.maps.Size(32, 32)
        };

        if(carMk!=null){
            carMk.setMap(null);
		}
        carMk = new google.maps.Marker({
            position:data2[currentNode],
            map: map,
            icon: image
        });
        var contentString;
		var infowindow=null;

       		 clock = setInterval(function(){
            if(document.getElementById("tracemap") === null)
                clearInterval(clock);
            if(currentNode<data2.length-1){
                $('#carBar').css("width",Math.round(((currentNode+2)/data2.length) * 100)+'%')
                carRun(data2[currentNode],data2[currentNode+1]);

                 contentString = '<div id="content">'+
                    '<div id="siteNotice">'+
                    '</div>'+
                    '<h3 id="firstHeading" class="firstHeading">'+selectDev+'</h3>'+
                    '<div id="bodyContent">' +
                    '<p>驾驶员:'+data[currentNode].driver+'</p>'+
                    '<p>速度:'+data[currentNode].speed+'</p>'+
                    '<p>里程:'+data[currentNode].odometer+'</p>'+
                    '<p>时间:'+data[currentNode].time+'</p>'+
                    '</div>'+
                    '</div>';
                 if(infowindow!=null){
                     infowindow.close(map, carMk);
				 }
                 infowindow = new google.maps.InfoWindow({
                    content: contentString
                });
                infowindow.open(map, carMk);

                currentNode++
            }
            else{
                clearInterval(clock);
                currentNode=0
            }
        },(300-left))

	}
    function carRun(myP1,myP2){
        carMk.setPosition(myP2);
    }
	
	function pause() {
		clearInterval(clock);
	}
	
	function stop() {
		currentNode=0;
		clearInterval(clock);
	}
	function stringToDate(s) {
		var d = new Date();
		d.setYear(parseInt(s.substring(0,4),10));
		d.setMonth(parseInt(s.substring(5,7)-1,10));
		d.setDate(parseInt(s.substring(8,10),10));
		d.setHours(parseInt(s.substring(11,13),10));
		d.setMinutes(parseInt(s.substring(14,16),10));
		d.setSeconds(parseInt(s.substring(17,19),10));
		return d;
	}
	
	function zeroFill(i){
	    if (i >= 0 && i <= 9) {
	        return "0" + i;
	    } else {
	        return i;
	    }
	}
	/**
	 * 获取当前时间 格式:yyyy-MM-dd HH:MM:SS
	 */
	function dateToString(time) {
		var date = new Date(time);
	    var month = zeroFill(date.getMonth() + 1);//月
	    var day = zeroFill(date.getDate());//日
	    var hour = zeroFill(date.getHours());//时
	    var minute = zeroFill(date.getMinutes());//分
	    var second = zeroFill(date.getSeconds());//秒
	    
	    //当前时间
	    var curTime = date.getFullYear() + "-" + month + "-" + day
	            + " " + hour + ":" + minute + ":" + second;
	    
	    return curTime;
	}
	
	$(document).ready(function() {
	    $("#disp").click(function () {
			if($(this).text()=="隐藏︽"){
				$("#pageTable").hide();
                $(this).text("显示︾");
			}else{
                $("#pageTable").show();
                $(this).text("隐藏︽");
            }
        });

		$('#dev_id').chosen({width : '95%'});
		$('#beginTime').datetimepicker({
	    	startDate: "2018-09-01",
	    	endDate:new Date(),
	        language:  'zh-CN',
	        weekStart: 1,
	        todayBtn:  1,
			autoclose: 1,
			todayHighlight: 1,
			startView: 2,
			forceParse: 0,
	        showMeridian: 1,
	        format:"yyyy-mm-dd hh:ii:ss"
	    }).on('changeDate', function(ev){
	    	$('#endTime').val("")
	    	$('#endTime').datetimepicker('setStartDate', $('#beginTime').val());
	    	$('#endTime').datetimepicker('setEndDate', dateToString(stringToDate($('#beginTime').val()).getTime()+1000*259200>new Date().getTime()?new Date().getTime():stringToDate($('#beginTime').val()).getTime()+1000*259200));
	    });	
		
   	 	$('#endTime').datetimepicker({    	
	        language:  'zh-CN',
	        weekStart: 1,
	        todayBtn:  1,
			autoclose: 1,
			todayHighlight: 1,
			startView: 2,
			forceParse: 0,
	        showMeridian: 1,
	        format:"yyyy-mm-dd hh:ii:ss",	 	    
	    });
   	 	
   	 
   	$('.progress_btn').css("left",150)
     $('.progress_btn').mousedown(function(e) {
         ox = e.pageX - left;
         tag = true;
         if(currentNode!=0){
             pause();
             runMap();
         }
     });
     $(document).mouseup(function() {
         tag = false;
     });
     $('.progress').mousemove(function(e) {//鼠标移动
         if (tag) {
             left = e.pageX - ox;
             if (left <= 0) {
                 left = 0;
             }else if (left > 300) {
                 left = 300;
             }
             $('.progress_btn').css('left', left);
             $('.progress_bar').width(left);
             $('.text').html(parseInt((left/300)*100) + '%');
             if(currentNode!=0){
                 pause();
                 runMap();
             }

         }
     });
     $('.progress_bg').click(function(e) {//鼠标点击
         if (!tag) {
             bgleft = $('.progress_bg').offset().left;
             left = e.pageX - bgleft;
             if (left <= 0) {
                 left = 0;
             }else if (left > 300) {
                 left = 300;
             }
             $('.progress_btn').css('left', left);
             $('.progress_bar').animate({width:left},300);
             $('.text').html(parseInt((left/300)*100) + '%');
         }
     });
		
	});
</script>

效果图
在这里插入图片描述
END

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值