基于appcan的百度地图开发

    在使用appcan进行移动开发时候,导航的两种实现方式:一、基于地图的API;二、基于导航的API。本文就appcan用地图实现附近、卫星地图、路径规划和交通图四个方面的实现做讲解:

     代码:

<!DOCTYPE html>
<html class="um landscape min-width-240px min-width-320px min-width-480px min-width-768px min-width-1024px">
    <head>
        <title></title>
        <meta charset="utf-8">
          <meta name="viewport" content="target-densitydpi=device-dpi, width=device-width, initial-scale=1, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0">
        <link rel="stylesheet" href="css/fonts/font-awesome.min.css">
        <link rel="stylesheet" href="css/ui-box.css">
        <link rel="stylesheet" href="css/ui-base.css">
        <link rel="stylesheet" href="css/ui-color.css">
        <link rel="stylesheet" href="css/appcan.icon.css">
        <link rel="stylesheet" href="css/appcan.control.css">
        <link rel="stylesheet" href="css/GPRS.css">
    </head>
    <body class="um-vp" ontouchstart>
        <div id="page_0" class="up ub ub-ver bc-bg" tabindex="0">
             <!--header开始-->
             
            <div id="header" class="uh bc-text-head ub bc-head">
                <div id="sechplan" class="yb-btn" id="back">
                         推荐 <br />
                         导航        
                </div>
                <div class="uinn uinn ub-f1">
                    <div class=" sc-bg-active uinput ub ub-f1 bc-border uba uc-a1">
                        <input value="" id="splace"  type="text" class="" >
                    </div>
            
                      <div  class="sc-bg-active uinput ub ub-f1 bc-border uba uc-a1"  style="margin-top:0.2em" >
                        <input value="" id="eplace"  type="text" class="" >
                    </div>
                </div>
                <div class="yb-btn" id="search">
                    <div class="fa fa-search fa-yb"></div>
                </div>
            </div>
            <!--header结束-->
            <!--content开始-->
            <div id="content" class="ub-f1 tx-l">


            </div>
            <!--content结束-->
            <div id="footer" class="uh bc-text-head ub bc-head uinn">
                <div class="yb-btn ub-f1" id="btn1">
                    <div class="fa fa-globe fa-2x"></div>
                </div>
                <div class="yb-btn ub-f1" id="btn2">
                    <div class="fa fa-map-marker fa-2x"></div>
                </div>
                <div class="yb-btn ub-f1" id="btn3">
                    <div class="fa fa-location-arrow fa-2x"></div>
                </div>
            </div>           
        </div>
        <script src="js/appcan.js"></script>
        <script src="js/appcan.control.js"></script>
    </body>
    <script>

        var titHeight = $('#header').offset().height;
        var serchlong;
        var serchlati;
        var longitude;//当前
        var latitude;
        var setText;
        var cityname;
        appcan.ready(function() {
            appcan.initBounce();
            var top=Number(appcan.locStorage.getVal("titheight"));
            var width=screen.availWidth;
            var height=screen.availHeight-top-50; 
            uexBaiduMap.open(0,titHeight,
            $('#content').offset().width,
            $('#content').offset().height,
            "30.78","103.95");
            uexBaiduMap.setCompassEnable(1);
            uexBaiduMap.setScrollEnable(1)
            uexBaiduMap.setMapType(1);//地图的类型(1-标准地图,2-卫星地图)
            setZoomLevel(15);//地图缩放级别 范围:3~19,数值越大越精确
             // 地理编码的回调方法
              uexBaiduMap.cbGeoCodeResult=function(data) {
              searchAddressObj=eval('('+data+')');
              //alert("查询地址编码的纬度:"+searchAddressObj.longitude);
              //alert("查询地址编码的经度:"+searchAddressObj.latitude);
              serchlong=searchAddressObj.longitude;
              serchlati=searchAddressObj.latitude;
              setCenter(searchAddressObj.longitude,searchAddressObj.latitude);
              addMark(searchAddressObj.longitude,searchAddressObj.latitude);
            }
            //获取当前位置的回调方法
            uexBaiduMap.cbCurrentLocation=function(data){
               userAddressObj=eval('('+data+')'); 
               //alert("获取当前位置的回调数据:"+data);
               //alert("转换后的json="+userAddressObj);
               longitude =userAddressObj.longitude;
               latitude=userAddressObj.latitude;
               //alert("当前位置纬度="+longitude);
               //alert("当前位置经度="+latitude);
               setCenter(longitude,latitude);
               uexBaiduMap.setUserTrackingMode(0);
                //通过初试当前位置经纬度,翻转成具体位置信息
                //document.getElementById("splace").value=str;
            }
             getCurrentLocation();//获取当前位置,设置输入框1
            //规划路径成功后的回调函数
             uexBaiduMap.onSearchRoutePlan = function(status){
               if(status==0)
               {
                   //alert("规划状态"+status);
                  // setCenter(longitude,latitude);
                   uexBaiduMap.startLocation();
                   //跟踪模式(0--通定位模式,1--跟随模式,2--罗盘模式
                   uexBaiduMap.setUserTrackingMode(2);
                   //显示或隐藏用户位置(0-隐藏,1-显示)
                   uexBaiduMap.setMyLocationEnable(1);
                   //uexBaiduMap.preRouteNode();
                   uexBaiduMap.nextRouteNode();
                   //开启关闭平移
                   uexBaiduMap.setScrollEnable(1);
                   uexBaiduMap.rotate(180);
               }
               else
               {
                   appcan.window.toast("规划失败"); 
               }
            }
            setZoomEnable();
        });
        //设置百度地图中心点
        function setCenter (longitude,latitude) {
             //alert("设置中心"+longitude);
              //alert("设置中心"+latitude);
              uexBaiduMap.setCenter(longitude,latitude);
        }
        //关闭百度地图功能
        function closeMap () {
          uexBaiduMap.close();
        }
        //定义百度地图缩放级别
        function setZoomLevel(num) {          
            uexBaiduMap.setZoomLevel(num);
        }
        //定义百度地图标注
            var markId = 10001;
            function addMark(log, lat) {
                markId++;
               // alert(markId);
                var params = [{
                    id: markId,
                    longitude:log,
                    latitude:lat,
                }];
                var data = JSON.stringify(params);
               // alert(data);
                uexBaiduMap.addMarkersOverlay(data);
            }
            //通过地址获得经纬度信息
            function getGeocode(city,address) {
              var jsonstr= {
                "city":city,
                "address":address
              };
              var data = JSON.stringify(jsonstr);
              //alert("获得地址经纬度信息"+data);
              uexBaiduMap.geocode(data);
            }
            //设置地图类型 1-标准地图,2-卫星地图
            var change=0;
            function setMapStyle() {
              change++;
              if(change%2!=0){
                 var typeOne=2;                              
                 uexBaiduMap.setMapType(typeOne); 
                  
              }else{
                  var typeTwo=1;                
                  uexBaiduMap.setMapType(typeTwo);                  
              }         
            }
            //获取当前位置
            function getCurrentLocation () {
              uexBaiduMap.getCurrentLocation();
            }
            //开启或关闭实时路况
            var flag=0;
            function setTrafficEnable () {
              flag++;
              if(flag%2!=0){
                  var params=1;                                  
                  uexBaiduMap.setTrafficEnabled(params);
              }else{
                  var params=0;                                                
                  uexBaiduMap.setTrafficEnabled(params);
              }
            }
            //开启或关闭手势缩放
            function setZoomEnable () {            
              uexBaiduMap.setZoomEnable(1);
            }
           var city;//定义城市
            appcan.button(".yb-btn", "ani-act", function() {
                switch(this.id){
                    case "btn1":
                    setMapStyle();                   
                    break;
                    case "btn2":
                    getCurrentLocation();
                    break;
                    case "btn3":
                    setTrafficEnable();
                    break;
                    case "back":
                    appcan.window.close(-1);
                    closeMap();
                    break;
                    case "search":
                     {
                       appcan.window.toast("准备搜索路径!");
                        var input=document.getElementById("splace").value;
                        if(input==null||input==""){
                            
                        }else{                       
                            getGeocode(city,input);
                         } 
                     }
                     break;
                   case "sechplan":
                       serchplan();
                   break;
                                      
                }
            }) 
         //路径规划
         function serchplan () {
             var sname=document.getElementById("splace").value;
             var ename=document.getElementById("eplace").value;
             //alert("sname="+sname+" ename= "+ename);
             getGeocode(city,ename)
             var data = {
                id: "rp345",
                type:0,
                start: {
                    'city':cityname,
                    'name': sname,
                    'longitude':longitude,
                    'latitude':latitude
                },
                end:{
                    'city':cityname,
                    'name': ename,
                    'longitude':serchlong,
                    'latitude':serchlati
                }
            };
            
            var jsonStr=JSON.stringify(data);//转换成json数据
            //alert("规划导航数据"+jsonStr);
            uexBaiduMap.searchRoutePlan(jsonStr);//开始规划路径
           // alert("规划中");
            //alert("经纬度反转测试------------");
            revese();
         } 
         //路径翻转测试
         function revese () {
             var data={
                'longitude': longitude,
                'latitude': latitude
            };
            uexBaiduMap.reverseGeocode(data, function(error,data) {
                //alert("地址反转:"+data.address);
                cityname=data.city;
                //alert("地址反城市:"+data.city);
                return data.address;
            });
         }   
 </script>

</html>

          js代码单独罗列:

        var titHeight = $('#header').offset().height;
        var serchlong;
        var serchlati;
        var longitude;//当前
        var latitude;
        var setText;
        var cityname;
        appcan.ready(function() {
            appcan.initBounce();
            var top=Number(appcan.locStorage.getVal("titheight"));
            var width=screen.availWidth;
            var height=screen.availHeight-top-50; 
            uexBaiduMap.open(0,titHeight,
            $('#content').offset().width,
            $('#content').offset().height,
            "30.78","103.95");
            uexBaiduMap.setCompassEnable(1);
            uexBaiduMap.setScrollEnable(1)
            uexBaiduMap.setMapType(1);//地图的类型(1-标准地图,2-卫星地图)
            setZoomLevel(15);//地图缩放级别 范围:3~19,数值越大越精确
             // 地理编码的回调方法
              uexBaiduMap.cbGeoCodeResult=function(data) {
              searchAddressObj=eval('('+data+')');
              //alert("查询地址编码的纬度:"+searchAddressObj.longitude);
              //alert("查询地址编码的经度:"+searchAddressObj.latitude);
              serchlong=searchAddressObj.longitude;
              serchlati=searchAddressObj.latitude;
              setCenter(searchAddressObj.longitude,searchAddressObj.latitude);
              addMark(searchAddressObj.longitude,searchAddressObj.latitude);
            }
            //获取当前位置的回调方法
            uexBaiduMap.cbCurrentLocation=function(data){
               userAddressObj=eval('('+data+')'); 
               //alert("获取当前位置的回调数据:"+data);
               //alert("转换后的json="+userAddressObj);
               longitude =userAddressObj.longitude;
               latitude=userAddressObj.latitude;
               //alert("当前位置纬度="+longitude);
               //alert("当前位置经度="+latitude);
               setCenter(longitude,latitude);
               uexBaiduMap.setUserTrackingMode(0);
                //通过初试当前位置经纬度,翻转成具体位置信息
                //document.getElementById("splace").value=str;
            }
             getCurrentLocation();//获取当前位置,设置输入框1
            //规划路径成功后的回调函数
             uexBaiduMap.onSearchRoutePlan = function(status){
               if(status==0)
               {
                   //alert("规划状态"+status);
                  // setCenter(longitude,latitude);
                   uexBaiduMap.startLocation();
                   //跟踪模式(0--通定位模式,1--跟随模式,2--罗盘模式
                   uexBaiduMap.setUserTrackingMode(2);
                   //显示或隐藏用户位置(0-隐藏,1-显示)
                   uexBaiduMap.setMyLocationEnable(1);
                   //uexBaiduMap.preRouteNode();
                   uexBaiduMap.nextRouteNode();
                   //开启关闭平移
                   uexBaiduMap.setScrollEnable(1);
                   uexBaiduMap.rotate(180);
               }
               else
               {
                   appcan.window.toast("规划失败"); 
               }
            }
            setZoomEnable();
        });
        //设置百度地图中心点
        function setCenter (longitude,latitude) {
             //alert("设置中心"+longitude);
              //alert("设置中心"+latitude);
              uexBaiduMap.setCenter(longitude,latitude);
        }
        //关闭百度地图功能
        function closeMap () {
          uexBaiduMap.close();
        }
        //定义百度地图缩放级别
        function setZoomLevel(num) {          
            uexBaiduMap.setZoomLevel(num);
        }
        //定义百度地图标注
            var markId = 10001;
            function addMark(log, lat) {
                markId++;
               // alert(markId);
                var params = [{
                    id: markId,
                    longitude:log,
                    latitude:lat,
                }];
                var data = JSON.stringify(params);
               // alert(data);
                uexBaiduMap.addMarkersOverlay(data);
            }
            //通过地址获得经纬度信息
            function getGeocode(city,address) {
              var jsonstr= {
                "city":city,
                "address":address
              };
              var data = JSON.stringify(jsonstr);
              //alert("获得地址经纬度信息"+data);
              uexBaiduMap.geocode(data);
            }
            //设置地图类型 1-标准地图,2-卫星地图
            var change=0;
            function setMapStyle() {
              change++;
              if(change%2!=0){
                 var typeOne=2;                              
                 uexBaiduMap.setMapType(typeOne); 
                  
              }else{
                  var typeTwo=1;                
                  uexBaiduMap.setMapType(typeTwo);                  
              }         
            }
            //获取当前位置
            function getCurrentLocation () {
              uexBaiduMap.getCurrentLocation();
            }
            //开启或关闭实时路况
            var flag=0;
            function setTrafficEnable () {
              flag++;
              if(flag%2!=0){
                  var params=1;                                  
                  uexBaiduMap.setTrafficEnabled(params);
              }else{
                  var params=0;                                                
                  uexBaiduMap.setTrafficEnabled(params);
              }
            }
            //开启或关闭手势缩放
            function setZoomEnable () {            
              uexBaiduMap.setZoomEnable(1);
            }
           var city;//定义城市
            appcan.button(".yb-btn", "ani-act", function() {
                switch(this.id){
                    case "btn1":
                    setMapStyle();                   
                    break;
                    case "btn2":
                    getCurrentLocation();
                    break;
                    case "btn3":
                    setTrafficEnable();
                    break;
                    case "back":
                    appcan.window.close(-1);
                    closeMap();
                    break;
                    case "search":
                     {
                       appcan.window.toast("准备搜索路径!");
                        var input=document.getElementById("splace").value;
                        if(input==null||input==""){
                            
                        }else{                       
                            getGeocode(city,input);
                         } 
                     }
                     break;
                   case "sechplan":
                       serchplan();
                   break;
                                      
                }
            }) 
         //路径规划
         function serchplan () {
             var sname=document.getElementById("splace").value;
             var ename=document.getElementById("eplace").value;
             //alert("sname="+sname+" ename= "+ename);
             getGeocode(city,ename)
             var data = {
                id: "rp345",
                type:0,
                start: {
                    'city':cityname,
                    'name': sname,
                    'longitude':longitude,
                    'latitude':latitude
                },
                end:{
                    'city':cityname,
                    'name': ename,
                    'longitude':serchlong,
                    'latitude':serchlati
                }
            };
            
            var jsonStr=JSON.stringify(data);//转换成json数据
            //alert("规划导航数据"+jsonStr);
            uexBaiduMap.searchRoutePlan(jsonStr);//开始规划路径
           // alert("规划中");
            //alert("经纬度反转测试------------");
            revese();
         } 
         //路径翻转测试
         function revese () {
             var data={
                'longitude': longitude,
                'latitude': latitude
            };
            uexBaiduMap.reverseGeocode(data, function(error,data) {
                //alert("地址反转:"+data.address);
                cityname=data.city;
                //alert("地址反城市:"+data.city);
                return data.address;
            });
         }   

注意事项:

        在测试时候,需要云端打包测试,为此在创建地图时候,需要先做以下几个准备工作:

        1.注册百度开发者,创建地图应用。

        2.然后在appcan中配置包名和获取SHA key值

        3.在appcan工程中的config.xml的设置创建的百度API  key 插件ID。

        4.git进行云端打包测试。

猜你喜欢

转载自blog.csdn.net/qq_27964731/article/details/80611517