【开源】电子围栏-测距离-测面积-拉框放大-实时路况-逆地理编码的实现

最近项目上涉及到地图,考虑到精度等问题,最终选择了51ditu。要实现电子围栏等等功能,经过几天努力,大致有了个雏形,由于是第一次接触HTML和JavaScript编程,三天下来脑袋大了不少,碰到了一些问题,暂时还在挣扎当中,现在我将雏形工程发布出来,目的在于向大家学习,希望得到各位的指点和教导,以期我的工程能够日益完美。

一、相关文件说明:


        (1) 工程文件我已经放到了http://download.csdn.net/detail/zhangyuehua123/3704087上,免积分下载(可以进入我的资源列表,排在第一个的就是)。为了方便阅读和交流,我在下面也贴出了完整的代码。
        (2) 实时交流方式:QQ--1803220843, [email protected]。期盼讨论、指教!谢谢~~~

二、工程运用目的:
 
         因工程项目需要,用C#设计一个车辆监控软件,其中重要的一部分就是将地图嵌入到软件界面当中。我的思路是运用其强大的webbrowser控件来实现嵌入地图功能。因此,调试Javascript描述的HTML网页就成了工作当中的第一步。

三、地图功能需求:

(1) 测距离。在地图上点击任意两个位置,计算出物理距离。
     (2) 测面积。在地图上拖拽一个多边形,计算出面积。
     (3) 电子围栏。在地图上拖拽一个矩形框,当车辆(暂时用标注marker来模拟)在矩形框内的时候,处于正常状态;当车辆驶出矩形框外的时候,报警。
     (4)实时路况。提供部分城市的实时路况信息。这个功能51dituAPI支持。
     (5)逆地理编码详细描述。在地图上点击任意一个标注(marker),信息浮窗提示当前位置的具体地点。这个功能51dituAPI支持。
     (6)地图鹰眼。
     (7)历史轨迹播放。首先选择车辆,然后选择历史轨迹时间(如从2011-10-18-21:00到2011-10-19-21:00),再选择播放速度,点击播放按钮,就可以在地图上播放出历史行车轨迹。
      (8)鼠标右键。放大、缩小、添加标注功能。

四、雏形版本功能:

(1) 功能:测距离。
      状态:已经完美解决。
      问题:无。

(2) 功能:测面积。 
     状态:已经完美解决。
     问题:无。

(3) 功能:电子围栏。
      状态:已经解决大部分,可以拖拽一个矩形框,用标注(marker)模拟一辆车,当marker在矩形框内的时候,提示没有越界,矩形框显示绿色;当marker拖拽出矩形框时,提示车辆越界,此时矩形框呈红色。
     问题:① 只能先拖拽矩形框,然后才能拖拽标注(marker),否则提示出错。
                 ② 想用更多的标注(marker)来模拟汽车,用鼠标右键来实现添加标注功能。但是marker能够添加进去,但是不能实现类似可以拖拽的marker那样提示经纬度的功能,所以暂时只能通过拖拽地图上唯一的一个“可以拖拽的标注(marker)”来模拟汽车时候越界。

(4) 功能:实时路况。 
     状态:已经完美解决。
     问题:无。

(5)功能:逆地理编码详细描述。 
     状态:已经完美解决。
    问题:标注还是太少,最好是能用更多的“动态的marker”来模拟汽车,在每个marker上单击就可以显示当前的地理位置信息提示窗。

(6) 功能:地图鹰眼。 
      状态:已经完美解决。
      问题:无。

(7)功能:历史轨迹播放。 
     状态:还没开始做。
     问题:我的思路是:
                 ①将车辆信息(主要是经纬度数据)存储在本地Xml文件中,然后用javascript读取经纬度数据,调用51ditu的API,在地图上添加marker,设置系统时间(添加一个定时器),用于地图刷新,这样可以实现“播放速度”功能,选择播放速度实际上就是选择不同的定时器时间。
                 ②至于“选择历史轨迹的起止时间”,暂时的想法也是通过javascript从Xml文件中读取历史信息,选择不同的时间段,获取其时间段内的经纬度值,然后在地图上marker出来。

(8)功能:鼠标右键。 
     状态:解决了一部分。
     问题:功能单一,还需扩展。

五、雏形版本截图:

六、附源代码:

[javascript] view plain copy

print?

  1. <html xmlns:v="urn:schemas-microsoft-com:vml">
  2. <head>
  3. <meta http-equiv="content-type" content="text/html; charset=GB2312"/>
  4. <style type="text/css">v\:*{behavior:url(#default#VML);}</style>
  5. <style type="text/css">
  6. html,body
  7. {
  8. background:#FFFFFF;
  9. overflow : auto;
  10. }
  11. table
  12. {
  13. font-size:12px;
  14. font-weight:bold;
  15. color:#E066FF;
  16. }
  17. input
  18. {
  19. font-size: 12px;
  20. color:#E066FF;
  21. }
  22. </style>
  23. <script language="javascript" src="http://api.51ditu.com/js/maps.js"></script>
  24. <script language="javascript" src="http://api.51ditu.com/js/traffic.js"></script>
  25. <script language="javascript">
  26. var map;
  27. var mgr;
  28. var poit;
  29. var scaleControl;          /* 比例尺控件 */
  30. var icon;                  /* 标注自定义图标样式 */
  31. var mapText;               /* 添加文字标签 */
  32. var controlZoom;           /* 拉框放大控件 */
  33. var controlDistance;       /* 测距离控件 */
  34. var controlMianji;         /* 侧面积控件 */
  35. var aryRightMenu;         /* 右键菜单数组 */
  36. var zoomIn;                /* 右键放大 */
  37. var zoomOut;               /* 右键缩小 */
  38. var markerRightMenu;       /* 右键添加标注 */
  39. var menuRightMenu;         /* 添加右键菜单控件到地图上 */
  40. var LatMin;                /* 矩形框的边界值,最小维度  */
  41. var LatMax;                /* 矩形框的边界值,最大维度  */
  42. var LonMin;                /* 矩形框的边界值,最小经度  */
  43. var LonMax;                /* 矩形框的边界值,最大经度  */
  44. var rect;                  /* 矩形框对象 */
  45. var controlOfweilan;       /* 建立新的拉框查找控件对象 */
  46. var markerToDrag;          /* 可拖拽的标注对象 */
  47. /*===================== 主函数 ===================== */
  48. function onLoad()
  49. {
  50. map=new LTMaps("mapDiv");           /* 创建地图 */
  51. point = new LTPoint( 10645971,2956742 );
  52. map.centerAndZoom( point,2 );
  53. map.setMapCursor("hand","move");        /* 设置鼠标在地图上的形状 */
  54. map.addControl(new LTStandMapControl());
  55. map.addControl(new LTOverviewMapControl());     /* 添加鹰眼 */
  56. mgr = new LTTraffic(map);
  57. scaleControl=new LTScaleControl();             /* 添加比例尺 */
  58. scaleControl.units=[[1000,"km"],[1,"m"]];
  59. scaleControl.setColor("red");
  60. scaleControl.setLeft(280);
  61. map.addControl(scaleControl);
  62. map.handleMouseScroll(true);          /* 鼠标滚轮操作 */
  63. map.mapCartoonControl(true);          /* 滚轮操作时,地图动画效果展示放大和缩小 */
  64. LTEvent.bind(map,"dblclick",map,function(){{this.zoomIn()}});    /* 双击放大地图 */
  65. icon=new LTIcon("C:\\centerPoi.gif",[24,24],[12,12]);     /* 添加标注 */
  66. var marker = new LTMarker( point,icon );
  67. map.addOverLay( marker );
  68. LTEvent.addListener( marker , "click" , doitForMarker);   /* 给标记添加点击事件,点击显示当前的详细地理位置 */
  69. mapText = new LTMapText( marker );      /* 为标注添加文字标签 */
  70. mapText.setLabel("{2}" );
  71. mapText.setBackgroundColor("#CAFF70");
  72. mapText.setFontColor("#D15FEE");
  73. map.addOverLay( mapText );
  74. var myHtml="我在这里,这是第1个标记";
  75. var infoWin=mapText.openInfoWinHtml(myHtml);
  76. infoWin.setTitle("这里是我的标记的标题");
  77. LTEvent.addListener( mapText , "click" ,getClickCallBack(mapText,myHtml));
  78. controlZoom =  new LTZoomInControl();
  79. controlZoom.setTop( 400 );
  80. controlZoom.setLeft( 30 );
  81. controlZoom.setLabel("拉框放大");            /*拉框放大*/
  82. map.addControl(controlZoom);
  83. controlDistance=new LTPolyLineControl();
  84. controlDistance.setTop( 350 );
  85. controlDistance.setLeft( 30 );
  86. controlDistance.setLabel(" 测距离 ");     /*测距离按钮*/
  87. controlDistance.lineColor="red";
  88. controlDistance.lineStroke=1;
  89. controlDistance.lineOpacity=1;
  90. controlDistance.lineStyle="ShortDash";
  91. controlDistance.lineArrow=["Open","Open"];
  92. map.addControl(controlDistance);
  93. LTEvent.addListener(controlDistance,"draw",onDraw);
  94. controlMianji = new LTPolygonControl();
  95. map.addControl( controlMianji );
  96. controlMianji.setTop( 300 );
  97. controlMianji.setLeft( 30 );
  98. controlMianji.setLabel(" 测面积 ");      /*测面积按钮*/
  99. aryRightMenu = new Array();
  100. zoomIn = new LTMenuItem();            /* 右键放大 */
  101. zoomIn.id = "zoomIn";
  102. zoomIn.menuText = "放大";
  103. zoomIn.functionName = mapZoomIn;
  104. aryRightMenu.push(zoomIn);
  105. zoomOut = new LTMenuItem();         /* 右键缩小 */
  106. zoomOut.id = "zoomOut";
  107. zoomOut.menuText ="缩小";
  108. zoomOut.functionName = mapZoomOut;
  109. aryRightMenu.push(zoomOut);
  110. markerRightMenu = new LTMenuItem();    /* 右键添加标注 */
  111. markerRightMenu.id = "marker";
  112. markerRightMenu.menuText ="在此添加标注";
  113. markerRightMenu.functionName = mapMarker;
  114. aryRightMenu.push(markerRightMenu);
  115. menuRightMenu = new LTMenuControl(aryRightMenu);  /* 添加右键菜单控件到地图上 */
  116. map.addMenuControl(menuRightMenu);
  117. controlOfweilan = new LTZoomSearchControl("red","red",1,0.4);       /* 建立新的拉框查找控件 */
  118. controlOfweilan.setTop( 450 );
  119. controlOfweilan.setLeft( 30 );
  120. controlOfweilan.setLabel("电子围栏" );
  121. map.addControl(controlOfweilan);            /* 添加控件到地图 */
  122. markerToDrag=new LTMarker(point);
  123. markerToDrag.enableDrag();
  124. map.addOverLay(markerToDrag);
  125. LTEvent.addListener(markerToDrag,"dragend",onDragEnd);   /* 设置用户在拖拽标记之后执行onDragEnd函数 */
  126. LTEvent.addListener(controlOfweilan,"mouseup",doit);               /* 设置在用户拉框完成之后执行doit函数 */
  127. }
  128. /*======================  在标记被点击的时候执行的函数,marker的onClick监听的事件 ====================== */
  129. function doitForMarker()
  130. {
  131. onClickForMarker();
  132. }
  133. /*======================  在标记被点击的时候执行的函数 ====================== */
  134. function onClickForMarker()
  135. {
  136. var reg=new LTRegoLoader();
  137. LTEvent.bind(reg,"loaded",reg,myLocation);
  138. reg.loadDescribe(point);
  139. }
  140. /*======================  onClickForMarker函数中,reg对象绑定的事件myLocation ====================== */
  141. function myLocation(obj)
  142. {
  143. var myHtml = obj.describe;   /* 逆地理信息描述 */
  144. var infoWin=mapText.openInfoWinHtml(myHtml);
  145. infoWin.setTitle("当前具体位置");
  146. }
  147. /*====================== 本函数是在用户每次拉框操作完成之后执行的操作,bounds是代表用户拉框选择的区域的范围 ====================== */
  148. function doit(bounds)
  149. {
  150. var str="电子围栏区域坐标为:\n";
  151. str+="起点:"+bounds.getXmin()+","+bounds.getYmax()+"\n";
  152. str+="终点:"+bounds.getXmax()+","+bounds.getYmin()+"\n";
  153. alert(str);
  154. LatMin  = bounds.getYmin();    /*  保存当前矩形框的经纬度值,在后面的判断中要用到 */
  155. LatMax = bounds.getYmax();
  156. LonMin = bounds.getXmin();
  157. LonMax = bounds.getXmax();
  158. rect = new LTRect(bounds);    /* 矩形框对象 */
  159. map.addOverLay(rect);          /* 将矩形框对象添加到地图上 */
  160. }
  161. /*====================== 本函数是在用户每次拖拽标注操作完成之后执行的操作 ======================*/
  162. function onDragEnd(point)
  163. {
  164. var str="标注被拖动到:\n";
  165. str+="经度:"+point.getLongitude()+"\n";
  166. str+="纬度:"+point.getLatitude()+ "\n";
  167. alert(str);
  168. if(point.getLongitude()>LonMin && point.getLongitude()<LonMax && point.getLatitude()<LatMax && point.getLatitude()>LatMin)
  169. {
  170. alert("您当前的位置在矩形内,OK!");
  171. rect.setLineColor("blue");
  172. rect.setFillColor("green");
  173. rect.setLineStroke(3);
  174. }
  175. else
  176. {
  177. alert("您的位置不在在矩形内,Warning!");
  178. rect.setLineColor("red");
  179. rect.setFillColor("red");
  180. rect.setLineStroke(5);
  181. }
  182. }
  183. /*====================== 右键菜单====================== */
  184. function mapZoomIn(){  map.zoomIn();   }
  185. function mapZoomOut(){ map.zoomOut();   }
  186. function mapMarker(p){  var markerRightMenu0 = new LTMarker(p);  map.addOverLay(markerRightMenu0);  }
  187. /*====================== 测距====================== */
  188. function onDraw(points,length,polyline)
  189. {
  190. alert("结束测距");
  191. }
  192. /*====================== 添加信息浮窗 ====================== */
  193. function getClickCallBack(mapText,myHtml)
  194. {
  195. return function()
  196. {
  197. mapText.openInfoWinHtml( myHtml );
  198. }
  199. }
  200. /*====================== 打开实时交通 ====================== */
  201. function openTraffic()
  202. {
  203. mgr.addTips();     /* 显示路况提示信息*/
  204. if(mgr.getTrafficEnabled())     /* 判断实时交通是否开启,true为开启,false为关闭 */
  205. {
  206. alert("实时交通已经开启");
  207. return;
  208. }
  209. var city = document.getElementById("city");   /* 将地图定位到下拉菜单所显示的城市*/
  210. map.centerAndZoom(city.value,8);
  211. mgr.openTraffic(city.value);                                  /*打开实时交通*/
  212. }
  213. /*====================== 关闭时实交通 ======================*/
  214. function closeTraffic()
  215. {
  216. mgr.removeTips();      /*  显示路况提示信息 */
  217. mgr.closeTraffic();      /*  关闭时实交通 */
  218. }
  219. /*====================== 更换城市 ====================== */
  220. function changeCity()
  221. {
  222. if(mgr && mgr.getTrafficEnabled())  /*如果实时交通已打开,将其关闭*/
  223. {
  224. mgr.closeTraffic();
  225. }
  226. var city = document.getElementById("city");
  227. map.centerAndZoom(city.value,8);             /* 将地图定位到下拉菜单所显示的城市 */
  228. }
  229. </script>
  230. </head>
  231. <body onLoad="onLoad()">
  232. <body   leftmargin= "0 "   topmargin= "0 "   marginwidth= "0"   marginheight= "0 ">
  233. <div id="mapDiv" style="position:absolute;width:100%; height:100%;"></div>
  234. <div id="trafficID" style="position:absolute;right:180px;">
  235. <table>
  236. <tr>
  237. <td>实时路况:
  238. <select id="city" onChange="changeCity();">
  239. <option value="beijing">北京</option>
  240. <option value="shanghai">上海</option>
  241. <option value="guangzhou">广州</option>
  242. <option value="shenzhen">深圳</option>
  243. <option value="chengdu">成都</option>
  244. <option value="chongqing">重庆</option>
  245. <option value="shenyang">沈阳</option>
  246. </select>
  247. <input type="button" name="button" value="开启" onClick="openTraffic();">
  248. <input type="button" name="button" value="关闭" onClick="closeTraffic();">
  249. </td>
  250. </tr>
  251. </table>
  252. </div>
  253. </body>
  254. </html>
时间: 2024-07-31 14:31:37

【开源】电子围栏-测距离-测面积-拉框放大-实时路况-逆地理编码的实现的相关文章

SuperMap(JavaScript) 拉框放大和缩小功能实现

版权声明:本文为博主原创文章,未经博主允许不得转载. 1 var ZoomControl; 2 3 /* 4 * 拉框缩小 5 */ 6 function ZoomOut(){ 7 if(ZoomControl==null||ZoomControl=='undefined'){ 8 ZoomControl = new SuperMap.Control.ZoomBox({out:true}); 9 map.addControl(ZoomControl); 10 } 11 else{ 12 Zoom

openlayers之绘制矩形星星拉框放大自定义图形

简介:openlayers绘制矩形.星星.拉框绘制,以及自定义图形. 实际是对ol.interaction.Draw的扩展,geometryFunction属性. 查看详细教程 原文地址:https://www.cnblogs.com/dqygiser/p/9782169.html

自定义Angular指令与jQuery实现的Bootstrap风格数据双向绑定的单选&amp;多选下拉框

先说点闲话,熟悉Angular的猿们会喜欢这个插件的. 00.本末倒置 不得不承认我是一个喜欢本末倒置的人,学生时代就喜欢先把晚交的作业先做,留着马上就要交的作业不做,然后慢悠悠做完不重要的作业,卧槽,XX作业马上要交了,赶紧补补补.如今做这个项目,因为没找到合适的多选下拉Web插件,又不想用html自带的丑陋的<select multiple></select>,自己花了一整天时间做了一个.或许这样占用的主要功能开发的时间,开发起来会更有紧迫感吧.感觉自己是个抖M自虐倾向,并且伴

002 Leaflet 第二个demo 地图上的矩形拉框选择

一.使用到的文件 leaflet-src.js leaflet.css label相关js, 可以从以下网址下载 https://github.com/Leaflet/Leaflet.label 需要leaflet的相关插件都可以从http://leafletjs.com/plugins.html  leafletjs.com的插件列表中下载 二.源码 <!DOCTYPE html> <html> <head> <link rel="stylesheet

jquery Combo Select 下拉框可选可输入插件

Combo Select 是一款友好的 jQuery 下拉框插件,在 PC 浏览器上它能模拟一个简单漂亮的下拉框,在 iPad 等移动设备上又能回退到原生样式.Combo Select 能够对选项进行检索过滤,同时支持键盘控制. 支持浏览器: Safari, Chrome, Firefox, Opera iOS, Android, IE Mobile Internet Explorer IE 8 and above 开源地址:http://www.oschina.net/p/combo-sele

优化jeecg底层高级查询,支持bool值和下拉框查询

最近在用jeecg做项目,在使用高级查询的时候发现它不支持布尔值的查询以及列表的下拉框的查询,所以小编修改了底层代码,完善了高级查询,现在与大家一起分享.先上一张图给大家看一下修改前的高级查询. 它只支持了文本的查询以及日期格式的查询,很难满足在使用过程中的要求.所以小编把他的功能丰富了一下,下面把源码分享给大家. 首先先简单介绍一下jeecg高级查询的原理,一切的秘密都在DataGridTag这个标签类里面,在打开一个页面的时候,这个类会对页面的左右变迁进行初始化,以及对高级查询的页面进行构造

[原创]自己动手实现React-Native下拉框控件

因项目需要,自己动手实现了一个下拉框组件,最近得空将控件独立出来开源上传到了Github和npm. Github地址(求Star 求Star 求Star ??):https://github.com/sohobloo/react-native-modal-dropdown Github上全英文的readme方便国际友人,这里就写个中文的吧. react-native-modal-dropdown 一个react-native的下拉框组件,支持安卓和iOS. 特点 纯JS组件. 一份代码兼容iOS

Jquery动态设置下拉框selected --(2018 08/12-08/26周总结)

1.Jquery动态根据内容设置下拉框selected 需求就是根据下拉框的值动态的设置为selected,本以为很简单,网上一大推的方法,挨着尝试了之后却发现没有一个是有用的.网上的做法如下: <select id="selectID "> <option>选择A</option> <option>选择B</option> <option>选择C</option> </select> //

读取mysql中的特定列值放入页面的下拉框中

1.使用的技术:JSP,Spring JDBC(Mapper) 2.代码 2.1 接口 public interface IMeetingRoomDao { public List<Mrcap> selectCap(); public List<Mrfloor> selectFloor(); } 2.2 实现类 @Override public List<Mrcap> selectCap() { List<Mrcap> caplist = new Array