又是高度集中开发路径模块的一天。真希望自己以后都可以如此的专注和高效(虽然知道很难一直都保持这样的状态,我会坚持的~哈哈哈)

言归正传,今天开发了途径点的功能和改进了些相关起点、终点的代码。先说一下我近点遇到的几个主要的问题(最近遇到问题都会把问题手写在纸上,这样能让自己更好的专注于问题本身,能在最短的时间内解决问题并且方便现在写博客)

1、如何像百度地图一样把途径点的个数控制在五个以内。代码如下:

  1. ctMenuForMap.addChild(menuItem = new MenuItem({
  2. label: "设为途径点",
  3. onClick: function (evt) {
  4. var num = 0;
  5. flag ++; //falg为全局变量,目的是控制途径点的个数
  6. var symbol;
  7.  
  8. clearRoutes();
  9. symbol = new PictureMarkerSymbol({
  10. "width": 45,
  11. "height": 69,
  12. "type": "esriPMS"
  13. });
  14. switch (flag) {
  15. case 1:
  16. symbol.url = "pathwayPoint1.png";
  17. break;
  18. case 2:
  19. symbol.url = "pathwayPoint2.png";
  20. break;
  21. case 3:
  22. symbol.url = "pathwayPoint3.png";
  23. break;
  24. case 4:
  25. symbol.url = "pathwayPoint4.png";
  26. break;
  27. case 5:
  28. symbol.url = "pathwayPoint5.png";
  29. menuItem.disabled = true;
  30. break;
  31. }
  32. var graphic = new Graphic(geometryJsonUtils.fromJson(currentLocation.toJson()), symbol);
  33. routeParams.stops.features.push(
  34. map.graphics.add(graphic)
  35. );
  36. editToolbar.activate(Edit.MOVE, graphic);
  37. pathwayPrve = graphic;
  38.  
  39. for (var i = routeParams.stops.features.length-1; i>=0; i--) {
  40. if (routeParams.stops.features[i].symbol.url === "originPoint.png") {
  41. num++;
  42. }
  43. if (routeParams.stops.features[i].symbol.url === "endPoint.png") {
  44. num ++;
  45. }
  46. }
  47.  
  48. if (num == 2){
  49. routeTask.solve(routeParams, showRoute, errorHandler);
  50. }
  51.  
  52. }
  53. }));
  1. flag为全局变量,用flag的大小来控制途径点的个数,由于每个途径点的图片是不一样的,因此才用了switch语句。

2、如何在onClick函数(onClick函数为MenuItem的方法)里面设置MenuItem()构造函数的disabled属性。

  1. 解:命名menuItem = new MenuItem();然后在onClick里面用menuItem.disabled = true;来设置构造函数的属性。这样的话,当设置了5个途径点后再看菜单的话,途径点的选项就无法点击了。

  1.  

3、如何对移动起点、途径点和终点。

  1. editToolbar.activate(Edit.MOVE, graphic);

4、移动之后如何触发路径的再建立。

  1.  
  1. 我贴出所有代码,里面有相关的注释。
  1. var editToolbar;
  2. var currentLocation
  3. require(["esri/map", "esri/geometry/Point", "esri/layers/ArcGISDynamicMapServiceLayer", "esri/toolbars/draw", "esri/toolbars/edit",
  4. "esri/symbols/SimpleMarkerSymbol","esri/symbols/SimpleLineSymbol", "esri/symbols/SimpleFillSymbol",
  5. "esri/symbols/PictureMarkerSymbol", "esri/graphic", "esri/geometry/jsonUtils", "esri/tasks/RouteTask", "esri/tasks/FeatureSet",
  6. "esri/tasks/RouteParameters", "esri/Color", "dojo/parser", "dijit/Menu",
  7. "dijit/MenuItem", "dijit/MenuSeparator", "dijit/form/Button",
  8. "dijit/layout/BorderContainer", "dijit/layout/ContentPane", "dojo/domReady!"],
  9. function (
  10. Map, Point, ArcGISDynamicMapServiceLayer, Draw, Edit, SimpleMarkerSymbol, SimpleLineSymbol,
  11. SimpleFillSymbol, PictureMarkerSymbol, Graphic, geometryJsonUtils, RouteTask, FeatureSet, RouteParameters, Color, parser, Menu,
  12. MenuItem, MenuSeparator
  13. ) {
  14. var routes = [];
  15. var flag1, flag2 = false;
  16. var originPrve, pathwayPrve, endPrve;
  17. var graphic1, graphic2, graphic3;
  18. var flag = 0, x = 0, y = 0;
  19. var editToolbar;
  20.  
  21. parser.parse();
  22.  
  23. var map = new Map("mapDiv");
  24. var url = "http://localhost:6080/arcgis/rest/services/china1/MapServer";
  25. var agoLayer = new ArcGISDynamicMapServiceLayer(url);
  26. map.addLayer(agoLayer);
  27.  
  28. routeTask = new RouteTask("http://localhost:6080/arcgis/rest/services/road/NAServer/Route");
  29. routeParams = new RouteParameters();
  30. routeParams.stops = new FeatureSet();
  31.  
  32. routeSymbol = new SimpleLineSymbol().setColor(new Color([0, 0, 255, 0.5])).setWidth(5);
  33.  
  34. map.on("click", pointMove);
  35. map.on("load", createToolbarMenu);
  36.  
  37. //使各个点移动结束后触发路径的再建立
  38. function pointMove (evt) {
  39. if (originPrve) {
  40.  
  41. editToolbar.on("graphic-move-stop", function (originPrve) {
  42. var num = 0;
  43. clearRoutes();
  44.  
  45. for (var i = routeParams.stops.features.length-1; i>=0; i--) {
  46. if (routeParams.stops.features[i].symbol.url === "originPoint.png") {
  47. num++;
  48. }
  49. if (routeParams.stops.features[i].symbol.url === "endPoint.png") {
  50. num ++;
  51. }
  52. }
  53.  
  54. if (num == 2){
  55. routeTask.solve(routeParams, showRoute, errorHandler);
  56. }
  57. });
  58. }
  59.  
  60. if (pathwayPrve) {
  61. editToolbar.on("graphic-move-stop", function (pathwayPrve) {
  62. var num = 0;
  63. clearRoutes();
  64.  
  65. for (var i = routeParams.stops.features.length-1; i>=0; i--) {
  66. if (routeParams.stops.features[i].symbol.url === "originPoint.png") {
  67. num++;
  68. }
  69. if (routeParams.stops.features[i].symbol.url === "endPoint.png") {
  70. num ++;
  71. }
  72. }
  73.  
  74. if (num == 2){
  75. routeTask.solve(routeParams, showRoute, errorHandler);
  76. }
  77. });
  78. }
  79.  
  80. if (endPrve) {
  81. editToolbar.on("graphic-move-stop", function (endPrve) {
  82. var num = 0;
  83. clearRoutes();
  84.  
  85. for (var i = routeParams.stops.features.length-1; i>=0; i--) {
  86. if (routeParams.stops.features[i].symbol.url === "originPoint.png") {
  87. num++;
  88. }
  89. if (routeParams.stops.features[i].symbol.url === "endPoint.png") {
  90. num ++;
  91. }
  92. }
  93.  
  94. if (num == 2){
  95. routeTask.solve(routeParams, showRoute, errorHandler);
  96. }
  97. });
  98. }
  99. }
  100.  
  101. function createToolbarMenu () {
  102. editToolbar = new Edit(map);
  103.  
  104. createMapMenu();
  105. }
  106.  
  107. function createMapMenu() {
  108. var ctMenuForMap = new Menu({
  109. onOpen: function (box) {
  110. currentLocation = getMapPointFromMenuPosition(box);
  111. }
  112. });
  113.  
  114. ctMenuForMap.addChild(new MenuItem({
  115. label: "设为起点",
  116. onClick: function (evt) {//起点只 能有一个
  117. var num = 0;
  118.  
  119. if (flag1) {
  120. for (var i = routeParams.stops.features.length-1; i>=0; i--) {
  121. if (routeParams.stops.features[i].symbol.url === "originPoint.png") {
  122. routeParams.stops.features.splice(i, 1)[0];
  123. }
  124. }
  125.  
  126. map.graphics.remove(originPrve)
  127. clearRoutes();
  128. }
  129. var symbol = new PictureMarkerSymbol({
  130. "url": "originPoint.png",
  131. "height": 63,
  132. "width": 45,
  133. "type": "esriPMS"
  134. });
  135. var graphic = new Graphic(geometryJsonUtils.fromJson(currentLocation.toJson()), symbol);
  136. routeParams.stops.features.push(
  137. map.graphics.add(graphic)
  138. );
  139.  
  140. originPrve = graphic;
  141. editToolbar.activate(Edit.MOVE, originPrve);
  142.  
  143. flag1 = true;
  144.  
  145. //只有在起点和终点都设立之后才可以生成路径
  146. for (var i = routeParams.stops.features.length-1; i>=0; i--) {
  147. if (routeParams.stops.features[i].symbol.url === "originPoint.png") {
  148. num++;
  149. }
  150. if (routeParams.stops.features[i].symbol.url === "endPoint.png") {
  151. num ++;
  152. }
  153. }
  154.  
  155. if (num == 2){
  156. routeTask.solve(routeParams, showRoute, errorHandler);
  157. }
  158. }
  159. }));
  160.  
  161. ctMenuForMap.addChild(menuItem = new MenuItem({
  162. label: "设为途径点",
  163. onClick: function (evt) {
  164. var num = 0;
  165. flag ++; //falg为全局变量,目的是控制途径点的个数
  166. var symbol;
  167.  
  168. clearRoutes();
  169. symbol = new PictureMarkerSymbol({
  170. "width": 45,
  171. "height": 69,
  172. "type": "esriPMS"
  173. });
  174. switch (flag) {
  175. case 1:
  176. symbol.url = "pathwayPoint1.png";
  177. break;
  178. case 2:
  179. symbol.url = "pathwayPoint2.png";
  180. break;
  181. case 3:
  182. symbol.url = "pathwayPoint3.png";
  183. break;
  184. case 4:
  185. symbol.url = "pathwayPoint4.png";
  186. break;
  187. case 5:
  188. symbol.url = "pathwayPoint5.png";
  189. menuItem.disabled = true;
  190. break;
  191. }
  192. var graphic = new Graphic(geometryJsonUtils.fromJson(currentLocation.toJson()), symbol);
  193. routeParams.stops.features.push(
  194. map.graphics.add(graphic)
  195. );
  196. editToolbar.activate(Edit.MOVE, graphic);
  197. pathwayPrve = graphic;
  198.  
  199. for (var i = routeParams.stops.features.length-1; i>=0; i--) {
  200. if (routeParams.stops.features[i].symbol.url === "originPoint.png") {
  201. num++;
  202. }
  203. if (routeParams.stops.features[i].symbol.url === "endPoint.png") {
  204. num ++;
  205. }
  206. }
  207.  
  208. if (num == 2){
  209. routeTask.solve(routeParams, showRoute, errorHandler);
  210. }
  211.  
  212. }
  213. }));
  214.  
  215. ctMenuForMap.addChild(new MenuItem({
  216. label: "设为终点",
  217. onClick: function (evt) {
  218. var num = 0;
  219.  
  220. if (flag2) {//终点只能有一个
  221. for (var i = routeParams.stops.features.length-1; i>=0; i--) {
  222. if (routeParams.stops.features[i].symbol.url === "endPoint.png") {
  223. routeParams.stops.features.splice(i, 1)[0];
  224. }
  225. }
  226. map.graphics.remove(endPrve)
  227. clearRoutes();
  228. }
  229.  
  230. var symbol = new PictureMarkerSymbol({
  231. "url": "endPoint.png",
  232. "width": 45,
  233. "height": 61,
  234. "type": "esriPMS"
  235.  
  236. });
  237. var graphic = new Graphic(geometryJsonUtils.fromJson(currentLocation.toJson()), symbol);
  238. routeParams.stops.features.push(
  239. map.graphics.add(graphic)
  240. );
  241. editToolbar.activate(Edit.MOVE, graphic);
  242.  
  243. endPrve = graphic;
  244. flag2 = true;
  245.  
  246. for (var i = routeParams.stops.features.length-1; i>=0; i--) {
  247. if (routeParams.stops.features[i].symbol.url === "originPoint.png") {
  248. num++;
  249. }
  250. if (routeParams.stops.features[i].symbol.url === "endPoint.png") {
  251. num ++;
  252. }
  253. }
  254.  
  255. if (num == 2){
  256. routeTask.solve(routeParams, showRoute, errorHandler);
  257. }
  258. }
  259. }));
  260.  
  261. ctMenuForMap.startup();
  262. ctMenuForMap.bindDomNode(map.container);
  263. }
  264.  
  265. function getMapPointFromMenuPosition (box) {
  266. var x = box.x, y = box.y;
  267. var screenPoint = new Point(x - map.position.x, y - map.position.y);
  268. return map.toMap(screenPoint);
  269. }
  270.  
  271. function showRoute (result) {
  272.  
  273. var routeResults = result.routeResults;
  274. routes.push(
  275. map.graphics.add(routeResults[0].route.setSymbol(routeSymbol))
  276. );
  277. var msgs = ["服务器消息:"];
  278. for (var i = 0; i < result.messages.length; i++) {
  279. msgs.push(result.messages[i].type + " : " + result.messages[i].description);
  280. }
  281. if (msgs.length > 1) {
  282. alert(msgs.join("\n - "));
  283. }
  284. }
  285.  
  286. function clearRoutes() {
  287. for (var i = routes.length - 1; i >= 0; i--) {
  288. map.graphics.remove(routes.splice(i, 1)[0]);
  289. }
  290. routes = [];
  291. }
  292.  
  293. function errorHandler(err) {
  294. alert("发生错误\n" + err.message + "\n" + err.details.join("\n"));
  295. }
  296.  
  297. })

未解决的问题:

1、我目前是通过“Click”地图的事件来触发pointMove(),我需要解决的是在任何一个graphic开始移动的时候就触发pointMove()。

2、在创建了一个新的点之后,之前创建的点就不能够被拖拽了,即只有新建的点才有被拖拽的功能,即是editToolbar.activate(Edit.MOVE, graphic);这个方法在其他店创建之后便被其他点的graphic给更换了(代码里我是用不同的全局变量放到这个方法里面即如originPrve = graphic;editToolbar.activate(Edit.MOVE, originPrve);,但是也没有)。

3、目前我只能把点设置在公路图层上面,不能像百度地图一样在地图上随意的设置点虽然我大概了解实现这一功能的原理,但还是不知道怎么去做。。。这或许是在开发路径模块中遇到最大的问题了~

最后,Stick to write blog!

ArcGIS for JavaScript 关于路径开发的一些记录(二)的更多相关文章

  1. ArcGIS for JavaScript 关于路径开发的一些记录(一)

    今年毕业,进入公司的第一个任务就是单独负责一个项目的地图模块,用ArcGIS API for JavaScript来开发web地图.花了大概一个礼拜的时间学会了安装和搭建ArcGIS Server和A ...

  2. ArcGIS for JavaScript 关于路径开发的一些记录(三)

    最近被一个bug困扰了两天~ 我新发布了一个NAserver(路径分析服务),但是放在之前的代码里面发现不能生成路径.经过我的调试发现并没有代码并没有报错,并且能够返回所生成路径的Graphic la ...

  3. JavaScript设计模式与开发实践随笔(二)

    多态 多态的实际含义是:同一操作作用于不同的对象上面,可以产生不同的解释和不同的执行结果.换句话说,给不同的对象发送同一个消息的时候,这些对象会根据这个消息分别给出不同的反馈 var makeSoun ...

  4. 关于C#的微信开发的入门记录二

    在准备了空间和域名之后,现在来讲讲我们接下来的编码过程: 今天就先到这里了!没有服务器那些的请看我之前的博客:http://www.cnblogs.com/zhankui/p/4515905.html ...

  5. seajs实现JavaScript 的 模块开发及按模块加载

    seajs实现了JavaScript 的 模块开发及按模块加载.用来解决繁琐的js命名冲突,文件依赖等问题,其主要目的是令JavaScript开发模块化并可以轻松愉悦进行加载. 官方文档:http:/ ...

  6. 《ArcGIS Runtime SDK for Android开发笔记》——离在线一体化技术:离线矢量数据同步

    1.前言 上一篇文章中我们实现了离线要素的编辑操作,这一篇中主要介绍离在线一体化技术中最后一个环节离线数据的同步功能,通过对数据的上传,服务器端的版本化管理,实现数据生产管理的整个流程. 转载请注明出 ...

  7. 关于ArcGis for javascript的使用

    1.引用ArcGis for javascript核心类库的两种方式: 1.1.下载js包,解压缩放入项目中 1.1.1.下载核心类库压缩文件, 下载地址: https://developers.ar ...

  8. Linux 桌面玩家指南:19. 深入理解 JavaScript,及其开发调试工具

    特别说明:要在我的随笔后写评论的小伙伴们请注意了,我的博客开启了 MathJax 数学公式支持,MathJax 使用$标记数学公式的开始和结束.如果某条评论中出现了两个$,MathJax 会将两个$之 ...

  9. 《JavaScript设计模式与开发实践》整理

    最近在研读一本书<JavaScript设计模式与开发实践>,进阶用的. 一.高阶函数 高阶函数是指至少满足下列条件之一的函数. 1. 函数可以作为参数被传递. 2. 函数可以作为返回值输出 ...

