利用google map做轨迹回放

3 篇文章 1 订阅
总体思路:播放控制是FLEX处理的,首先从服务器端取得数据,然后调用FLEX的数据处理函数,主要是转换GPS点,生成一个数据列表。之后调用FLEX的播放,暂停,停止,加速,减速等方法达到我们想要的目标(在调用FLEX的播放控制函数后,FLEX会调用JS的更新GPS点的函数)
注意事项:
1.google map api参考地址:https://developers.google.com/maps/documentation/javascript/overlays?hl=zh-cn#OverlaysOverview;
2。引用google map api时,文档中添加引用地址(https://maps.google.com/maps/api/js?sensor=set_to_true_or_false)经常打不开(被XX封锁了,需翻墙),但是可以用:https://maps.googleapis.com/maps/api/js?sensor=false代替;
3.IE8下MarkerImage不能正常显示,图片大小为16*16,格式为PNG,在设置MakerImage的时候,火狐能正常显示,但是在IE8下,显示的图片大小为32*32,解决办法:
原代码:var alarmimg= new google.maps.MarkerImage('/Content/Develop/images/alarmed.png', new google.maps.Size(16, 16)); 

修改后:var alarmimg= new google.maps.MarkerImage('/Content/Develop/images/alarmed.png', new google.maps.Size(16, 16), null,null, new google.maps.Size(16, 16)); 
部分代码:

<script type="text/javascript">
        window.onload = function() { top.SetPanelPosition("popPanel", $(document).width(), $(document).height() + 35);         }
        
          var params = {
                allowFullscreen: "true",
                allowScriptAccess: "sameDomain",
                bgcolor: "#FFFFFF",
                quality: "high",
                wmode:"transparent"
            };
            swfobject.embedSWF("/Flex/instrument/JsInstrumentSpeed.swf", "d_JsInstrumentSpeed", "100%", "100%", "9.0.0", "/Flex/instrument/playerProductInstall.swf", "", params);
            swfobject.embedSWF("/Flex/instrument/JsInstrumentRpm.swf", "d_JsInstrumentRpm", "100%", "100%", "9.0.0", "/Flex/instrument/playerProductInstall.swf", "", params);
            
        FABridge.addInitializationCallback("b_JsFABRemoteObject", onFlexReady);
        var isFlexInited = false;
        function onFlexReady() {
            isFlexInited = true;
            getlatlangobj();
        }
        var map, latlngs, data,makerinfo;
        var rate=1;
       
        function initialize() { 
            var myOptions = {
                zoom: 13, 
                center: latlngs[0],
                streetViewControl: false,
                mapTypeControl: false,
                mapTypeId: google.maps.MapTypeId.ROADMAP
            }
            map = new google.maps.Map(document.getElementById("map_canvas"), myOptions); 
        }
        function getlatlangobj() {
            latlngs = [];
            makerinfo=[];
            $.getJSON("/UserManagement/GetTrackIntervalsData", 
            { 
                CarId: "<%=ViewData["carId"] %>", 
                TripId: "<%=ViewData["TripId"] %>", 
                start: "<%=ViewData["startTime"] %>",
                end: "<%=ViewData["endTime"] %>"
           },
           function(args) {
                if(args.GpsData.length>0)
                {
                    data = args.GpsData;
                    makerinfo=args.MarkInfo;
                    var millisecond = 0;
                    millisecond = ConvertStringToDate(data[data.length - 1].time).getTime() - ConvertStringToDate(data[0].time).getTime();
                    Createslider(millisecond);
                    SendGpsListToFlex(); 
                   
                }
                else
                {
                    top.MyAlert('<%=Html.GetLocateLangValue("title")%>', '<%=Html.GetLocateLangValue("nodata")%>', 'info', "top.ClosePanel('popPanel')");
                } 
            });

        }
        var AlarmMakerList;
        function AlarmMaker()
        {  
            AlarmMakerList=[]; 
           
            for (var i = 0; i < makerinfo.length; i++) {
                var lat = convertGpsData(makerinfo[i].latitude, makerinfo[i].lat_way);
                var lng = convertGpsData(makerinfo[i].longitude, makerinfo[i].long_way);
                if (isFlexInited) {
                    var arr = JsFABRemoteObject.resolveLatLng(lat, lng);    
                                
                    AlarmMakerList[i]=new google.maps.Marker({position: new google.maps.LatLng(arr[0], arr[1]), map: map}); 
                   
                  var  wincontent= "<div class='alarmcontent'><div><span><%=Html.GetLocateLangValue("alarm")%></span><span>"+makerinfo[i].day+"</span></div>";
                  var times=makerinfo[i].time.split(',');
                 for(var m=0;m<times.length;m++)
                 {
                    var list="<dl><dt style='width:120px;float:left;'> ";
                    var types=makerinfo[i].type.split(',');
                    if(m<types.length)
                    {
                        list+=types[m];
                    } 
                    list+="</dt><dd style='width:80px;float:left;'>"+times[m]+"</dd></dl></div>";
                    wincontent+=list;
                 }
                    attachSecretMessage(AlarmMakerList[i],wincontent);
                }
            }      
            
        }
        function attachSecretMessage(markers, message) {  
            var alarmimg= new google.maps.MarkerImage('/Content/Develop/images/alarmed.png', new google.maps.Size(16, 16), null,null, new google.maps.Size(16, 16));    
            markers.setIcon(alarmimg);
            var infowindow = new google.maps.InfoWindow({ 
                            content: message,
                            maxWidth: 50,
                            disableAutoPan:true
             }); 
              google.maps.event.addListener(markers, 'click', function() {
                    infowindow.open(map,markers);
              });
          }
        function DelAlarmMaker()
        { 
             for (var i = 0; i < AlarmMakerList.length; i++) {
                  AlarmMakerList[i].setMap(null);
                }   
        }
        $("document").ready(function(){
            $("#alarmshow").click(function(){     
                 if($("#alarmshow").attr("checked")==true)
                 {
                    AlarmMaker();
                 }
                 else
                 {
                    DelAlarmMaker();
                 }
             });
        });
        
        //把GPS列表给FLEX处理
        function SendGpsListToFlex() {
            for (var i = 0; i < data.length; i++) {
                var lat = convertGpsData(data[i].latitude, data[i].lat_way);
                var lng = convertGpsData(data[i].longitude, data[i].long_way);
                if (isFlexInited) {
                    var arr = JsFABRemoteObject.resolveLatLng(lat, lng);
                    latlngs[i] = new google.maps.LatLng(arr[0], arr[1]);
                }
            }
            
            initialize();

            JsFABRemoteObject.setJsGPSData(data);

            //设置初始化地图中心点
            map.setCenter(latlngs[0]);

            //设置初始化车辆marker
            marker = new google.maps.Marker({animation: "null", position: latlngs[0], map: map, icon: GetMarkerImage(0) });

            Drawtrack();

        }
        //绘制轨迹
        function Drawtrack() {
            //画轨迹
            var polylineoption = {
                strokeColor: "#0914f6",
                strokeOpacity: 1.0,
                strokeWeight: 3,
                path: latlngs
            };
            var polyline = new google.maps.Polyline(polylineoption);
            polyline.setMap(map);

        }
        function ShowAlarmMarker() { 
        
        }
        //创建拖动模块
        function Createslider(millisecond) {
            $("#myslider").slider({
                height: 30,
                width: 350,
                min: 0,
                max: millisecond,
                showTip: true,
                tipFormatter: function(value) {
                    return value;
                },
                onSlideStart: function(value) {
                    Pause();
                },
                onSlideEnd: function(value) {
                    updatePositionByTime(value);
                    Play();
                }
            });
        }
        function ConvertStringToDate(strdate) {
            var dat = null;
            if (strdate != "" || strdate != null) {
                var dt = Date.parse(strdate.replace(/-/g, "/"));
                dat = new Date(dt);
            }
            return dat;
        }
        function GetImg(digree) {
            //            console.log("old-digree:" + digree);
            if (digree != 0) {
                digree = -digree + 90;
            }
            if (digree > 360) {
                digree = digree - 360;
            }
            if (digree < 0) {
                digree = digree + 360;
            }

            var a = parseInt(digree / 22.5);
            if (digree % 22.5 > 0) {
                a += 1;
            }
            return a;
        }
        //flex調用(更新GPS点,移动Marker)
        function UpdateGps(gps, dg, dt, speed, rpm) {

             
           
            var millisecond = 0;
            if (dt != null && dt != "") {
                millisecond = dt.getTime() - ConvertStringToDate(data[0].time).getTime();
                var d=new Date(dt);                 
                $("#currentdt").text(d.getFullYear()+"-"+d.getMonth()+"-"+d.getDay()+" "+d.getHours()+":"+d.getMinutes()+":"+d.getSeconds());
            }

            $("#myslider").slider('setValue', millisecond);
            if (!isNaN(speed)) {
                document.getElementById("d_JsInstrumentSpeed").setSpeedValue(speed);
            }
            if (!isNaN(rpm)) {
                document.getElementById("d_JsInstrumentRpm").setRpmValue(rpm / 1000);
            }
 
            //改变图片
            marker.setIcon(GetMarkerImage(GetImg(dg)));
            //设置标记的地址
            //            marker.setPosition(new google.maps.LatLng(obj.lat, obj.lng));
            //            map.panTo(new google.maps.LatLng(obj.lat, obj.lng));
            var p = new google.maps.LatLng(gps.x, gps.y);
            //            console.log("地址:" + p.toString());

            var geocoder = new google.maps.Geocoder();
            geocoder.geocode({ 'location': p }, function(results, status) {
                if (status == google.maps.GeocoderStatus.OK) {
                    var address = results[0].formatted_address;
                    if (typeof address != "undefined") {
                        $("#address").text(address.replace(/邮政编码.*/g, ""));
                        //console.log("地址:" + address.replace(/邮政编码.*/g, ""));
                    }
                }
            });

            marker.setPosition(new google.maps.LatLng(gps.x, gps.y));
            map.panTo(new google.maps.LatLng(gps.x, gps.y));
        }

        function GetMarkerImage(s) {
            var num = parseInt(s);
            if (num > 0) {
                num = num - 1;
            }
            return new google.maps.MarkerImage('/Content/Develop/images/Car13.png', new google.maps.Size(32, 32), new google.maps.Point(0, 32 * num), new google.maps.Point(16, 16));
        }
        /**
        * 南北纬,东西经转换, 
        * 根据接口取得的对象,及南北纬,东西经标志
        * 把对象转换成Google的经纬度,转换后的对象不带南北纬,东西经标志
        * 
        */
        function convertGpsData(latitude, lat_way) {
            var point;
            if (lat_way == "0") {
                point = parseFloat(latitude) / 3600000 * -1;
            }
            else {
                point = parseFloat(latitude) / 3600000;
            }
            return point;
        }

        function TrackIntervals() {
            if (isFlexInited) {
                JsFABRemoteObject.setJsGPSData(data);
            }
        }
        function Play() {
            if (isFlexInited) {
                JsFABRemoteObject.onPlay();
            }
        }
        function Pause() {
            if (isFlexInited) {
                JsFABRemoteObject.onPause();
            }
        }
        function Stop() {
            if (isFlexInited) {
                JsFABRemoteObject.onStop();
            }
        }
        //加速
        function Speedup() {
            if (isFlexInited&&rate>=1&&rate<4) {
                JsFABRemoteObject.onSpeedUp();
                rate+=1;
                $("#v_rate").text(rate+"X");
            }
        }
        //减速
        function Slowdown() {
            if (isFlexInited&&rate>1&&rate<=4) {
                JsFABRemoteObject.onSpeedDown();
                 rate-=1;
                $("#v_rate").text(rate+"X");
            }
        }
        //拖动
        function updatePositionByTime(val) {
            if (isFlexInited) {
                JsFABRemoteObject.updatePositionByTime(val);
            }
        } 
       
    </script>


  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
要实现车辆轨迹回放,可以使用uniapp的map组件。以下是步骤: 1.引入map组件: 在页面的vue文件里,先引入map组件。如下: ``` <template> <view> <map :show-location="true" :markers="markers"></map> </view> </template> <script> import {uniMap} from '@dcloudio/uni-ui'; export default { components: { uniMap }, data(){ return { markers: [] } } } </script> ``` 2.设置地图样式: 在页面的style里,设置map组件的高度和宽度 ``` <style> map { width: 100%; height: 100%; position: fixed; top: 0; left: 0; z-index: 999; } </style> ``` 3.加载地图: 在mounted钩子函数里调用uniMap的createMap方法,创建地图 ``` mounted(){ this.createMap(); }, methods: { createMap(){ let mapCtx = uniMap.createMapContext('myMap', { showLocation: true }) mapCtx.moveToLocation(); } } ``` 4.显示轨迹: 使用setMarkers方法,将要显示的轨迹点添加到地图上 ``` let markers = [ { id: 1, longitude: 113.324520, latitude: 23.10229, iconPath: '/static/img/car.png', width: 50, height: 50, callout: { content: '起点' } }, { id: 2, longitude: 113.35938, latitude: 23.09211, iconPath: '/static/img/car.png', width: 50, height: 50, callout: { content: '终点' } }, { id: 3, longitude: 113.331441, latitude: 23.117706, iconPath: '/static/img/car.png', width: 50, height: 50, callout: { content: '中间点' } } ] this.markers = markers; ``` 5.轨迹回放: 使用定时器和moveToLocation方法,按照轨迹点顺序将地图移动到对应的位置 ``` play(){ let mapCtx = uniMap.createMapContext('myMap', { showLocation: true }) let i = 0; let len = markers.length; let timer = setInterval(() => { if(i >= len - 1){ clearInterval(timer); return; } i++; mapCtx.moveToLocation({ longitude: markers[i].longitude, latitude: markers[i].latitude }) }, 1000) } ``` 以上就是实现车辆轨迹回放的步骤。需要注意的是,地图的显示需要设置高度和宽度,因为地图是一个fixed定位的元素。另外,回放轨迹时需要使用定时器来控制地图移动的速度。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值