1. 程式人生 > >基於百度地圖API的WinForm地圖

基於百度地圖API的WinForm地圖


      大概去年的這個時候,我用VB寫了一個百度地圖的Demo,使用了webBrowser載入本地網頁的方式,只是限於當時的技術,好多功能都沒實現,昨天,我重新對這個程式進行了編寫,這一次我使用的是C#。在正式開始之前,先來解決幾個問題。

      一、地圖

     答:地圖呼叫了百度地圖API(http://developer.baidu.com/map/),由於百度地圖API是基於javascript的,所以它更適合於web環境。當我們使用它來做WinForm程式的時候,我們需要用到webBrowser控制元件,然後載入一個包含了百度地圖API的本地網頁檔案。其實處於安全的角度,這個網頁更適合放在伺服器上,這樣不會暴露其中的js程式碼。

      二、互動

      答:C#和JavaScript屬於兩種不同的程式,兩者怎麼互動呢?這裡我們選擇了一個十分重要的方法:InvokeScript()。

              1、無返回值的js程式碼與C#互動

               首先,在網頁中寫入這樣一段js程式碼:

        function CloseDrawing()
        {
             drawingManager.close();
        }

               那麼在C#中的呼叫方式就是:

        private void CloseDrawing()
        {
            webBrowser.Document.InvokeScript("CloseDrawing");
        }

               2、有返回值的js程式碼與C#互動

                當js程式碼有返回值時,我們不能直接獲取其返回值,我們需要藉助一個隱藏的div或者是label來實現傳值

                js程式碼及html結構

       <div id="lng" style="display:none"></div>
       <div id="lat" style="display:none"></div>
       map.addEventListener("click", function(e)
       {  
         document.getElementById("lng").innerText = e.point.lng;
        document.getElementById("lat").innerText = e.point.lat;
       });
               C#中的呼叫方式
       string lng = webBrowser.Document.GetElementById("lng").InnerText;
string lat = webBrowser.Document.GetElementById("lat").InnerText;

     解決了上述兩個問題,那麼這個程式的思路就很清晰了,在js裡寫一個方法,然後通過C#呼叫這個方法。

     首先是網頁程式碼,關於百度地圖API的問題,請自行了解和學習。

<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<style type="text/css">
body, html,#allmap {width: 100%;height: 100%;overflow: hidden;margin:0;}
#l-map{height:100%;width:78%;float:left;border-right:2px solid #bcbcbc;}
#r-result{height:100%;width:20%;float:left;}
</style>
<script type="text/javascript" src="http://api.map.baidu.com/api?v=1.5&ak=CE44c78c410e2c801253586c748d43f6"></script>
<script type="text/javascript" src="http://api.map.baidu.com/library/DistanceTool/1.2/src/DistanceTool_min.js"></script>
<script type="text/javascript" src="http://api.map.baidu.com/library/DrawingManager/1.4/src/DrawingManager_min.js"></script>
<link rel="stylesheet" href="http://api.map.baidu.com/library/DrawingManager/1.4/src/DrawingManager_min.css" />

<title></title>
</head>
<body>
<div id="geo" style="display:none"></div>
<div id="lng" style="display:none"></div>
<div id="lat" style="display:none"></div>
<div id="allmap" ></div>
</body>
</html>
<script type="text/javascript">
var map = new BMap.Map("allmap");                        
map.centerAndZoom(new BMap.Point(116.404, 39.915), 11);     
map.addControl(new BMap.NavigationControl());               
map.addControl(new BMap.ScaleControl());                   
map.addControl(new BMap.OverviewMapControl());             
map.enableScrollWheelZoom();                           
map.addControl(new BMap.MapTypeControl());          
map.setCurrentCity("北京");
map.addEventListener("click", function(e)
{  
    document.getElementById("lng").innerText = e.point.lng;
    document.getElementById("lat").innerText = e.point.lat;
});
var myDis = new BMapLib.DistanceTool(map);//測距元件

var styleOptions = {
    strokeColor: "red",    //邊線顏色。
    fillColor: "red",      //填充顏色。當引數為空時,圓形將沒有填充效果。
    strokeWeight: 3,       //邊線的寬度,以畫素為單位。
    strokeOpacity: 0.8,	   //邊線透明度,取值範圍0 - 1。
    fillOpacity: 0.6,      //填充的透明度,取值範圍0 - 1。
    strokeStyle: 'solid' //邊線的樣式,solid或dashed。
}
//例項化滑鼠繪製工具
var drawingManager = new BMapLib.DrawingManager(map, {
    isOpen: false, //是否開啟繪製模式
    enableDrawingTool: true, //是否顯示工具欄
    drawingToolOptions: {
        anchor: BMAP_ANCHOR_BOTTOM_RIGHT, //位置
        offset: new BMap.Size(5, 5), //偏離值
        scale: 0.8 //工具欄縮放比例
    },
    circleOptions: styleOptions, //圓的樣式
    polylineOptions: styleOptions, //線的樣式
    polygonOptions: styleOptions, //多邊形的樣式
    rectangleOptions: styleOptions //矩形的樣式
});

</script>

<script>

function localsearch(city)
{
    var local = new BMap.LocalSearch(map, {
        renderOptions: { map: map, panel: "r-result" }  //構造本地搜尋物件
    });
    local.search(city);
}

function Hotel()
{
    var local = new BMap.LocalSearch(map, {
        renderOptions: { map: map, panel: "r-result" }  //構造本地搜尋物件
    });
    local.searchInBounds("酒店", map.getBounds());
}
function Food() {
    var local = new BMap.LocalSearch(map, {
        renderOptions: { map: map, panel: "r-result" }  //構造本地搜尋物件
    });
    local.searchInBounds("餐飲", map.getBounds());
}
function Lady() {
    var local = new BMap.LocalSearch(map, {
        renderOptions: { map: map, panel: "r-result" }  //構造本地搜尋物件
    });
    local.searchInBounds("美容", map.getBounds());
}
function Movie() {
    var local = new BMap.LocalSearch(map, {
        renderOptions: { map: map, panel: "r-result" }  //構造本地搜尋物件
    });
    local.searchInBounds("電影", map.getBounds());
}
function Gas() {
    var local = new BMap.LocalSearch(map, {
        renderOptions: { map: map, panel: "r-result" }  //構造本地搜尋物件
    });
    local.searchInBounds("加油站", map.getBounds());
}
function View() {
    var local = new BMap.LocalSearch(map, {
        renderOptions: { map: map, panel: "r-result" }  //構造本地搜尋物件
    });
    local.searchInBounds("景點", map.getBounds());
}
function Buy() {
    var local = new BMap.LocalSearch(map, {
        renderOptions: { map: map, panel: "r-result" }  //構造本地搜尋物件
    });
    local.searchInBounds("購物中心", map.getBounds());
}
function Store() {
    var local = new BMap.LocalSearch(map, {
        renderOptions: { map: map, panel: "r-result" }  //構造本地搜尋物件
    });
    local.searchInBounds("超市", map.getBounds());
}
function KTV() {
    var local = new BMap.LocalSearch(map, {
        renderOptions: { map: map, panel: "r-result" }  //構造本地搜尋物件
    });
    local.searchInBounds("ktv", map.getBounds());
}
function Bank() {
    var local = new BMap.LocalSearch(map, {
        renderOptions: { map: map, panel: "r-result" }  //構造本地搜尋物件
    });
    local.searchInBounds("銀行", map.getBounds());
}
function Transport(start, end)
{
    var transit = new BMap.TransitRoute(map, {
        renderOptions: { map: map }
    });
    transit.search(start, end);
}
function Driving(start, end)
{
    var driving = new BMap.DrivingRoute(map, { renderOptions: { map: map, autoViewport: true } });
    driving.search(start, end);

}
function Walking(start, end)
{
    var walking = new BMap.WalkingRoute(map, { renderOptions: { map: map, autoViewport: true } });
    walking.search(start, end);
}
function GetLocation() {
    var geolocation = new BMap.Geolocation();
    geolocation.getCurrentPosition(function (r) {
        if (this.getStatus() == BMAP_STATUS_SUCCESS) {
            var mk = new BMap.Marker(r.point);
            map.addOverlay(mk);
            map.panTo(r.point);
            alert('您的位置:' + r.point.lng + ',' + r.point.lat);
        }
        else {
            alert('failed' + this.getStatus());
        }
    }, { enableHighAccuracy: true })
}
function GetByPoint(lng,lat)
{
    var gc = new BMap.Geocoder();
    pt = new BMap.Point(lng,lat);
    gc.getLocation(pt, function (rs) {
        var addComp = rs.addressComponents;
        document.getElementById("geo").innerText=addComp.province + ", " + addComp.city + ", " + addComp.district + ", " + addComp.street + ", " + addComp.streetNumber;
    });
}
function GetByGeo(geo)
{
    IP();
    var cityName=document.getElementById("geo").innerText
    var myGeo = new BMap.Geocoder();
    // 將地址解析結果顯示在地圖上,並調整地圖視野
    myGeo.getPoint(geo, function (point) {
        if (point) {
            map.centerAndZoom(point, 16);
            map.addOverlay(new BMap.Marker(point));
            document.getElementById("lng").innerText = point.lng;
            document.getElementById("lat").innerText = point.lat;
        }
    }, cityName);
}
function GetLocation()
{
    var geolocation = new BMap.Geolocation();
    if (navigator.geolocation){
        geolocation.getCurrentPosition(function (r) {
            if (this.getStatus() == BMAP_STATUS_SUCCESS) {
                var mk = new BMap.Marker(r.point);
                map.addOverlay(mk);
                map.panTo(r.point);
                document.getElementById("geo").innerText ="定位結果為:"+ r.point.lng + ',' + r.point.lat;
            }
        });
         }else{
            document.getElementById("geo").innerText="十分抱歉,您的瀏覽器不支援定位";
        }
}
function IP()
{
    function myFun(result) 
    {
        var cityName = result.name;
        document.getElementById("geo").innerText = cityName;
        map.setCenter(cityName);  
    }
    var myCity = new BMap.LocalCity();
    myCity.get(myFun);
}

function DistanceOpen()
{
    myDis.open();
}
function DistanceClose()
{
    myDis.close();
}

function ZoomIn()
{
    map.zoomIn();
}

function ZoomOut() {
    map.zoomOut();
}
function AddPoint(lng,lat)
{
    var marker = new BMap.Marker(new BMap.Point(lng, lat));  // 建立標註
    map.addOverlay(marker);
}

function Addpolyline()
{
   //新增折線
}

function AddCirle(lng, lat, r) {
    //新增圓
    var circle = new BMap.Circle(new BMap.Point(lng,lat), r);
    map.addOverlay(circle);
}
function OpenDrawing()
{
    drawingManager.open();
}

function CloseDrawing()
{
    drawingManager.close();
}

function SetCity(CityName)
{
    map.setCenter(CityName);
}
function GetCenter()
{
    document.getElementById("geo").innerText = map.getCenter().lng + "," + map.getCenter().lat;
}
function SetBoundary(city)
{
    var bdary = new BMap.Boundary();
    bdary.get(city, function (rs) {       //獲取行政區域
        map.clearOverlays();        //清除地圖覆蓋物       
        var count = rs.boundaries.length; //行政區域的點有多少個
        for (var i = 0; i < count; i++) {
            var ply = new BMap.Polygon(rs.boundaries[i], { strokeWeight: 2, strokeColor: "#ff0000" }); //建立多邊形覆蓋物
            map.addOverlay(ply);  //新增覆蓋物
            map.setViewport(ply.getPath());    //調整視野         
        }
    });
}

</script>


下面是程式的一些截圖: