1. 程式人生 > >C# 高德JavaScrpt地圖航跡-實時更新

C# 高德JavaScrpt地圖航跡-實時更新

一、既然是地圖,當然先在工具欄裡,新增WebBrowser控制元件,由於還需要選單,所以在屬性裡面設定為:None,然後新增好選單,再在WebBrowser上,選擇 在父容器中停靠。

再加上一些程式碼。地圖的效果就出來了。

這裡還要說明一下。地圖是JavaScrpt的高德地圖。程式碼如下:

<!DOCTYPE HTML>
<html>
<head>
	<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
	<title>輸入座標新增點標記</title>
	<style type="text/css">
		body{
			margin:0;
			height:100%;
			width:100%;
			position:absolute;
		}
		#mapContainer{
			position: absolute;
			top:0;
			left: 0;
			right:0;
			bottom:0;
		}
		
		#btnDiv{
			position:absolute;
			bottom:30px;
			right:10px;
			height:110px;
			background-color:#FFF;
			border:1px solid #ccc;
			font-size:12px;
			width:460px;
			padding:4px;
		}
		
		#btnDiv input{
			height:23px;
			outline:none;
			border:1px solid #ddd;
			padding-left:5px;
			border-radius:3px;
		}
		
		#btnDiv input[type='button']{
			height:28px;
			line-height:28px;
			outline:none;
			text-align:center;
			padding-left:5px;
			padding-right:5px;
			color:#FFF;
			background-color:#0D9BF2;
			border:0;
			border-radius: 3px;
			margin-top:5px;
			margin-left:5px;
			cursor:pointer;
			margin-right:10px;
		}
	</style>
</head>
<body>
    
	<div id="mapContainer"></div>  

    	
	<script type="text/javascript" src="http://webapi.amap.com/maps?v=1.3&key=171c0b5c37e6dc9a86991c3d1fec0f67"></script>

	<script type="text/javascript">


	    //初始化地圖物件,載入地圖
	    var marker;
		var lineArr;
		var frontlon;
		var frontlat;
		var map;
		var once = false;
		lineArr = new Array();
	   // alert("123");
	    map = new AMap.Map('mapContainer', {
	        //地圖根據容器大小縮放
	        resizeEnable: true,
	        //傳入view物件,即二維地圖顯示視口
	        //center: 地圖中心點
	        //zoom:地圖顯示的縮放級別
	        //layers: 設定預設圖層為衛星圖
			
	        view: new AMap.View2D({
	            center: new AMap.LngLat(116.397428, 39.90923),
	            zoom: 15
	        }),
	        layers: [new AMap.TileLayer.Satellite()]
	    });

			 


	    function Messageae(message,message1) {
			//marker.clearMap();
	        var LngLatX = message; //獲取Lng值
			var LngLatY = message1; //獲取Lat值
	        marker = new AMap.Marker({
	            icon: "http://webapi.amap.com/images/marker_sprite.png",
	            position: new AMap.LngLat(LngLatX, LngLatY)
	        });

	        marker.setMap(map);  //在地圖上新增點
	        map.setFitView(); //調整到合理視野

	    //    alert(LngLatY);
	    }

		//新增比例尺
		//AMap.plugin(['AMap.ToolBar','AMap.Scale'],function(){
			//var toolBar = new AMap.ToolBar();
			//var scale = new AMap.Scale();
			// map.addControl(toolBar);
			// map.addControl(scale);
			//});

	    //新增點標記
	    function addMarker() {
	        var LngLatX = document.getElementById("lnglatX").value; //獲取Lng值
	        var LngLatY = document.getElementById("lnglatY").value; //獲取Lat值
	        marker = new AMap.Marker({
	            icon: "http://webapi.amap.com/images/marker_sprite.png",
	            position: new AMap.LngLat(LngLatX, LngLatY)
	        });

	        marker.setMap(map);  //在地圖上新增點
	        map.setFitView(); //調整到合理視野
	    }
		
	function drawLine(value1, value2) {
		var lngX = value1;  
		var latY = value2;         
		if(once == false){
			frontlon = value1;
			frontlat = value2;
			//lineArr.push(new AMap.LngLat(lngX,latY));
			marker = new AMap.Marker({
				icon:"./plane.png", //marker圖示,直接傳遞地址url  
				offset:new AMap.Pixel(-56,-53), //相對於基點的位置  
				autoRotation:true,
	            position: new AMap.LngLat(lngX, latY)
	        });
			marker.setMap(map);  //在地圖上新增點
			map.setFitView(); //調整到合理視野
			once = true;
		}else{
			lineArr.pop();	//清空List,每次繪製一條線/
			lineArr.push(new AMap.LngLat(frontlon,frontlat));
			frontlon = lngX;
			frontlat = latY;
			lineArr.push(new AMap.LngLat(lngX,latY));
		}
		
		marker.setPosition(new AMap.LngLat(lngX,latY)); //更新點標記位置      
			//繪製軌跡  
		var polyline = new AMap.Polyline({  
			map:map,  
			path:lineArr,  
			strokeColor:"#f00",//線顏色  
			strokeOpacity:1,//線透明度  
			strokeWeight:10,//線寬  
			strokeStyle:"solid"}); 
		
	}
	</script>
</body>
</html>						


還有一個圖示,是本地目錄下的。,plane.png自己用PS摳成了透明的。

二、程式程式碼:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Runtime.InteropServices;       //新增類對COM可見-ComVisibleAttribute(true)/

namespace demoTemp1
{
    [ComVisibleAttribute(true)]
    public partial class Form1 : Form
    {
        //開始繪製標識/
        bool isDraw = false;
        //定義結構體儲存經緯度
        public struct LatLng
        {
            public double lat;
            public double lon;
        }
         LatLng latLng;// = new LatLng(wgsLat + dLat, wgsLon + dLon);
         

        public Form1()
        {
            InitializeComponent();
            //地圖載入相對路徑
            webBrowser2.Navigate(Application.StartupPath + "\\js.html");
            webBrowser2.ObjectForScripting = this;
            //地圖的GPS位置,一定要精確到小數點6位,否則地圖載入不完全/
            latLng.lat = 28.237137;
            latLng.lon = 112.868721;
        }

        private void startDrawToolStripMenuItem_Click(object sender, EventArgs e)
        {
            isDraw = true;
            //MessageBox.Show("isDraw = true;&&item click");
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            //地圖航跡更新-定時器/
            System.Timers.Timer MapUpdateTime = new System.Timers.Timer(1000);//例項化Timer類,設定間隔時間為1000毫秒 就是1秒;
            MapUpdateTime.Elapsed += new System.Timers.ElapsedEventHandler(theout);//到達時間的時候執行事件;
            MapUpdateTime.AutoReset = true;//設定是執行一次(false)還是一直執行(true);
            MapUpdateTime.Enabled = true;//是否執行System.Timers.Timer.Elapsed事件;
        }
        //地圖-定時器呼叫/
        public void theout(object source, System.Timers.ElapsedEventArgs e)
        {
            this.Invoke(new TextOption(MapUdate));//invok 委託實現跨執行緒的呼叫
        }

        delegate void TextOption();//定義一個委託
        //地圖航跡更新-實際操作/
        void MapUdate()
        {
            if (isDraw == true)
            {
                object[] objects = new object[2];
                objects[0] = latLng.lon;
                objects[1] = latLng.lat;
                //drawLine      Messageae
                webBrowser2.Document.InvokeScript("drawLine", objects);
                //MessageBox.Show("Draw line");
                latLng.lat += 0.000005;
                latLng.lon += 0.000005;
             }
        }

        private void endDrawToolStripMenuItem_Click(object sender, EventArgs e)
        {
            isDraw = false;
        }
    }
}


//註明:航跡的線條非常粗,是因為每次是繪製一小段線,而不是增加一個點。先到這裡,作個筆記。