轉 http://blog.csdn.net/kkkkkxiaofei/article/details/8663377javascript
這一篇,記錄一下我調用的地圖API實現的功能。下面介紹的都是一些片斷的節選,不能直接複製就運行。在實現以前確定要加載地圖,先放一個webbroser控件,而後以下:css
- private void Form1_Load(object sender, EventArgs e)
- {
-
- string str_url = Application.StartupPath + "\\最終合併版本(昨晚修改).html";
- Uri url = new Uri(str_url);
- webBrowser1.Url = url;
- webBrowser1.ObjectForScripting = this;
-
- }
而爲了能與JS交互,首先引入using System.Security.Permissions;,而後在namespace下必須加入兩行:html
- namespace WebBroser_Test_V1._0
- {
- [PermissionSet(SecurityAction.Demand, Name = "FullTrust")]
-
- [System.Runtime.InteropServices.ComVisibleAttribute(true)]
-
-
- public partial class Form1 : Form
- {
- public Form1()
- {
- InitializeComponent();
- }
- private void Form1_Load(object sender, EventArgs e)
- {
-
- string str_url = Application.StartupPath + "\\最終合併版本(昨晚修改).html";
- Uri url = new Uri(str_url);
- webBrowser1.Url = url;
- webBrowser1.ObjectForScripting = this;
-
- }
- }
有了上面的基礎,就能夠實現如下功能了。java
1.鼠標放在屏幕上移動時,實時的顯示座標。web
放入一個timer和一個StatusScrip:正則表達式
- private void timer1_Tick(object sender, EventArgs e)
- {
- try
- {
- string tag_lng = webBrowser1.Document.GetElementById("mouselng").InnerText;
- string tag_lat = webBrowser1.Document.GetElementById("mouselat").InnerText;
- double dou_lng, dou_lat;
- if (double.TryParse(tag_lng, out dou_lng) && double.TryParse(tag_lat, out dou_lat))
- {
- toolstatus_CurrentLocation.Text ="當前座標:"+ dou_lng.ToString("F5") + "," + dou_lat.ToString("F5");
- }
- }
- catch (Exception ee)
- { MessageBox.Show(ee.Message); }
-
- }
放入一個button命名及代碼以下:算法
- private void btnGetLocation_Click(object sender, EventArgs e)
- {
- if (btnGetLocation.Text == "開啓實時座標")
- {
- timer1.Enabled = true;
- btnGetLocation.Text = "關閉實時座標";
- }
- else
- {
- btnGetLocation.Text = "開啓實時座標";
- timer1.Enabled = false;
- }
- }
JS腳本以下:sql
- var map =new BMap.Map("allmap");
- var first_locate=new BMap.Point(108.953098,34.2778);
- map.centerAndZoom(first_locate,15);
- map.enableScrollWheelZoom(true);
- map.addEventListener("mousemove",GetlngAndlat);
- function GetlngAndlat(e)
- {if(e.point.lng!=null)
- {
-
- document.getElementById("mouselng").innerHTML=e.point.lng;
- document.getElementById("mouselat").innerHTML=e.point.lat;
- }
- }
2.開啓測距工具(百度本身開發的)數據庫
拖一個按鈕:api
- private void btnOpenDistance_Click(object sender, EventArgs e)
- {
- webBrowser1.Document.InvokeScript("openGetDistance");
- }
爲了加載這個工具,是須要引入百度的另外一個工具庫:
JS以下:
- <script type="text/javascript" src="./JScript/DistanceTool_min.js"></script>
- function openGetDistance()
- {
- var myDis=new BMapLib.DistanceTool(map);
- myDis.open();
- }
//上面這個DistanceTool_min.js在百度的DEMO裏有,我只是把它考到個人DEBUG下了,具體路徑本身解決。
3.右擊鼠標給地圖上放marker,每個marker的icon換成小汽車,而且顯示座標編號和座標值,而後每放置一次,將數據存入數據庫。
//放標註
- private void btnPutMarker_Click(object sender, EventArgs e)
- {
- if (radioButton1.Checked || radioButton2.Checked || radioButton3.Checked || radioButton4.Checked)
- webBrowser1.Document.InvokeScript("PUTANDSEND");
- else
- {
- MessageBox.Show("至少選擇一項!");
- }
- }
-
- public string setWhichCar()
- {
- if (radioButton1.Checked)
- return "1";
- if (radioButton2.Checked)
- return "2";
- if (radioButton3.Checked)
- return "3";
- if (radioButton4.Checked)
- return "4";
- return "Erro";
- }
-
- public void PutIntotextBox(object markerIndex,object carNumber,object JSlng,object JSlat)
- {
- text_index.Text =markerIndex.ToString();
- text_num.Text = (string)carNumber;
- text_lng.Text = JSlng.ToString();
- text_lat.Text = JSlat.ToString();
- string sql = "insert into 汽車軌跡數據 values ('"+text_num.Text+"','"+text_index.Text+"','"+text_lng.Text+"','"+text_lat.Text+"','"+DateTime.Now.ToString()+"')";
- DBfunction.getcom(sql);
-
- }
JS腳本以下:
- function PUTANDSEND()
- {
- map.addEventListener("rightclick",putAndsend);
- }
- function putAndsend(e)
- {
-
- var p1=new BMap.Point(e.point.lng,e.point.lat);
- var marker = new BMap.Marker(p1,{icon:myIcon});
- map.addOverlay(marker);
- marker_num++;
- var whichCar=window.external.setWhichCar();
- var label=new BMap.Label(whichCar+"號車-座標"+marker_num+":"+
- "("+e.point.lng+","+e.point.lat+")",{offset:new BMap.Size(20,-10)});
- marker.setLabel(label);
-
- window.external.PutIntotextBox(marker_num,whichCar,e.point.lng,e.point.lat);
-
- }
4.根據上面已經模擬的汽車歷史座標,能夠查詢具體車輛的歷史軌跡(即從數據庫裏提取數據,畫軌跡)
- private void btnDrawOrit_Click(object sender, EventArgs e)
- {
- string ss = "^[0-9]*$";
- string cc = text_whichCar.Text.Trim().ToString();
- bool match = Regex.IsMatch(cc, ss);
- if (Convert.ToInt32(text_whichCar.Text) > 4 || !match||text_whichCar.Text.Trim().Equals(String.Empty))
-
- {
- MessageBox.Show("您輸入的不是數字,或者編號不在範圍內!");
- }
- else
- {
- string getdata_sql = "select * from 汽車軌跡數據 where 汽車編號=" + text_whichCar.Text;
- whichCarData(getdata_sql);
- }
- }
//從數據庫裏的取出經緯度傳送給JS
- public void whichCarData(string limit_sql)
- {
- OleDbDataReader DR = DBfunction.getread(limit_sql);
- ArrayList a = new ArrayList();
- while (DR.Read())
- {
- a.Add(DR[2]);
- a.Add(DR[3]);
- Rows_Num++;
- }
- if (Rows_Num == 0)
- MessageBox.Show("該車輛,無歷史信息!");
- else
- {
- for (int i = 0; i <= 2 * Rows_Num - 1; i++)
- {
- pointArr[i] = Convert.ToDouble(a[i]);
- }
-
- webBrowser1.Document.InvokeScript("DrawOrit1");
- }
- }
-
-
- public int getRowsNumber()
- {
- return Rows_Num;
- }
- public double Getpoints(int index)
- { return pointArr[index]; }
JS腳本以下:
//------------從後臺數據庫得到點集合來畫軌跡(無參數版本),測試可用
- function DrawOrit1()
- {
- var Array=[];
- var total_num= window.external.getRowsNumber();
- for(var i=0;i<=2*total_num-1;i++)
- {
- Array.push(window.external.Getpoints(i));
- }
-
- var PointArr=[];
- for(var i=0;i<=Array.length-1;i+=2)
- {
- PointArr.push(new BMap.Point(Array[i],Array[i+1]));
- }
- var polyline = new BMap.Polyline(PointArr, {strokeColor:"blue", strokeWeight:6, strokeOpacity:0.5});
- map.addOverlay(polyline);
- window.external.ClearRows_num();
- }
5.打開繪圖工具,這個工具能夠畫直線,圓,矩形等等,其中我這裏用的主要是畫圓的方法,畫好圓後,能夠獲得哪些車輛在這個圓內,並將其標註出來(其實就是一個預警範圍)。
//開啓畫圖工具按鈕
- private void btnDrawPicture_Click(object sender, EventArgs e)
- {
- if (radio_Circle.Checked)
- { webBrowser1.Document.InvokeScript("drawCircle"); }
- else
- { webBrowser1.Document.InvokeScript("drawRec"); }
- }
//搜索當前車輛位置,返回各個車輛的座標
- public double SearchAllCars(int index)
- {
-
- string sql="select * from 汽車軌跡數據";
- OleDbDataReader dr= DBfunction.getread(sql);
- ArrayList allCars = new ArrayList();
- while (dr.Read())
- {
- allCars.Add(dr[2]);
- allCars.Add(dr[3]);
- }
- Danger_Num = allCars.Count;
- double[] sendto_JS = new double[allCars.Count];
- allCars.CopyTo(sendto_JS);
-
- return sendto_JS[index];
- }
- public int GetdangerNum()
- { return Danger_Num; }
JS腳本以下:
- <!--加載鼠標繪製工具-->
- <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" />
- var complete=function(e)
- {
- overlays.push(e.overlay);
- if (e.drawingMode == BMAP_DRAWING_CIRCLE)
- {
-
- var test= window.external.SearchAllCars(0);
-
-
- var circle_radius=e.overlay.getRadius();
-
- var circle_point=new BMap.Point(e.overlay.getCenter().lng,e.overlay.getCenter().lat);
-
- var dangerCars=[];
- var pointlen=window.external.GetdangerNum();
-
- for(var k=0;k<=pointlen-1;k++)
- {
- dangerCars.push(window.external.SearchAllCars(k));
- }
- var BMappoints=[];
- for(var j=0;j<=dangerCars.length-1;j+=2)
- {
- BMappoints.push(new BMap.Point(dangerCars[j],dangerCars[j+1]));
- }
-
- for(var i=0;i<=BMappoints.length-1;i++)
- {
- if(map.getDistance(circle_point,BMappoints[i])<=circle_radius)
- {
- AddMarker(BMappoints[i]);
- }
- }
-
- }
-
- };
- var styleOptions = {
- strokeColor:"blue",
- fillColor:"blue",
- strokeWeight: 3,
- strokeOpacity: 1,
- fillOpacity: 0.3,
- strokeStyle: 'solid'
- }
-
- var drawingManager = new BMapLib.DrawingManager(map, {
- isOpen: true,
- enableDrawingTool: true,
- drawingToolOptions: {
- anchor: BMAP_ANCHOR_TOP_RIGHT,
- offset: new BMap.Size(5, 5),
- scale: 0.8,
- drawingTypes : [
- BMAP_DRAWING_CIRCLE,
- BMAP_DRAWING_RECTANGLE
- ]
-
- },
- circleOptions: styleOptions,
- rectangleOptions: styleOptions
- });
-
-
-
-
- drawingManager.addEventListener('overlaycomplete',complete);
-
-
-
-
-
- function $(id){
- return document.getElementById(id);
- }
-
-
- function drawRec(){
- drawingManager.setDrawingMode(BMAP_DRAWING_RECTANGLE);}
-
- function drawCircle(){
- drawingManager.setDrawingMode(BMAP_DRAWING_CIRCLE);}
-
- function clearAll() {
- for(var i = 0; i < overlays.length; i++){
- map.removeOverlay(overlays[i]);
- }
- overlays.length = 0
- }
這個功能比較複雜,必需要加入前兩行的庫鏈接才能夠。由於畫圓能夠獲得圓心和半徑,因此我只須要從數據庫裏取出點,而後一一測量其與圓心的距離,而後和半徑比較,只要小於半徑則就在圓內標註。起初頭讓我畫矩形,畫矩形的DEMO以下:
- var overlaycomplete = function(e){
- overlays.push(e.overlay);
- var result = "";
-
- result += e.drawingMode + ":";
-
- if (e.drawingMode == BMAP_DRAWING_CIRCLE) {
-
- var circle_radius=e.overlay.getRadius();
- var circle_point=new BMap.Point(e.overlay.getCenter().lng,e.overlay.getCenter().lat);
- alert(map.getDistance(circle_point,tests[1]));
- for(var i=0;i<3;i++)
- {
- if(map.getDistance(circle_point,tests[i])<=circle_radius)
- {
- AddMarker(tests[i]);
- }
- }
- alert(result);
- }
- if (e.drawingMode == BMAP_DRAWING_POLYLINE || e.drawingMode == BMAP_DRAWING_POLYGON || e.drawingMode == BMAP_DRAWING_RECTANGLE) {
- result += ' 所畫的點個數:' + e.overlay.getPath()[1].lng;
- alert(result);
- }
-
- };
這裏是修改的百度DEMO,其中有一行result += ' 所畫的點個數:' + e.overlay.getPath()[1].lng;在百度原有的demo裏是這樣寫的result += ' 所畫的點個數:' + e.overlay.getPath().length;只會返回一個數據,我仔細看了下函數名,getPath(),並且還有length的屬性,那麼確定是數組,並且是返回的邊或者點的個數,而邊必定是由點組成的,根據以前的Ployline函數能夠推測,這個函數一定是一個存放多邊形點的數組,那麼我就試了試e.overlay.getPath()[1].lng,看能不能取到某個點的經度值,果真不出我所料,能夠的,當時興奮了好一陣子,有了這個方法,矩形的四個點就都能記錄,那麼就能夠跟數據庫裏取出的點直接進行經緯度比較,也能夠標註預警範圍,不過仍是沒有用圓方便。
因爲時間確實很緊,手頭還有事要作,只能寫到這裏了,歡迎交流,噴也行,哈哈。