随机推荐

  1. 怎么在一台电脑上同时启动多个tomcat

    怎么在一台电脑上同时启动多个tomcat? 应用场景: 一台电脑,需要同时部署多个tomcat,用于部署不同的系统 分布式系统,一个系统,同时需要开启多个tomcat,因为分布式系统可能会有多个war ...

  2. Xshell 命令后台执行

    但是这样没有在后台启动:因此sh那一行代码需要修改: 前边加上nohup 后边加上& nohup dotnet helloword.dll & 然后,进程启动之后,按任意键进入输入状态 ...

  3. Java之集合(六)PriorityQueue

    转载请注明源出处:http://www.cnblogs.com/lighten/p/7299233.html 1.前言 本章介绍队列中的PriorityQueue--优先队列,顾名思义,这是一个可以指 ...

  4. database lock

    USE masterEXEC sp_lock select * from sys.sysprocesses where blocked<>0 DBCC INPUTBUFFER(120) k ...

  5. 【转】JVM参数设置、分析

    原文地址:http://www.cnblogs.com/redcreen/archive/2011/05/04/2037057.html 不管是YGC还是Full GC,GC过程中都会对导致程序运行中 ...

  6. 快速获取 json对象的长度

    JSON对象的长度,也就是k-v的个数(这里不包含隐式属性 ). 通过   Object.keys(obj) 获取到  keys组成的数组, 再获取length. var obj = { a:1, b ...

  7. NodeJS require a global module/package in linux

    https://stackoverflow.com/questions/15636367/nodejs-require-a-global-module-package 1  export NODE_P ...

  8. c++ ‘nullptr’ 在此作用域中尚未声明

    编译加上如下选项:-std=c++11 g++ 1.cpp -o k -std=c++11

  9. php使用date()函数时,提示的警告

    转载:http://www.shangxueba.com/jingyan/121682.html 在用PHP5.3以上的PHP版本时,只要是涉及时间的会报一个: "PHP Warning: ...

  10. JVM内存限制和调整

    今天用java -jar执行一个jar文件提示内存不够,需要设置虚拟机的堆大小.以下是参考资料: 堆(Heap)和非堆(Non-heap)内存  按照官方的说法:“Java 虚拟机具有一个堆,堆是运行 ...