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

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

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. 使用seek()方法报错:“io.UnsupportedOperation: can't do nonzero cur-relative seeks”错误的原因

    在使用seek()函数时,有时候会报错为  “io.UnsupportedOperation: can't do nonzero cur-relative seeks”,代码如下: >>& ...

  2. Vue中使用children实现路由的嵌套

    Vue中使用children实现路由的嵌套 相关Html: <!DOCTYPE html> <html lang="en"> <head> &l ...

  3. ubuntu 下 重启 mongo 后 遇到蛋疼问题。

    以后,切忌 mongo 正常关闭后 ,再重启ubuntu. 否则后果这是很严重. 2014.8.6日 PM 6点. 网站莫名打不开了,全部是空白,又是老问题. 幸亏 及时发现,那就重启下. 蛋疼,重启 ...

  4. 关于Oracle中的字符的比较

    1.Oracle比较字符串是根据ASCII码来的,第一个字母的ASCII大小比较如果相等再比较下一个: 函数来说明: CREATE OR REPLACE FUNCTION MinOrMax(para1 ...

  5. golang prometheus包的使用

    prometheus包提供了用于实现监控代码的metric原型和用于注册metric的registry.子包(promhttp)允许通过HTTP来暴露注册的metric或将注册的metric推送到Pu ...

  6. Python2.x 中文乱码问题

    Python 文件中如果未指定编码,在执行过程会出现报错: #!/usr/bin/pythonprint "你好,世界"; 以上程序执行输出结果为: File "test ...

  7. expect安装和使用

    Expect是一个我们常在shell交互时常用到的工具,它主要由expect-send组成.Expect是等待输出内容中的特定字符.然后由send发送特定的相应.Expect的工作流程类似于:小明和小 ...

  8. Dock的生态开源技术(Etcd&Machine&Compose&Swarm&Mesos&Kubernetes)

    Etcd CoreOS公司开源的高可用分布式键值数据库Etcd,该项目已经被广泛应用到分布式系统的一致性实现和服务发现中,基于Go语言实现. Etcd就是专门为集群环境设计,可以很好地实现数据一致性, ...

  9. 堆排序详解以及java实现

    前言 临近毕业,开始找工作,近期一直在看算法导论(CLRS)同时各种刷题.希望以后有时间把所有学习心得和刷题心得记录下来. 堆 堆排序和合并排序一样,是一种时间复杂度为O(nlgn)的算法,同时和插入 ...

  10. Nginx(一)安装及启停

    目录 1 nginx安装 2 nginx启停 我发现很多博客排版杂乱,表达不清,读者看了往往云里雾里.我此前的博客也是如此,我自己很不满意.今起,每一篇博客都会用心写,此前的博客我也会尽力修改.至少要 ...