基于百度地图API的WinForm地图


      大概去年的这个时候,我用VB写了一个百度地图的Demo,使用了webBrowser加载本地网页的方式,只是限于当时的技术,好多功能都没实现,昨天,我从新对这个程序进行了编写,这一次我使用的是C#。在正式开始以前,先来解决几个问题。javascript

      1、地图css

     答:地图调用了百度地图API(http://developer.baidu.com/map/),因为百度地图API是基于javascript的,因此它更适合于web环境。当咱们使用它来作WinForm程序的时候,咱们须要用到webBrowser控件,而后加载一个包含了百度地图API的本地网页文件。其实处于安全的角度,这个网页更适合放在服务器上,这样不会暴露其中的js代码。html

      2、交互java

      答:C#和JavaScript属于两种不一样的程序,二者怎么交互呢?这里咱们选择了一个十分重要的方法:InvokeScript()。web

              一、无返回值的js代码与C#交互api

               首先,在网页中写入这样一段js代码:浏览器

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

               那么在C#中的调用方式就是:安全

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

               二、有返回值的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>

下面是程序的一些截图: