ArcGIS for JavaScript 关于路径开发的一些记录(一)
今年毕业,进入公司的第一个任务就是单独负责一个项目的地图模块,用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 关于路径开发的一些记录(一)的更多相关文章
- ArcGIS for JavaScript 关于路径开发的一些记录(三)
最近被一个bug困扰了两天~ 我新发布了一个NAserver(路径分析服务),但是放在之前的代码里面发现不能生成路径.经过我的调试发现并没有代码并没有报错,并且能够返回所生成路径的Graphic la ...
- ArcGIS for JavaScript 关于路径开发的一些记录(二)
又是高度集中开发路径模块的一天.真希望自己以后都可以如此的专注和高效(虽然知道很难一直都保持这样的状态,我会坚持的~哈哈哈) 言归正传,今天开发了途径点的功能和改进了些相关起点.终点的代码.先说一下我 ...
- seajs实现JavaScript 的 模块开发及按模块加载
seajs实现了JavaScript 的 模块开发及按模块加载.用来解决繁琐的js命名冲突,文件依赖等问题,其主要目的是令JavaScript开发模块化并可以轻松愉悦进行加载. 官方文档:http:/ ...
- 《ArcGIS Runtime SDK for Android开发笔记》——离在线一体化技术:离线矢量数据同步
1.前言 上一篇文章中我们实现了离线要素的编辑操作,这一篇中主要介绍离在线一体化技术中最后一个环节离线数据的同步功能,通过对数据的上传,服务器端的版本化管理,实现数据生产管理的整个流程. 转载请注明出 ...
- 关于ArcGis for javascript的使用
1.引用ArcGis for javascript核心类库的两种方式: 1.1.下载js包,解压缩放入项目中 1.1.1.下载核心类库压缩文件, 下载地址: https://developers.ar ...
- Linux 桌面玩家指南:19. 深入理解 JavaScript,及其开发调试工具
特别说明:要在我的随笔后写评论的小伙伴们请注意了,我的博客开启了 MathJax 数学公式支持,MathJax 使用$标记数学公式的开始和结束.如果某条评论中出现了两个$,MathJax 会将两个$之 ...
- 《JavaScript设计模式与开发实践》整理
最近在研读一本书<JavaScript设计模式与开发实践>,进阶用的. 一.高阶函数 高阶函数是指至少满足下列条件之一的函数. 1. 函数可以作为参数被传递. 2. 函数可以作为返回值输出 ...
- ArcGIS Server,rest路径输入要素json 格式描述
以下内容只测试了简单线, 在ArcGIS Server 的rest路径下可以对服务进行操作,如Query等,这些操作可以输入json 格式要素描述或运行得到即输出json格式要素描述. 如博客:htt ...
- Arcgis for Javascript API下类似于百度搜索A、B、C、D marker的实现方式
原文:Arcgis for Javascript API下类似于百度搜索A.B.C.D marker的实现方式 多说无益,首先贴两张图让大家看看具体的效果: 图1.百度地图搜索结果 图2.Arcgis ...
随机推荐
- iOS开发证书与配置文件的使用
前提 众所周知,开发iOS应用必须要有iOS证书(Certificates)和配置文件(Provisioning Profiles),那么问题来了: 1.什么是iOS证书,它是如何与app应用关联的? ...
- AngularJS入门之数据验证
AngularJS自带了对表单或控件的输入数据进行验证的功能,对于Html5的基础控件均有内建的验证器,以下列举了所有支持的验证类型: email max maxlength min minlengt ...
- diskpart 格式化u盘 制作u盘启动盘方法
1.cmd 2.diskpart 3.list disk 4.select disk [index] 注:[index] 磁盘索引号 5.clean 6.create partition prim ...
- github的本地配置和项目创建
之前完成了github的安装和账号的注册,接下来要进行项目的创建和本地代码仓库的建立 1.创建项目 2.填写项目相关信息 注意:在给项目起名时,尽量起一些有意义的名字,否则会被管理员删除.因为服务器上 ...
- 在CentOS上装Redis
Redis官网 $ wget http://download.redis.io/releases/redis-3.2.5.tar.gz $ tar xzf redis-.tar.gz $ cd red ...
- 《垃圾回收的算法与实现》——GC标记-压缩算法
基本算法 Mark-Compact与Mark-Sweep的第一阶段均为标记活跃对象,第二阶段则不同,压缩算法则是将活跃对象逻辑上移到一起. Lisp2算法 对象头中增加forwarding指针,其用法 ...
- golang---interface结合reflect的泛型应用
大致思路:序列化未知json放入一个interface{}中再通过反射将其内容解析出来 str1:=`{ , , , , , , "type_key": "testnow ...
- centos7防暴力破解五种方法
什么是暴力破解,简单来说就是对一个服务器进行无数次尝试登陆,并用不同的密码进行登陆直到可以登陆成功.暴力破解的基本步骤可以分为以下几步: 1. 找到对应的linux服务器 Ip地址 2.扫描端口 ...
- [笔记] Python 图片转字符画
一.介绍 用Python 代码完成图片转字符画 二.python 环境 Python 3.6.6 pillow 5.1.0 Python 图像处理库, 需要另外安装 三.原理 gray = 0.21 ...
- Oracle数据库之PL/SQL程序基础设计
一.PL/SQL块结构 前边我们已经介绍了PL/SQL块的结构,再来回顾一下: DECLARE /* * 声明部分——定义常量.变量.复杂数据类型.游标.用户自定义异常 */ BEGIN /* * 执 ...