基於百度地圖API的WinForm地圖
阿新 • • 發佈:2018-12-30
大概去年的這個時候,我用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>
C#中的呼叫方式map.addEventListener("click", function(e) { document.getElementById("lng").innerText = e.point.lng; document.getElementById("lat").innerText = e.point.lat; });
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>
下面是程式的一些截圖: