大概去年的这个时候,我用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>
下面是程序的一些截图: