今年毕业,进入公司的第一个任务就是单独负责一个项目的地图模块,用ArcGIS API for JavaScript来开发web地图。花了大概一个礼拜的时间学会了安装和搭建ArcGIS Server和ArcGIS DeskTop并且成功的发布了第一个本地的地图服务,之后花了大概1个月的时间来了解ArcGIS for JavaScript的官方API和Sample。由于官方的文档都是英文的,刚开始还真是很难看的懂(或许是当时太浮躁了)。但时间久了也就慢慢的进入状态了,每天都能够学到不同的知识点,这种从无到有的感觉还是蛮爽的。很快的,我发现网络上关于ArcGIS for JavaScript的中文资料和技术博客并不是特别的多,因此我买在当当上买了本相关的书(《Web GIS从基础到开发实践》里面有一些发开的实例和讲解,对于初学者有帮助的)。之后不久,当我投入到关于地图路径的开放后发现了许多网上和书上没有提及或是很难搜索到的问题。因此,我觉得我把我自己所解决掉的一些问题通过写博客的方式来记录下来,一是为了更好的巩固自己所学的技术知识方便之后的“温故”,二是为了给更多的初学者提供一些资料上的参考,为提高他们学习新技术的氛围出一份力。

言归正传,接下来先讲解以下两点:

1、发布路径网络分析服务;

这个步骤有网上有许多相关的讲解,非常的详细(可参考:http://www.cnblogs.com/potential/archive/2012/11/15/2771833.html)。

   2、仿百度的路径搜索操作;

这里我目前只解决了一个问题:右键可以设置起点可终点,无论是设置终点、起点的顺序路径都可以自动生成。效果图如下:

Js代码如下(注:途径点功能尚未完成,只是写了起点和终点的逻辑功能):

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, flag3 = false;
var originPrve, endPrve;
var graphic1, graphic2, graphic3; 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("load", createToolbarMenu); function createToolbarMenu () {
editToolbar = new Edit(map); createMapMenu();
} function createMapMenu() {
var ctMenuForMap = new Menu({
onOpen: function (box) {
currentLocation = getMapPointFromMenuPosition(box);
editToolbar.deactivate();
}
});
ctMenuForMap.addChild(new MenuItem({
label: "设为起点",
onClick: function (evt) {//起点只能有一个 if (flag1) {
// routeParams.stops.features.pop(
// map.graphics.remove(originPrve)
// );
if (routeParams.stops.features.length == 2) {
if (flag3) {
routeParams.stops.features.splice(1, 1)[0];
}else {
routeParams.stops.features.splice(0, 1)[0];
}
}else {
routeParams.stops.features.splice(0, 1)[0];
} // console.log(routeParams.stops.features[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;
flag1 = true;
flag3 = true; if (routeParams.stops.features.length == 2){
routeTask.solve(routeParams, showRoute, errorHandler);
}
}
})); ctMenuForMap.addChild(new MenuItem({
label: "设为途径点",
onClick: function (evt) {
var symbol = new SimpleMarkerSymbol({
"size": 12,
"angle": -40,
"style": "esriSMSCross",
"outline": {
"color": [0,255,0],
"width": 1,
"type": "esriSLS",
"style": "esriSLSSolid"
}
});
var graphic = new Graphic(geometryJsonUtils.fromJson(currentLocation.toJson()), symbol);
map.graphics.add(graphic);
}
})); ctMenuForMap.addChild(new MenuItem({
label: "设为终点",
onClick: function (evt) { if (flag2) {//终点只能有一个
// routeParams.stops.features.pop(
// map.graphics.remove(endPrve)
// );
// console.log(routeParams.stops.features.splice(0, 1)[0]);
// console.log(routeParams.stops.features.length);
if (routeParams.stops.features.length == 2) {
if (flag3) {
routeParams.stops.features.splice(0, 1)[0];
}else {
routeParams.stops.features.splice(1, 1)[0];
}
}else {
routeParams.stops.features.splice(0, 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)
);
endPrve = graphic;
flag2 = true;
flag3 = false;
if (routeParams.stops.features.length == 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"));
} })

其中routeParams.stops.features.splice(1, 1)[0];的意思是删除stops中第‘1’个点。

routeParams.stops.features.splice(0, 1)[0];的意思是删除stops中第‘0’个点。

flag1,flag2,flag3的设立是逻辑所需要,这个点就留给正在开发的朋友自己的思考咯。

其实在用splice之前我用的是routeParams.stops.features.pop();该方法也有删除stop点的功能,但其删除的只是上一个stop,这样的话就会出现显示效果出错(因为我们点击起点和终点的先后是随意的)。

以上是我不断翻阅API和调试所得出的结果,或许对于正在开始路径开发的朋友会有所帮助。(第一次写博客,表达方式还不够成熟,见谅)

HTML代码如下:

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>mapMenu</title>
<link rel="stylesheet" type="text/css" href="http://localhost:8080/gisapi/library/3.9/3.9/js/esri/css/esri.css">
<link rel="stylesheet" type="text/css" href="http://localhost:8080/gisapi/library/3.9/3.9/js/dojo/dijit/themes/claro/claro.css">
<script type="text/javascript" src="http://localhost:8080/gisapi/library/3.9/3.9/init.js"></script>
<script type="text/javascript" src="RoutetTask.js"></script>
</head>
<body class="claro">
<div id="mapDiv" style="width: 900px; height: 600px; border: 1px solid #000;"></div>
</body>
</html>

Stick to write blog!

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

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

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

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

    又是高度集中开发路径模块的一天.真希望自己以后都可以如此的专注和高效(虽然知道很难一直都保持这样的状态,我会坚持的~哈哈哈) 言归正传,今天开发了途径点的功能和改进了些相关起点.终点的代码.先说一下我 ...

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

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

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

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

  5. 关于ArcGis for javascript的使用

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

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

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

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

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

  8. ArcGIS Server,rest路径输入要素json 格式描述

    以下内容只测试了简单线, 在ArcGIS Server 的rest路径下可以对服务进行操作,如Query等,这些操作可以输入json 格式要素描述或运行得到即输出json格式要素描述. 如博客:htt ...

  9. Arcgis for Javascript API下类似于百度搜索A、B、C、D marker的实现方式

    原文:Arcgis for Javascript API下类似于百度搜索A.B.C.D marker的实现方式 多说无益,首先贴两张图让大家看看具体的效果: 图1.百度地图搜索结果 图2.Arcgis ...

随机推荐

  1. 2019年北航OO第一次博客总结

    一.基于度量对程序结构的分析 1. 第一次作业 1.1 基于类的分析的度量 首先,基于类的属性个数,方法个数,每个方法的规模,每个方法的控制分支数目,类总代码规模等特征对本次作业的结构进行分析. 1. ...

  2. 为什么程序员老在改 Bug,就不能一次改好吗?

    程序员的日常三件事:写Bug.改Bug.背锅.连程序员都自我调侃道,为什么每天都在加班?因为我的眼里常含Bug. 但是真的有这么多Bug要改吗?就不能一次改完吗? 程序员听这问题后要拍键盘了,还!真! ...

  3. Swift的Guard语句

    与if语句相同的是,guard也是基于一个表达式的布尔值去判断一段代码是否该被执行.与if语句不同的是,guard只有在条件不满足的时候才会执行这段代码.你可以把guard近似的看做是Assert,但 ...

  4. 【转】使用SQL Server 2012的FileTable轻松管理文件

    一 .FileStream和FileTable介绍 我们经常需要把结构化数据(int.Char等)和非结构化数据(如Varbinary(max))一起存储,那我们在怎么存储的呢? 1. 在SQL Se ...

  5. 【链表】Linked List Cycle

    题目: Given a linked list, determine if it has a cycle in it. 思路: 对于判断链表是否有环,方法很简单,用两个指针,一开始都指向头结点,一个是 ...

  6. ES6-Iterator & for...of循环

    依赖文件地址 :https://github.com/chanceLe/ES6-Basic-Syntax/tree/master/js <!DOCTYPE html> <html&g ...

  7. LDAP落地实战(四):Jenkins集成OpenLDAP认证

    前几篇分文章分别介绍了OpenLDAP的部署管理和维护以及svn.git的接入,今天我们再下一城接入jenkins. 前情提要:LDAP系列文章 LDAP落地实战(一):OpenLDAP部署及管理维护 ...

  8. springcloud-03-服务注册

    新建一个 provider-user 和consumer-movie, user为服务提供者, movie为服务的消费真, 没有什么难的, 直接上代码 microserver-provider-use ...

  9. mongodb 数据库备份脚本

    写了小shell bash, 用于给mongodb数据进行备份 #!/bin/bash #backup MongoDB #文件目录 #backup MongoDB #!/bin/bash #backu ...

  10. WPF中List的Add()与Insert()方法的区别

    先来看看定义: // Summary: // Adds an object to the end of the System.Collections.Generic.List<T>. // ...