1. 程式人生 > >C# 呼叫百度地圖web服務API

C# 呼叫百度地圖web服務API

2.為了能與JS互動,首先引入using System.Security.Permissions;

                在名稱空間裡新增:

        [PermissionSet(SecurityAction.Demand, Name = "FullTrust")]  
        [System.Runtime.InteropServices.ComVisibleAttribute(true)]   

3.初始化webBrowser元件

        private void Form1_Load(object sender, EventArgs e)
        {
             string str_url = Application.StartupPath + "\\IndexMap.html";
             Uri url = new Uri(str_url);  
             webBrowser1.Url = url;  
             webBrowser1.ObjectForScripting = this;
             timer1.Enabled = true;  
        }

4.獲取座標

        private void timer1_Tick(object sender, EventArgs e)
        {
            try  
           {  
               string tag_lng = webBrowser1.Document.GetElementById("mouselng").InnerText;  
               string tag_lat = webBrowser1.Document.GetElementById("mouselat").InnerText;  
               double dou_lng, dou_lat;  
               if (double.TryParse(tag_lng, out dou_lng) && double.TryParse(tag_lat, out dou_lat))  
               {  
                   this.toolStripStatusLabel1.Text ="當前座標:"+ dou_lng.ToString("F5") + "," + dou_lat.ToString("F5");  
               }  
           }  
           catch (Exception ee)  
           { 
               MessageBox.Show(ee.Message); 
           }  
        }

5.一些方法的呼叫

            1. webBrowser1.Document.InvokeScript("drawRec");//畫矩形

            2.webBrowser1.Document.InvokeScript("drawCircle");//畫圓形

            3.webBrowser1.Document.InvokeScript("openGetDistance");//測距

            .........

            .........

6.百度提供的DEMO

 <!DOCTYPE html>
<html>
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
<title>Hello Map</title> 
<script type="text/javascript"src="http://api.map.baidu.com/api?key=59db371659c04947a1ff044e80565718&v=1.4&services=true">
</script>  
<!--載入滑鼠測距工具-->  
<script src="DistanceTool_min.js" type="text/javascript"></script>
<!--載入滑鼠繪製工具-->  
<script type="text/javascript" src="DrawingManager_min.js"></script>  
<link rel="stylesheet" href="DrawingManager_min.css" />  

</head>
<body> 
<div id="mouselng" style="visibility:hidden"></div>
<div id="mouselat" style="visibility:hidden"></div> 
<div style="width:1000px;height:600px;border:1px solid gray" id="container">
</div>  
</body>
</html>
<script type="text/javascript">
    var map = new BMap.Map("container");
    map.centerAndZoom(new BMap.Point(108.876433, 36.269395), 5);
    map.addControl(new BMap.ScaleControl()); //新增比例尺控制元件(左下角顯示的比例尺控制元件)
    map.addControl(new BMap.OverviewMapControl());// 縮圖控制元件
    var ctrl_nav = new BMap.NavigationControl({ anchor: BMAP_ANCHOR_TOP_LEFT, type: BMAP_NAVIGATION_CONTROL_LARGE }); 
    map.addControl(ctrl_nav);//新增標準地圖控制元件(左上角的放大縮小左右拖拽控制元件)

    map.enableDragging(); //啟用地圖拖拽事件,預設啟用(可不寫)
    map.enableScrollWheelZoom(); //啟用地圖滾輪放大縮小
    map.enableDoubleClickZoom(); //啟用滑鼠雙擊放大,預設啟用(可不寫)
    map.enableKeyboard(); //啟用鍵盤上下左右鍵移動地圖 
    map.enableContinuousZoom();   // 開啟連續縮放效果  
    map.enableInertialDragging(); // 開啟慣性拖拽效果  
  

  //實時顯示地圖座標 strat
    map.addEventListener("mousemove",GetlngAndlat);     
    function GetlngAndlat(e) {
    if(e.point.lng!=null)  
     {   
      document.getElementById("mouselng").innerHTML=e.point.lng;  
      document.getElementById("mouselat").innerHTML=e.point.lat;  
     }
}
   //實時顯示地圖座標 end
   //測量距離 strat
    function openGetDistance() {  

     var myDis=new BMapLib.DistanceTool(map);//map為上面已經初始化好的地圖例項  
     myDis.open();  
    }
    //測量距離 end

    //左右擊滑鼠給地圖上放marker strat 放標註,並且將JS的資料傳送給WINFORM 
    function PUTANDSEND() {  
       //右鍵標記
        map.addEventListener("rightclick", putAndsend);
        //左鍵標記
        //map.addEventListener("click", putAndsend);
  }
  var marker_num = 0;
    function putAndsend(e)  
    {  
      //放標註  
      var p1=new BMap.Point(e.point.lng,e.point.lat);  
        var myIcon = new BMap.Icon("png-0003.png", new BMap.Size(24, 24));
        var marker = new BMap.Marker(p1, { icon: myIcon });  // 建立標註
        map.addOverlay(marker);              // 將標註新增到地圖中 

      marker_num++;//標註索引,這個是個全域性變數  
      var whichCar=window.external.setWhichCar();  
      var label=new BMap.Label(whichCar+"號車-座標"+marker_num+":"+  
    "("+e.point.lng+","+e.point.lat+")",{offset:new BMap.Size(20,-10)});  
      marker.setLabel(label);  
      //給WINFORM傳值  
      window.external.PutIntotextBox(marker_num,whichCar,e.point.lng,e.point.lat);  
    
    } 
    //左右擊滑鼠給地圖上放marker end

     //在地圖上畫軌跡 strat
    function DrawOrit1()  
    {  
     var Array=[];  
    var total_num= window.external.getRowsNumber();  
    for(var i=0;i<=2*total_num-1;i++)  
    {  
     Array.push(window.external.Getpoints(i));  
    }  
  
    var PointArr=[];  
    for(var i=0;i<=Array.length-1;i+=2)  
    {//偶數索引存經度,奇數存維度  
      PointArr.push(new BMap.Point(Array[i],Array[i+1]));  
    }  
    var polyline = new BMap.Polyline(PointArr, {strokeColor:"blue", strokeWeight:6,   strokeOpacity:0.5});  //定義折線  
      map.addOverlay(polyline);  
    window.external.ClearRows_num();//重置窗體計數器  
    }
    //在地圖上畫軌跡 end

    //在地圖上畫圓形或者方形 strat 
    // 編寫自定義函式,建立標註   
    function addMarker(point) { 
        var myIcon = new BMap.Icon("png-0003.png", new BMap.Size(24, 24));
        var marker = new BMap.Marker(point, { icon: myIcon });  // 建立標註
        map.addOverlay(marker);              // 將標註新增到地圖中  
    }

    var overlays = [];
    var complete=function(e)  
   {  
    overlays.push(e.overlay);  
    if (e.drawingMode == BMAP_DRAWING_CIRCLE)   
          {  
            //隨便賦值,重新整理一遍資料庫(此方法只為演示,實際中要另考慮演算法)  
          var test=  window.external.SearchAllCars(0);   
             
         var circle_radius=e.overlay.getRadius();//半徑  
          //圓心  
         var circle_point=new BMap.Point(e.overlay.getCenter().lng,e.overlay.getCenter().lat);  
         //從WINFORM裡取出資料  
         var dangerCars=[];  
         var pointlen=window.external.GetdangerNum();  
   
         for(var k=0;k<=pointlen-1;k++)  
          {  
             dangerCars.push(window.external.SearchAllCars(k));  
          }  
         var BMappoints=[];//建立百度地圖介面規定的陣列  
         for(var j=0;j<=dangerCars.length-1;j+=2)  
          {  
            BMappoints.push(new BMap.Point(dangerCars[j],dangerCars[j+1]));  
          }  
            
          for(var i=0;i<=BMappoints.length-1;i++)  
          {  
            if(map.getDistance(circle_point,BMappoints[i])<=circle_radius)  
            {
                //AddMarker(BMappoints[i]);//呼叫新增標註版本V3.0  
                var myIcon = new BMap.Icon("png-0003.png", new BMap.Size(24, 24));
                var marker1 = new BMap.Marker(BMappoints[i], { icon: myIcon });  // 建立標註
                map.addOverlay(marker1);              // 將標註新增到地圖中  
            }      
          }  
            
        }  
            
      };  
//線條樣式  
    var styleOptions = {  
        strokeColor:"blue",    //邊線顏色。  
        fillColor:"blue",      //填充顏色。當引數為空時,圓形將沒有填充效果。  
        strokeWeight: 3,       //邊線的寬度,以畫素為單位。  
        strokeOpacity: 1,    //邊線透明度,取值範圍0 - 1。  
        fillOpacity: 0.3,      //填充的透明度,取值範圍0 - 1。  
        strokeStyle: 'solid' //邊線的樣式,solid或dashed。  
    }  
    //例項化滑鼠繪製工具  
    var drawingManager = new BMapLib.DrawingManager(map, {  
        isOpen: true, //是否開啟繪製模式  
        enableDrawingTool: true, //是否顯示工具欄  
        drawingToolOptions: {  
            anchor: BMAP_ANCHOR_TOP_RIGHT, //位置  
            offset: new BMap.Size(5, 5), //偏離值  
            scale: 0.8, //工具欄縮放比例  
            drawingTypes : [           
            BMAP_DRAWING_CIRCLE,    
            BMAP_DRAWING_RECTANGLE   
         ]  
  
        },  
        circleOptions: styleOptions, //圓的樣式   
        rectangleOptions: styleOptions //矩形的樣式  
    });

    //新增滑鼠繪製工具監聽事件,用於獲取繪製結果  
    drawingManager.addEventListener('overlaycomplete', complete);  
    //回撥獲得覆蓋物資訊,未使用該版本  
    var overlaycomplete = function (e) {
        overlays.push(e.overlay);
        var result = "";

        result += e.drawingMode + ":";

        if (e.drawingMode == BMAP_DRAWING_CIRCLE) {

            var circle_radius = e.overlay.getRadius();
            var circle_point = new BMap.Point(e.overlay.getCenter().lng, e.overlay.getCenter().lat);
            alert(map.getDistance(circle_point, tests[1]));
            for (var i = 0; i < 3; i++) {
                if (map.getDistance(circle_point, tests[i]) <= circle_radius) {
                    //AddMarker(tests[i]);
                    var myIcon = new BMap.Icon("png-0003.png", new BMap.Size(24, 24));
                    var marker1 = new BMap.Marker(tests[i], { icon: myIcon });  // 建立標註
                    map.addOverlay(marker1);              // 將標註新增到地圖中  
                }
            }
            alert(result);
        }
        if (e.drawingMode == BMAP_DRAWING_POLYLINE || e.drawingMode == BMAP_DRAWING_POLYGON || e.drawingMode == BMAP_DRAWING_RECTANGLE) {
            result += ' 所畫的點個數:' + e.overlay.getPath()[1].lng;
            alert(result);
        } 
    };  
      
 //drawingManager.enableCalculate();   
    //----------------------公用方法,用元素id獲取元素的值-------------------  
    function $(id){  
        return document.getElementById(id);  
    }  
  
    //------------------畫矩形,讓WINFORM呼叫---------------  
    function drawRec(){  
drawingManager.setDrawingMode(BMAP_DRAWING_RECTANGLE);}  
    //------------------畫圓,讓WINFORM呼叫----------------  
     function drawCircle(){  
drawingManager.setDrawingMode(BMAP_DRAWING_CIRCLE);}  
    //------------------清除所有已畫圖形,讓WINFORM呼叫--------------------  
    function clearAll() {  
        for(var i = 0; i < overlays.length; i++){  
            map.removeOverlay(overlays[i]);  
        }  
        overlays.length = 0
    }  
    //在地圖上畫圓形或者方形 end 

</script>