ArcGIS API for JavaScript 4.2学习笔记[28] 可视域分析【使用Geoprocessor类】
想知道可视域分析是什么,就得知道可视域是什么
我们站在某个地方,原地不动转一圈能看到的所有事物就叫可视域。当然平地就没什么所谓的可视域。
如果在山区呢?可视范围就会被山体挡住了。这个分析对军事上有十分重要的意义。
在本例中,可视域是以GraphicLayer中的Graphics[]形式存在的。
这个例子用到了Geoprocessor这个类。这个类的对象是如何判别我要进行可视域分析呢?且听我慢慢道来。
看看结果
点击山谷的位置,出现一个红点,稍等10s左右,出现橙色的面块,橙色的面块就是红点位置所能看到的范围了(比起桌面的可视域分析还是弱了点),比起桌面来说可谓是所见即所得。
这个在AJS 3.x是做不到的,因为这里有强大的3D分析功能嘛。
Geoprocessor类
这个类很强大,和之前的四个Task不太一样,它接受的处理参数不再是一个类,而是一个Object数组。也就是说,是什么样子的处理,就输入什么样的参数。
官方举例如下:
假设有Input_Points和Distance两个需要输入的参数,那么
就在Geoprocessor类的execute()方法中传入这么一个Object对象:
- {
- Input_Points: <FeatureSet>,
- Distance: <Number>
- }
这就是GP类的强大之处。如果需要进行异步操作,则使用submitJob()代替execute()方法,节约网页等待时间。
Geoprocessor类的execute()方法返回一个Object对象,其包含有:
两个属性,我们关心的是results属性,其为ParameterValue[]类型。下面我就要说说ParameterValue这个类,它和前面某某Result类十分相似。
ParameterValue类
它是execute()或submitJob()的返回值中的results属性类型。
它有三个属性:dataType(String类型)、declareClass和value(Object类型)
什么意思呢?GP处理的结果当然是因输入的参数决定的,所以在本例中,dataType就规定成了"record-set"或"feature-record-set-layer", 即value属性就被装箱成了FeatureSet类型。
dataType的值就确定了value的值类型,见这个表格:点我
有了这些预备知识,讲解这个例子和下一个例子就不难了。
给出引用
- require([
- "esri/Map",
- "esri/views/SceneView",
- "esri/layers/GraphicsLayer","esri/Graphic",
- "esri/geometry/Point",
- "esri/symbols/SimpleMarkerSymbol","esri/symbols/SimpleFillSymbol",
- "esri/tasks/Geoprocessor",
- "esri/tasks/support/LinearUnit","esri/tasks/support/FeatureSet",
- "dojo/domReady!"
- ],
- function(Map, SceneView, GraphicsLayer, Graphic, Point,
- SimpleMarkerSymbol, SimpleFillSymbol, Geoprocessor,
- LinearUnit, FeatureSet) {
- ...
- }
- );
嗯,对Geoprocessor的引用。
函数框架
- function(...){
- var gpUrl ="https://sampleserver6.arcgisonline.com/arcgis/rest/services/Elevation/ESRI_Elevation_World/GPServer/Viewshed";
- var map = new Map({...});
- var view = new SceneView({...});
- var graphicsLayer = new GraphicsLayer({...)};
- map.add(graphicsLayer);
- var markerSymbol = new SimpleMarkerSymbol({...});
- var fillSymbol = new SimpleFillSymbol({...});
- var gp = new Geoprocessor(gpUrl);
- gp.outSpatialReference = {...};
- //重点
- view.on("click", computeViewshed);
- function computeViewshed(event){...}
- function drawResultData(result){...}
- }
我想到这,就不必解释很多了,我们直接关注数据处理的重点代码:view的click事件和两个处理函数computeViewshed()和drawResultData()。
gp这个Geoprocessor类的实例化在上方已经说明了,就不说那么详细了。
computeViewshed(event)方法
这个方法有点长,但是每一行的意义都很明确。它做的就是获取点击点,生成一个红色的点符号,然后获取gp.execute()的输入参数,执行execute()方法。
- function computeViewshed(event) {
- graphicsLayer.removeAll();
- var point = new Point({
- longitude: event.mapPoint.longitude,
- latitude: event.mapPoint.latitude
- });
- var inputGraphic = new Graphic({
- geometry: point,
- symbol: markerSymbol
- });
- graphicsLayer.add(inputGraphic);
- var inputGraphicContainer = [];
- inputGraphicContainer.push(inputGraphic);
- var featureSet = new FeatureSet();
- featureSet.features = inputGraphicContainer;
- var vsDistance = new LinearUnit();
- vsDistance.distance = 5;
- vsDistance.units = "miles";
- var params = {
- "Input_Observation_Point": featureSet,
- "Viewshed_Distance": vsDistance
- };
- gp.execute(params).then(drawResultData);
- }
computeViewshed()方法
首先,图形图层清零,获取点击点,命名为point(Point类的实例);
然后,根据这个point形成一个Graphic对象,名为inputGraphic,添加到图形图层中(显示点击点);
之后,根据可视域分析服务所需的参数
drawResultData()方法
- function drawResultData(result) {
- var resultFeatures = result.results[0].value.features;
- var viewshedGraphics = resultFeatures.map(function(feature) {
- feature.symbol = fillSymbol;
- return feature;
- });
- graphicsLayer.addMany(viewshedGraphics);
- view.goTo({
- target: viewshedGraphics,
- tilt: 0
- });
- }
result即为execute()返回的Object对象,获取results[0]的value(即FeatureSet)中的features(类型为Graphic[]),命名为resultFeatures。
对这个Graphic[]变量进行遍历(map()方法),对每个Graphic设置填充符号,返回一个新的Graphic[]变量viewshedGraphics;
然后把这个Graphic[]变量添加到图形图层上;
最后让视图跳转到这个图形图层。
总结一下
通过单击,获取这个点位信息——通过这个点生成需要的可视域分析所需的参数集(Object类型),传入gp.execute()——对返回的Object对象中的可视域进行处理、显示。
完美!
ArcGIS API for JavaScript 4.2学习笔记[28] 可视域分析【使用Geoprocessor类】的更多相关文章
- ArcGIS API for JavaScript 4.2学习笔记[29] 热点(密度)分析——以报警频率为例【使用Geoprocessor类】
这个就颇有插值分析的样子了.也可以说是密度分析.做出来就是一个热力地图的样子. 比如,人口密度,降雨分布等.这都可以由这个例子做出来类似的. 由于上一篇已经介绍过Geoprocessor类和Param ...
- ArcGIS API for JavaScript 4.2学习笔记[0] AJS4.2概述、新特性、未来产品线计划与AJS笔记目录
放着好好的成熟的AJS 3.19不学,为什么要去碰乳臭未干的AJS 4.2? 4.2全线基础学习请点击[直达] 4.3及更高版本的补充学习请关注我的博客. ArcGIS API for JavaScr ...
- ArcGIS API for JavaScript 4.2学习笔记[1] 显示地图
ArcGIS API for JavaScript 4.2直接从官网的Sample中学习,API Reference也是从官网翻译理解过来,鉴于网上截稿前还没有人发布过4.2的学习笔记,我就试试吧. ...
- ArcGIS API for JavaScript 4.2学习笔记[5] 官方API大章节概述与内容转译
内容如上,截图自ESRI官网,连接:ArcGIS API for JavaScript 4.2 [Get Started] 类似于绪论一样的东西,抽取了最需要关注的几个例子.如:加载Map和View, ...
- ArcGIS API for JavaScript 4.2学习笔记[25] 官方第八章Analysis(空间查询)概览与解释
开森,最关注的空间分析章节终于到了,在空间查询那节逻辑性的代码简直要命(呵呵,空间分析的代码也要命...). 上目录截图: [Geodesic buffers(GeometryEngine)] 使用G ...
- ArcGIS API for JavaScript 4.2学习笔记[21] 对3D场景上的3D要素进行点击查询【Query类学习】
有人问我怎么这个系列没有写自己做的东西呢? 大哥大姐,这是"学习笔记"啊!当然主要以解读和笔记为主咯. 也有人找我要实例代码(不是示例),我表示AJS尚未成熟,现在数据编辑功能才简 ...
- ArcGIS API for JavaScript 4.2学习笔记[27] 网络分析之最短路径分析【RouteTask类】
要说网页端最经典的GIS应用,非网络分析莫属了. 什么?你没用过?百度高德谷歌地图的路线分析就是活生生的例子啊!只不过它们是根据大实际背景优化了结果显示而已. 这个例子使用RouteTask进行网络分 ...
- ArcGIS api for javascript——地理处理任务-计算一个可视域
描述 本例展示了使用一个地理处理计算一个可视域(viewshed) 单击地图上的任意点查看该点5英里内能看见的所有区域.这个模型需要几秒钟来运行并反馈结果. 可视域计算是通过ArcGIS Server ...
- ArcGIS API for JavaScript 4.2学习笔记[16] 弹窗自定义功能按钮及为要素自定义按钮(第五章完结)
这节对Popups这一章的最后两个例子进行介绍和解析. 第一个[Popup Actions]介绍了弹窗中如何自定义工具按钮(名为actions),以PopupTemplate+FeatureLayer ...
随机推荐
- python实战===如何优雅的打飞机
这是一个打飞机的游戏,结构如下: 其中images中包含的素材为 命名为alien.png 命名为ship.png 游戏效果运行是这样的: 敌军,也就是体型稍微大点的,在上方左右移动,并且有规律 ...
- python学习笔记 list
1.list中的任一元素可以是任一类型.可以是混合的,如,前两个字符串后面的是数字.都是可以的. 2.可以用-1表示最后一个元素. 3.注意不要越界. 4.len(mates) 用来计算list的大小 ...
- (ajax)——jquery用法
例子:/* ajax获得状态 */ 点击事件 $("#findBycname").click(function(){ var company = ...
- Azure IoT Edge on Windows 10 IoT Core
在今年的Build大会上,微软推出了Azure IoT Edge的第一个版本(https://github.com/Azure/iot-edge ).该版本的主要特点就是将计算能力由Azure端推送至 ...
- mysql常用的操作
数据库的常用操作:create database db1; #创建数据库show databases; #查看所有数据库show create database db1;#查看创建的指定数据库alte ...
- appium+Linux环境安装配置
背景:想要在Jenkins上跑appium的自动化测试,所以想要在Jenkins服务器(Linux远程)上安装appium服务,故而研究了一下appium+Linux下安装.虽然有无数的前辈踩过坑 ...
- 数据库文件*.sdf文件定时备份,但是大小的增量在不断增长的问题排查
在某项目上,使用SQL Server数据库,现场反馈每天定时备份数据库文件,每天的数据量是400多个申请单的量.之前每天增长量是50M,但是后来两天增长量是80M,每天的数据量差不多. 到底从什么地方 ...
- 阿里云轻量应用服务器Lamp部署php工程踩过的坑
第一次写博客,也不知道写什么,但是想坚持写博客来提升自己,不喜勿喷. 切回正题,使用阿里云的轻量应用服务器Lamp其实非常方便,价格也很便宜,一键购买需要的环境都帮你搭配好了,剩下的就是自己修改一下数 ...
- opensslBIO系列之2---BIO结构和BIO相关文件介绍
BIO结构和BIO相关文件介绍 (作者:DragonKing Mail:wzhah@263.net 公布于:http://gdwzh.126.com openssl专业论坛) ...
- B. Simple Game( Codeforces Round #316 (Div. 2) 简单题)
B. Simple Game time limit per test 1 second memory limit per test 256 megabytes input standard input ...