这一篇,记录一下我调用的地图API实现的功能。下面介绍的都是一些片段的节选,不能直接复制就运行。在实现之前肯定要加载地图,先放一个webbroser控件,然后如下:

  1. private void Form1_Load(object sender, EventArgs e)
  2. {
  3. string str_url = Application.StartupPath + "\\最终合并版本(昨晚修改).html";
  4. Uri url = new Uri(str_url);
  5. webBrowser1.Url = url;
  6. webBrowser1.ObjectForScripting = this;
  7. }

而为了能与JS交互,首先引入using System.Security.Permissions;,然后在namespace下必须加入两行:

  1. namespace WebBroser_Test_V1._0
  2. {
  3. [PermissionSet(SecurityAction.Demand, Name = "FullTrust")]
  4. [System.Runtime.InteropServices.ComVisibleAttribute(true)]
  5. public partial class Form1 : Form
  6. {
  7. public Form1()
  8. {
  9. InitializeComponent();
  10. }
  11. private void Form1_Load(object sender, EventArgs e)
  12. {
  13. string str_url = Application.StartupPath + "\\最终合并版本(昨晚修改).html";
  14. Uri url = new Uri(str_url);
  15. webBrowser1.Url = url;
  16. webBrowser1.ObjectForScripting = this;
  17. // timer1.Enabled = true;
  18. }
  19. }

有了上面的基础,就可以实现以下功能了。

1.鼠标放在屏幕上移动时,实时的显示坐标。

放入一个timer和一个StatusScrip:

  1. private void timer1_Tick(object sender, EventArgs e)
  2. {
  3. try
  4. {
  5. string tag_lng = webBrowser1.Document.GetElementById("mouselng").InnerText;
  6. string tag_lat = webBrowser1.Document.GetElementById("mouselat").InnerText;
  7. double dou_lng, dou_lat;
  8. if (double.TryParse(tag_lng, out dou_lng) && double.TryParse(tag_lat, out dou_lat))
  9. {
  10. toolstatus_CurrentLocation.Text ="当前坐标:"+ dou_lng.ToString("F5") + "," + dou_lat.ToString("F5");
  11. }
  12. }
  13. catch (Exception ee)
  14. { MessageBox.Show(ee.Message); }
  15. }

放入一个button命名及代码如下:

  1. private void btnGetLocation_Click(object sender, EventArgs e)
  2. {
  3. if (btnGetLocation.Text == "开启实时坐标")
  4. {
  5. timer1.Enabled = true;
  6. btnGetLocation.Text = "关闭实时坐标";
  7. }
  8. else
  9. {
  10. btnGetLocation.Text = "开启实时坐标";
  11. timer1.Enabled = false;
  12. }
  13. }

JS脚本如下:

  1. var map =new BMap.Map("allmap");
  2. var first_locate=new BMap.Point(108.953098,34.2778);
  3. map.centerAndZoom(first_locate,15);
  4. map.enableScrollWheelZoom(true);
  5. map.addEventListener("mousemove",GetlngAndlat);
  6. function GetlngAndlat(e)
  7. {if(e.point.lng!=null)
  8. {
  9. document.getElementById("mouselng").innerHTML=e.point.lng;
  10. document.getElementById("mouselat").innerHTML=e.point.lat;
  11. }
  12. }

2.开启测距工具(百度自己开发的)

拖一个按钮:

  1. //开启测距工具按钮
  2. private void btnOpenDistance_Click(object sender, EventArgs e)
  3. {
  4. webBrowser1.Document.InvokeScript("openGetDistance");
  5. }

为了加载这个工具,是需要引入百度的另一个工具库:

JS如下:

  1. <script type="text/javascript" src="./JScript/DistanceTool_min.js"></script>
  2. function openGetDistance()
  3. {
  4. var myDis=new BMapLib.DistanceTool(map);//map为上面已经初始化好的地图实例
  5. myDis.open();
  6. }

//上面这个DistanceTool_min.js在百度的DEMO里有,我只是把它考到我的DEBUG下了,具体路径自己解决。

3.右击鼠标给地图上放marker,每一个marker的icon换成小汽车,并且显示坐标编号和坐标值,然后每放置一次,将数据存入数据库

//放标注

  1. private void btnPutMarker_Click(object sender, EventArgs e)
  2. {
  3. if (radioButton1.Checked || radioButton2.Checked || radioButton3.Checked || radioButton4.Checked)
  4. webBrowser1.Document.InvokeScript("PUTANDSEND");
  5. else
  6. {
  7. MessageBox.Show("至少选择一项!");
  8. }
  9. }
  10. //得到Radiobutton的值
  11. public string setWhichCar()
  12. {
  13. if (radioButton1.Checked)
  14. return "1";
  15. if (radioButton2.Checked)
  16. return "2";
  17. if (radioButton3.Checked)
  18. return "3";
  19. if (radioButton4.Checked)
  20. return "4";
  21. return "Erro";
  22. }
  23. //将从JS里得到的汽车数据显示到文本框内,并且存入数据库
  24. public void PutIntotextBox(object markerIndex,object carNumber,object JSlng,object JSlat)
  25. {
  26. text_index.Text =markerIndex.ToString();
  27. text_num.Text = (string)carNumber;
  28. text_lng.Text = JSlng.ToString();
  29. text_lat.Text = JSlat.ToString();
  30. string sql = "insert into 汽车轨迹数据 values ('"+text_num.Text+"','"+text_index.Text+"','"+text_lng.Text+"','"+text_lat.Text+"','"+DateTime.Now.ToString()+"')";
  31. DBfunction.getcom(sql);
  32. }

JS脚本如下:

  1. //---------------放标注,并且将JS的数据传送给WINFORM------------
  2. function PUTANDSEND()
  3. {
  4. map.addEventListener("rightclick",putAndsend);
  5. }
  6. function putAndsend(e)
  7. {
  8. //放标注
  9. var p1=new BMap.Point(e.point.lng,e.point.lat);
  10. var marker = new BMap.Marker(p1,{icon:myIcon});//将标注的图标改为小汽车
  11. map.addOverlay(marker);
  12. marker_num++;//标注索引,这个是个全局变量
  13. var whichCar=window.external.setWhichCar();
  14. var label=new BMap.Label(whichCar+"号车-坐标"+marker_num+":"+
  15. "("+e.point.lng+","+e.point.lat+")",{offset:new BMap.Size(20,-10)});
  16. marker.setLabel(label);
  17. //给WINFORM传值
  18. window.external.PutIntotextBox(marker_num,whichCar,e.point.lng,e.point.lat);
  19. }

4.根据上面已经模拟的汽车历史坐标,可以查询具体车辆的历史轨迹(即从数据库里提取数据,画轨迹)

  1. private void btnDrawOrit_Click(object sender, EventArgs e)
  2. {
  3. string ss = "^[0-9]*$"; //正则表达式
  4. string cc = text_whichCar.Text.Trim().ToString();
  5. bool match = Regex.IsMatch(cc, ss);
  6. if (Convert.ToInt32(text_whichCar.Text) > 4 || !match||text_whichCar.Text.Trim().Equals(String.Empty))
  7. // webBrowser1.Document.InvokeScript("PUTANDSEND");
  8. {
  9. MessageBox.Show("您输入的不是数字,或者编号不在范围内!");
  10. }
  11. else
  12. {
  13. string getdata_sql = "select * from 汽车轨迹数据 where 汽车编号=" + text_whichCar.Text;
  14. whichCarData(getdata_sql);
  15. }
  16. }

//从数据库里的取出经纬度传送给JS

  1. public void whichCarData(string limit_sql)
  2. {
  3. OleDbDataReader DR = DBfunction.getread(limit_sql);
  4. ArrayList a = new ArrayList();
  5. while (DR.Read())
  6. {
  7. a.Add(DR[2]);//经度
  8. a.Add(DR[3]);//纬度
  9. Rows_Num++;
  10. }
  11. if (Rows_Num == 0)
  12. MessageBox.Show("该车辆,无历史信息!");
  13. else
  14. {
  15. for (int i = 0; i <= 2 * Rows_Num - 1; i++)
  16. {
  17. pointArr[i] = Convert.ToDouble(a[i]);
  18. }
  19. webBrowser1.Document.InvokeScript("DrawOrit1");
  20. }
  21. }
  22. //辅助方法
  23. //获取计数
  24. public int getRowsNumber()
  25. {
  26. return Rows_Num;
  27. }
  28. //根据索引获取特定坐标
  29. public double Getpoints(int index)
  30. { return pointArr[index]; }

JS脚本如下:

//------------从后台数据库获得点集合来画轨迹(无参数版本),测试可用

  1. function DrawOrit1()
  2. {
  3. var Array=[];
  4. var total_num= window.external.getRowsNumber();
  5. for(var i=0;i<=2*total_num-1;i++)
  6. {
  7. Array.push(window.external.Getpoints(i));
  8. }
  9. var PointArr=[];
  10. for(var i=0;i<=Array.length-1;i+=2)
  11. {//偶数索引存经度,奇数存维度
  12. PointArr.push(new BMap.Point(Array[i],Array[i+1]));
  13. }
  14. var polyline = new BMap.Polyline(PointArr, {strokeColor:"blue", strokeWeight:6,   strokeOpacity:0.5});  //定义折线
  15. map.addOverlay(polyline);
  16. window.external.ClearRows_num();//重置窗体计数器
  17. }

5.打开绘图工具,这个工具可以画直线,圆,矩形等等,其中我这里用的主要是画圆的方法,画好圆后,可以得到哪些车辆在这个圆内,并将其标注出来(其实就是一个预警范围)。

//开启画图工具按钮

  1. private void btnDrawPicture_Click(object sender, EventArgs e)
  2. {
  3. if (radio_Circle.Checked)
  4. { webBrowser1.Document.InvokeScript("drawCircle"); }
  5. else
  6. { webBrowser1.Document.InvokeScript("drawRec"); }
  7. }

//搜索当前车辆位置,返回各个车辆的坐标

  1. public double SearchAllCars(int index)
  2. {
  3. string sql="select * from 汽车轨迹数据";
  4. OleDbDataReader dr= DBfunction.getread(sql);
  5. ArrayList allCars = new ArrayList();
  6. while (dr.Read())
  7. {
  8. allCars.Add(dr[2]);
  9. allCars.Add(dr[3]);
  10. }
  11. Danger_Num = allCars.Count;
  12. double[] sendto_JS = new double[allCars.Count];
  13. allCars.CopyTo(sendto_JS);
  14. return sendto_JS[index];
  15. }
  16. //全局变量,返回有危险的车辆个数
  17. public int GetdangerNum()
  18. { return Danger_Num; }

JS脚本如下:

  1. <!--加载鼠标绘制工具-->
  2. <script type="text/javascript" src="http://api.map.baidu.com/library/DrawingManager/1.4/src/DrawingManager_min.js"></script>
  3. <link rel="stylesheet" href="http://api.map.baidu.com/library/DrawingManager/1.4/src/DrawingManager_min.css" />
  4. //回调获得覆盖物的信息(修改后的版本,已测试可用)
  5. var complete=function(e)
  6. {
  7. overlays.push(e.overlay);
  8. if (e.drawingMode == BMAP_DRAWING_CIRCLE)
  9. {
  10. //随便赋值,刷新一遍数据库(此方法只为演示,实际中要另考虑算法)
  11. var test=  window.external.SearchAllCars(0);
  12. var circle_radius=e.overlay.getRadius();//半径
  13. //圆心
  14. var circle_point=new BMap.Point(e.overlay.getCenter().lng,e.overlay.getCenter().lat);
  15. //从WINFORM里取出数据
  16. var dangerCars=[];
  17. var pointlen=window.external.GetdangerNum();
  18. for(var k=0;k<=pointlen-1;k++)
  19. {
  20. dangerCars.push(window.external.SearchAllCars(k));
  21. }
  22. var BMappoints=[];//创建百度地图接口规定的数组
  23. for(var j=0;j<=dangerCars.length-1;j+=2)
  24. {
  25. BMappoints.push(new BMap.Point(dangerCars[j],dangerCars[j+1]));
  26. }
  27. for(var i=0;i<=BMappoints.length-1;i++)
  28. {
  29. if(map.getDistance(circle_point,BMappoints[i])<=circle_radius)
  30. {
  31. AddMarker(BMappoints[i]);//调用添加标注版本V3.0
  32. }
  33. }
  34. }
  35. };
  36. //线条样式
  37. var styleOptions = {
  38. strokeColor:"blue",    //边线颜色。
  39. fillColor:"blue",      //填充颜色。当参数为空时,圆形将没有填充效果。
  40. strokeWeight: 3,       //边线的宽度,以像素为单位。
  41. strokeOpacity: 1,    //边线透明度,取值范围0 - 1。
  42. fillOpacity: 0.3,      //填充的透明度,取值范围0 - 1。
  43. strokeStyle: 'solid' //边线的样式,solid或dashed。
  44. }
  45. //实例化鼠标绘制工具
  46. var drawingManager = new BMapLib.DrawingManager(map, {
  47. isOpen: true, //是否开启绘制模式
  48. enableDrawingTool: true, //是否显示工具栏
  49. drawingToolOptions: {
  50. anchor: BMAP_ANCHOR_TOP_RIGHT, //位置
  51. offset: new BMap.Size(5, 5), //偏离值
  52. scale: 0.8, //工具栏缩放比例
  53. drawingTypes : [
  54. BMAP_DRAWING_CIRCLE,
  55. BMAP_DRAWING_RECTANGLE
  56. ]
  57. },
  58. circleOptions: styleOptions, //圆的样式
  59. rectangleOptions: styleOptions //矩形的样式
  60. });
  61. //添加鼠标绘制工具监听事件,用于获取绘制结果
  62. drawingManager.addEventListener('overlaycomplete',complete);
  63. //drawingManager.enableCalculate();
  64. //----------------------公用方法,用元素id获取元素的值-------------------
  65. function $(id){
  66. return document.getElementById(id);
  67. }
  68. //------------------画矩形,让WINFORM调用---------------
  69. function drawRec(){
  70. drawingManager.setDrawingMode(BMAP_DRAWING_RECTANGLE);}
  71. //------------------画圆,让WINFORM调用----------------
  72. function drawCircle(){
  73. drawingManager.setDrawingMode(BMAP_DRAWING_CIRCLE);}
  74. //------------------清除所有已画图形,让WINFORM调用--------------------
  75. function clearAll() {
  76. for(var i = 0; i < overlays.length; i++){
  77. map.removeOverlay(overlays[i]);
  78. }
  79. overlays.length = 0
  80. }

这个功能比较复杂,必须要加入前两行的库连接才可以。因为画圆可以得到圆心和半径,所以我只需要从数据库里取出点,然后一一测量其与圆心的距离,然后和半径比较,只要小于半径则就在圆内标注。起初头让我画矩形,画矩形的DEMO如下:

  1. //回调获得覆盖物信息,未使用该版本
  2. var overlaycomplete = function(e){
  3. overlays.push(e.overlay);
  4. var result = "";
  5. result += e.drawingMode + ":";
  6. if (e.drawingMode == BMAP_DRAWING_CIRCLE) {
  7. var circle_radius=e.overlay.getRadius();
  8. var circle_point=new BMap.Point(e.overlay.getCenter().lng,e.overlay.getCenter().lat);
  9. alert(map.getDistance(circle_point,tests[1]));
  10. for(var i=0;i<3;i++)
  11. {
  12. if(map.getDistance(circle_point,tests[i])<=circle_radius)
  13. {
  14. AddMarker(tests[i]);
  15. }
  16. }
  17. alert(result);
  18. }
  19. if (e.drawingMode == BMAP_DRAWING_POLYLINE || e.drawingMode == BMAP_DRAWING_POLYGON || e.drawingMode == BMAP_DRAWING_RECTANGLE) {
  20. result += ' 所画的点个数:' + e.overlay.getPath()[1].lng;
  21. alert(result);
  22. }
  23. };

这里是修改的百度DEMO,其中有一行result += ' 所画的点个数:' + e.overlay.getPath()[1].lng;在百度原有的demo里是这样写的result += ' 所画的点个数:' + e.overlay.getPath().length;只会返回一个数据,我仔细看了下函数名,getPath(),而且还有length的属性,那么肯定是数组,而且是返回的边或者点的个数,而边一定是由点组成的,根据之前的Ployline函数可以推测,这个函数必定是一个存放多边形点的数组,那么我就试了试e.overlay.getPath()[1].lng,看能不能取到某个点的经度值,果然不出我所料,可以的,当时兴奋了好一阵子,有了这个方法,矩形的四个点就都能记录,那么就可以跟数据库里取出的点直接进行经纬度比较,也可以标注预警范围,不过还是没有用圆方便。

由于时间确实很紧,手头还有事要做,只能写到这里了,欢迎交流,喷也行,哈哈。

C#调用百度地图API经验分享(四)的更多相关文章

  1. C#调用百度地图API经验分享(一)

    最近客户提了一个需求,要在网站中添加百度地图的显示,其实原来是有谷歌地图的,但由于谷歌在大陆遭到封杀,只好再给用户增加一个选择了. 下面我将自己最近整理的一些知识分享给大家. 如何使用百度地图API: ...

  2. C#调用百度地图API经验分享(三)

    这一篇我将跟大家分享一下我自己在开发过程中总结出的一些操作地图的方法,属性,及思路,希望可以让大家少走弯路. 1.定位 一般百度的示例DEMO里开始初始化地图时用的都是map.centerAndZoo ...

  3. C#调用百度地图API经验分享(二)

    接着上一篇,将上一篇代码的js提取出来:<script type="text/JavaScript">var map = new BMap.Map("allm ...

  4. Angular 调用百度地图API接口

    Angular 调用百度地图API接口 参考原文:https://blog.csdn.net/yuyinghua0302/article/details/80624274 下面简单介绍一下如何在Ang ...

  5. 调用百度地图Api实现的查看地图功能的小插件

    1. 功能 bMap.js 可根据地理位置调用出百度地图,采用弹出框形式 2.用法 var city = '青岛市'; var address = '香港中路'; bMap.init({ city : ...

  6. 【c#】Form调用百度地图api攻略及常见问题

    首先,在Form中调用百度地图api,我们需要使用webbrowser控件,这个在前面的文章中已经讲过了,可以参照(http://blog.csdn.net/buptgshengod/article/ ...

  7. HTML5调用百度地图API获取当前位置并直接导航目的地的方法

    <!DOCTYPE html> <html lang="zh-cmn-Hans">     <meta charset="UTF-8&quo ...

  8. HTML5 调用百度地图API地理定位

    <!DOCTYPE html> <html> <title>HTML5 HTML5 调用百度地图API地理定位实例</title> <head&g ...

  9. 跨平台移动开发_PhoneGap 使用Geolocation基于所在地理位置坐标调用百度地图API

    使用Geolocation基于所在地理位置坐标调用百度地图API 效果图 示例代码 <!DOCTYPE html> <html> <head> <title& ...

随机推荐

  1. Linux下替代grep高效文本搜索工具

    1.ack yum install ack 2.ag git clone https://github.com/ggreer/the_silver_searcher.git yum install a ...

  2. 静态工厂 + DbHelper

    在 .NET 的学习过程中用过三种数据库:Sql Server.Access.SQLite.Sql Server 用得相对多一点点,但是,麻烦,每次用它都需要开服务,而且还费资源,更麻烦的是拷贝到一台 ...

  3. 迁移桌面程序到MS Store(6)——.NET Portability Analyzer

    上一篇我们简单介绍了.NET Standard,本篇我们来实践.NET Framework 4.5 Class Library到.NET Standard 2.0的转换.        首先让我们来做 ...

  4. PKI信息安全知识点

    1. 什么是X.509? X.509标准是ITU-T设计的PKI标准,他是为了解决X.500目录中的身份鉴别和访问控制问题设计的. 2. 数字证书 数字证书的意义在于回答公钥属于谁的问题,以帮助用户安 ...

  5. 「PKUSC2018」真实排名(排列组合,数学)

    前言 为什么随机跳题会跳到这种题目啊? Solution 我们发现可以把这个东西分情况讨论: 1.这个点没有加倍 这一段相同的可以看成一个点,然后后面的都可以. 这一段看成一个点,然后前面的不能对他造 ...

  6. “全栈2019”Java多线程第三十六章:如何设置线程的等待截止时间

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 下一章 "全栈2019"J ...

  7. 配置iSCSI部署网络存储

    iSCSI( Internet Small Computer System Interface 互联网小型计算机系统接口)是由IBM 下属的两大研发机构一一加利福尼亚AImaden和以色列Haifa研 ...

  8. C语言实现简单CMDShell

    1.首先使用vc6编译器编译后门,并运行 #pragma comment(lib,"ws2_32.lib") #ifdef _MSC_VER #pragma comment( li ...

  9. wp推送消息笔记

    最近想给应用添加推送消息,主要是toast消息,所以就打算去了解一下wp消息推送机制以及实现方法,过程中,查了许多资料,也遇到过一些问题,做完后,自己就做个小笔记,总结一下,好记性不如烂笔头嘛,以后可 ...

  10. node.js中的回调

    同步和阻塞:这两个术语可以互换使用,指的是代码的执行会在函数返回之前停止.如果某个操作阻塞,那么脚本就无法继续,这意味着必须等待. 异步和非阻塞:这两个术语可以互换使用,指的是基于回调的.允许脚本并行 ...