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

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

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

ctMenuForMap.addChild(menuItem = new MenuItem({
label: "设为途径点",
onClick: function (evt) {
var num = 0;
flag ++; //falg为全局变量,目的是控制途径点的个数
var symbol; clearRoutes();
symbol = new PictureMarkerSymbol({
"width": 45,
"height": 69,
"type": "esriPMS"
});
switch (flag) {
case 1:
symbol.url = "pathwayPoint1.png";
break;
case 2:
symbol.url = "pathwayPoint2.png";
break;
case 3:
symbol.url = "pathwayPoint3.png";
break;
case 4:
symbol.url = "pathwayPoint4.png";
break;
case 5:
symbol.url = "pathwayPoint5.png";
menuItem.disabled = true;
break;
}
var graphic = new Graphic(geometryJsonUtils.fromJson(currentLocation.toJson()), symbol);
routeParams.stops.features.push(
map.graphics.add(graphic)
);
editToolbar.activate(Edit.MOVE, graphic);
pathwayPrve = graphic; for (var i = routeParams.stops.features.length-1; i>=0; i--) {
if (routeParams.stops.features[i].symbol.url === "originPoint.png") {
num++;
}
if (routeParams.stops.features[i].symbol.url === "endPoint.png") {
num ++;
}
} if (num == 2){
routeTask.solve(routeParams, showRoute, errorHandler);
} }
}));
flag为全局变量,用flag的大小来控制途径点的个数,由于每个途径点的图片是不一样的,因此才用了switch语句。

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

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


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

editToolbar.activate(Edit.MOVE, graphic);

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


我贴出所有代码,里面有相关的注释。
var editToolbar;
var currentLocation
require(["esri/map", "esri/geometry/Point", "esri/layers/ArcGISDynamicMapServiceLayer", "esri/toolbars/draw", "esri/toolbars/edit",
"esri/symbols/SimpleMarkerSymbol","esri/symbols/SimpleLineSymbol", "esri/symbols/SimpleFillSymbol",
"esri/symbols/PictureMarkerSymbol", "esri/graphic", "esri/geometry/jsonUtils", "esri/tasks/RouteTask", "esri/tasks/FeatureSet",
"esri/tasks/RouteParameters", "esri/Color", "dojo/parser", "dijit/Menu",
"dijit/MenuItem", "dijit/MenuSeparator", "dijit/form/Button",
"dijit/layout/BorderContainer", "dijit/layout/ContentPane", "dojo/domReady!"],
function (
Map, Point, ArcGISDynamicMapServiceLayer, Draw, Edit, SimpleMarkerSymbol, SimpleLineSymbol,
SimpleFillSymbol, PictureMarkerSymbol, Graphic, geometryJsonUtils, RouteTask, FeatureSet, RouteParameters, Color, parser, Menu,
MenuItem, MenuSeparator
) {
var routes = [];
var flag1, flag2 = false;
var originPrve, pathwayPrve, endPrve;
var graphic1, graphic2, graphic3;
var flag = 0, x = 0, y = 0;
var editToolbar; parser.parse(); var map = new Map("mapDiv");
var url = "http://localhost:6080/arcgis/rest/services/china1/MapServer";
var agoLayer = new ArcGISDynamicMapServiceLayer(url);
map.addLayer(agoLayer); routeTask = new RouteTask("http://localhost:6080/arcgis/rest/services/road/NAServer/Route");
routeParams = new RouteParameters();
routeParams.stops = new FeatureSet(); routeSymbol = new SimpleLineSymbol().setColor(new Color([0, 0, 255, 0.5])).setWidth(5); map.on("click", pointMove);
map.on("load", createToolbarMenu); //使各个点移动结束后触发路径的再建立
function pointMove (evt) {
if (originPrve) { editToolbar.on("graphic-move-stop", function (originPrve) {
var num = 0;
clearRoutes(); for (var i = routeParams.stops.features.length-1; i>=0; i--) {
if (routeParams.stops.features[i].symbol.url === "originPoint.png") {
num++;
}
if (routeParams.stops.features[i].symbol.url === "endPoint.png") {
num ++;
}
} if (num == 2){
routeTask.solve(routeParams, showRoute, errorHandler);
}
});
} if (pathwayPrve) {
editToolbar.on("graphic-move-stop", function (pathwayPrve) {
var num = 0;
clearRoutes(); for (var i = routeParams.stops.features.length-1; i>=0; i--) {
if (routeParams.stops.features[i].symbol.url === "originPoint.png") {
num++;
}
if (routeParams.stops.features[i].symbol.url === "endPoint.png") {
num ++;
}
} if (num == 2){
routeTask.solve(routeParams, showRoute, errorHandler);
}
});
} if (endPrve) {
editToolbar.on("graphic-move-stop", function (endPrve) {
var num = 0;
clearRoutes(); for (var i = routeParams.stops.features.length-1; i>=0; i--) {
if (routeParams.stops.features[i].symbol.url === "originPoint.png") {
num++;
}
if (routeParams.stops.features[i].symbol.url === "endPoint.png") {
num ++;
}
} if (num == 2){
routeTask.solve(routeParams, showRoute, errorHandler);
}
});
}
} function createToolbarMenu () {
editToolbar = new Edit(map); createMapMenu();
} function createMapMenu() {
var ctMenuForMap = new Menu({
onOpen: function (box) {
currentLocation = getMapPointFromMenuPosition(box);
}
}); ctMenuForMap.addChild(new MenuItem({
label: "设为起点",
onClick: function (evt) {//起点只 能有一个
var num = 0; if (flag1) {
for (var i = routeParams.stops.features.length-1; i>=0; i--) {
if (routeParams.stops.features[i].symbol.url === "originPoint.png") {
routeParams.stops.features.splice(i, 1)[0];
}
} map.graphics.remove(originPrve)
clearRoutes();
}
var symbol = new PictureMarkerSymbol({
"url": "originPoint.png",
"height": 63,
"width": 45,
"type": "esriPMS"
});
var graphic = new Graphic(geometryJsonUtils.fromJson(currentLocation.toJson()), symbol);
routeParams.stops.features.push(
map.graphics.add(graphic)
); originPrve = graphic;
editToolbar.activate(Edit.MOVE, originPrve); flag1 = true; //只有在起点和终点都设立之后才可以生成路径
for (var i = routeParams.stops.features.length-1; i>=0; i--) {
if (routeParams.stops.features[i].symbol.url === "originPoint.png") {
num++;
}
if (routeParams.stops.features[i].symbol.url === "endPoint.png") {
num ++;
}
} if (num == 2){
routeTask.solve(routeParams, showRoute, errorHandler);
}
}
})); ctMenuForMap.addChild(menuItem = new MenuItem({
label: "设为途径点",
onClick: function (evt) {
var num = 0;
flag ++; //falg为全局变量,目的是控制途径点的个数
var symbol; clearRoutes();
symbol = new PictureMarkerSymbol({
"width": 45,
"height": 69,
"type": "esriPMS"
});
switch (flag) {
case 1:
symbol.url = "pathwayPoint1.png";
break;
case 2:
symbol.url = "pathwayPoint2.png";
break;
case 3:
symbol.url = "pathwayPoint3.png";
break;
case 4:
symbol.url = "pathwayPoint4.png";
break;
case 5:
symbol.url = "pathwayPoint5.png";
menuItem.disabled = true;
break;
}
var graphic = new Graphic(geometryJsonUtils.fromJson(currentLocation.toJson()), symbol);
routeParams.stops.features.push(
map.graphics.add(graphic)
);
editToolbar.activate(Edit.MOVE, graphic);
pathwayPrve = graphic; for (var i = routeParams.stops.features.length-1; i>=0; i--) {
if (routeParams.stops.features[i].symbol.url === "originPoint.png") {
num++;
}
if (routeParams.stops.features[i].symbol.url === "endPoint.png") {
num ++;
}
} if (num == 2){
routeTask.solve(routeParams, showRoute, errorHandler);
} }
})); ctMenuForMap.addChild(new MenuItem({
label: "设为终点",
onClick: function (evt) {
var num = 0; if (flag2) {//终点只能有一个
for (var i = routeParams.stops.features.length-1; i>=0; i--) {
if (routeParams.stops.features[i].symbol.url === "endPoint.png") {
routeParams.stops.features.splice(i, 1)[0];
}
}
map.graphics.remove(endPrve)
clearRoutes();
} var symbol = new PictureMarkerSymbol({
"url": "endPoint.png",
"width": 45,
"height": 61,
"type": "esriPMS" });
var graphic = new Graphic(geometryJsonUtils.fromJson(currentLocation.toJson()), symbol);
routeParams.stops.features.push(
map.graphics.add(graphic)
);
editToolbar.activate(Edit.MOVE, graphic); endPrve = graphic;
flag2 = true; for (var i = routeParams.stops.features.length-1; i>=0; i--) {
if (routeParams.stops.features[i].symbol.url === "originPoint.png") {
num++;
}
if (routeParams.stops.features[i].symbol.url === "endPoint.png") {
num ++;
}
} if (num == 2){
routeTask.solve(routeParams, showRoute, errorHandler);
}
}
})); ctMenuForMap.startup();
ctMenuForMap.bindDomNode(map.container);
} function getMapPointFromMenuPosition (box) {
var x = box.x, y = box.y;
var screenPoint = new Point(x - map.position.x, y - map.position.y);
return map.toMap(screenPoint);
} function showRoute (result) { var routeResults = result.routeResults;
routes.push(
map.graphics.add(routeResults[0].route.setSymbol(routeSymbol))
);
var msgs = ["服务器消息:"];
for (var i = 0; i < result.messages.length; i++) {
msgs.push(result.messages[i].type + " : " + result.messages[i].description);
}
if (msgs.length > 1) {
alert(msgs.join("\n - "));
}
} function clearRoutes() {
for (var i = routes.length - 1; i >= 0; i--) {
map.graphics.remove(routes.splice(i, 1)[0]);
}
routes = [];
} function errorHandler(err) {
alert("发生错误\n" + err.message + "\n" + err.details.join("\n"));
} })

未解决的问题:

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. YYYY-mm-dd HH:MM:SS 时间格式

    YYYY-mm-dd HH:MM:SS部分解释 d               月中的某一天.一位数的日期没有前导零.    dd             月中的某一天.一位数的日期有一个前导零.   ...

  2. Window History对象

    History 对象属性 length 返回浏览器历史列表中的 URL 数量. History 对象方法 back() 加载 history 列表中的前一个 URL. window.history.b ...

  3. Python生成gexf文件并导入gephi做网络图分析

    Gephi是一款优秀的复杂网络分析软件,支持导入多种格式的文件.gexf格式是Gephi 推荐的格式,基于 XML.本文是一个用python写的简单Demo,示例如何生成一个典型的gexf格式文件.代 ...

  4. spring websocket 和socketjs实现单聊群聊,广播的消息推送详解

    spring websocket 和socketjs实现单聊群聊,广播的消息推送详解 WebSocket简单介绍 随着互联网的发展,传统的HTTP协议已经很难满足Web应用日益复杂的需求了.近年来,随 ...

  5. rack简介

    什么是rack rack是对ruby的Net::HTTP进行封装了的包,使用rack能够方便的新建一个简单的web应用. what is rack Rack describes itself as f ...

  6. php如何判断字符串是否是字母和数字的组合

    转载自百度 /其实判断是否是字母和数字或字母数字的组合还可以用PHP ctype_alnum函数 if(!ctype_alnum($vipurl)){ echo '只能是字母或数字的组合';exit; ...

  7. implements和extends的区别

    extends可以理解为全盘继承了父类的功能 implements可以理解为为这个类附加一些额外的功能 举个例子,Animal是一个父类,cat,dog,bird,insect都extends了Ani ...

  8. android的几种“通知”方式简单实现(Notification&NotificationManager)

    关于通知Notification相信大家都不陌生了,平时上QQ的时候有消息来了或者有收到了短信,手机顶部就会显示有新消息什么的,就类似这种.今天就稍微记录下几种Notification的用法.3.0以 ...

  9. Java的try-catch-finally

    Javac语法糖之TryCatchFinally 如下引用文章:https://help.semmle.com/wiki/display/JAVA/Finally+block+may+not+comp ...

  10. libevent安装总结

    1.先用:ls -al /usr/lib | grep libevent 查看是否已安装:如果已安装且版本低于1.3,则先通过:rpm -e libevent —nodeps进行卸载. 2.下载lib ...