想知道可视域分析是什么,就得知道可视域是什么

我们站在某个地方,原地不动转一圈能看到的所有事物就叫可视域。当然平地就没什么所谓的可视域。

如果在山区呢?可视范围就会被山体挡住了。这个分析对军事上有十分重要的意义。

在本例中,可视域是以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,添加到图形图层中(显示点击点);

之后,根据可视域分析服务所需的参数

"Input_Observation_Point"和"Viewshed_Distance",分别为FeatureSet类和LinearUnit类的数据
实例化所需的参数featureSet对象和vsDistance对象,组成params这个Object对象;
执行gp.execute(params)。
最后,execute(params)接着一个异步操作then(drawResultData),绘制处理结果。
我们已经知道了,这里返回的Object对象中results属性为ParameterValue[]类型。我们只需从中获取需要的可视域数据(FeatureSet)即可。

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类】的更多相关文章

  1. ArcGIS API for JavaScript 4.2学习笔记[29] 热点(密度)分析——以报警频率为例【使用Geoprocessor类】

    这个就颇有插值分析的样子了.也可以说是密度分析.做出来就是一个热力地图的样子. 比如,人口密度,降雨分布等.这都可以由这个例子做出来类似的. 由于上一篇已经介绍过Geoprocessor类和Param ...

  2. ArcGIS API for JavaScript 4.2学习笔记[0] AJS4.2概述、新特性、未来产品线计划与AJS笔记目录

    放着好好的成熟的AJS 3.19不学,为什么要去碰乳臭未干的AJS 4.2? 4.2全线基础学习请点击[直达] 4.3及更高版本的补充学习请关注我的博客. ArcGIS API for JavaScr ...

  3. ArcGIS API for JavaScript 4.2学习笔记[1] 显示地图

    ArcGIS API for JavaScript 4.2直接从官网的Sample中学习,API Reference也是从官网翻译理解过来,鉴于网上截稿前还没有人发布过4.2的学习笔记,我就试试吧. ...

  4. ArcGIS API for JavaScript 4.2学习笔记[5] 官方API大章节概述与内容转译

    内容如上,截图自ESRI官网,连接:ArcGIS API for JavaScript 4.2 [Get Started] 类似于绪论一样的东西,抽取了最需要关注的几个例子.如:加载Map和View, ...

  5. ArcGIS API for JavaScript 4.2学习笔记[25] 官方第八章Analysis(空间查询)概览与解释

    开森,最关注的空间分析章节终于到了,在空间查询那节逻辑性的代码简直要命(呵呵,空间分析的代码也要命...). 上目录截图: [Geodesic buffers(GeometryEngine)] 使用G ...

  6. ArcGIS API for JavaScript 4.2学习笔记[21] 对3D场景上的3D要素进行点击查询【Query类学习】

    有人问我怎么这个系列没有写自己做的东西呢? 大哥大姐,这是"学习笔记"啊!当然主要以解读和笔记为主咯. 也有人找我要实例代码(不是示例),我表示AJS尚未成熟,现在数据编辑功能才简 ...

  7. ArcGIS API for JavaScript 4.2学习笔记[27] 网络分析之最短路径分析【RouteTask类】

    要说网页端最经典的GIS应用,非网络分析莫属了. 什么?你没用过?百度高德谷歌地图的路线分析就是活生生的例子啊!只不过它们是根据大实际背景优化了结果显示而已. 这个例子使用RouteTask进行网络分 ...

  8. ArcGIS api for javascript——地理处理任务-计算一个可视域

    描述 本例展示了使用一个地理处理计算一个可视域(viewshed) 单击地图上的任意点查看该点5英里内能看见的所有区域.这个模型需要几秒钟来运行并反馈结果. 可视域计算是通过ArcGIS Server ...

  9. ArcGIS API for JavaScript 4.2学习笔记[16] 弹窗自定义功能按钮及为要素自定义按钮(第五章完结)

    这节对Popups这一章的最后两个例子进行介绍和解析. 第一个[Popup Actions]介绍了弹窗中如何自定义工具按钮(名为actions),以PopupTemplate+FeatureLayer ...

随机推荐

  1. Meteor的初步了解

    最近入职到新一家公司,技术总监给我介绍了一个新技术---Meteor,这是我之前没有接触过的一项技术,我查阅了相关资料,原来这是一项基于Node js的纯Javascript技术,然后给了我们一个项目 ...

  2. States字段的使用规范

    背景 为了统一数据库表的状态字段,统一数据库表设计,简化字段在程序开发中的使用方式. 解决方式 States对应位域枚举StatesFlags. /// <summary> /// 数据状 ...

  3. python requests抓取NBA球员数据,pandas进行数据分析,echarts进行可视化 (前言)

    python requests抓取NBA球员数据,pandas进行数据分析,echarts进行可视化 (前言) 感觉要总结总结了,希望这次能写个系列文章分享分享心得,和大神们交流交流,提升提升. 因为 ...

  4. 软件测试管理QC

    一.QC简介 1)是HP公司的产品,是B/S结构的产品 2)在QC服务器中,打开IE浏览器,在地址栏中输入QC服务器的网址或者IP地址. 查看虚拟机的IP地址: 本地连接-属性-TCP/IP协议(重点 ...

  5. Android 异步消息处理机制前篇(二):深入理解Message消息池

    版权声明:本文出自汪磊的博客,转载请务必注明出处. 上一篇中共同探讨了ThreadLocal,这篇我们一起看下常提到的Message消息池到底是怎么回事,废话少说吧,进入正题. 对于稍有经验的开发人员 ...

  6. MySQL修改表

    一.给表mytablename添加新字段newcolumn alter table mytablename add newcolumn varchar(50) COMMENT '新字段备注信息' 二. ...

  7. poj 1064 Cable master 判断一个解是否可行 浮点数二分

    poj 1064 Cable master 判断一个解是否可行 浮点数二分 题目链接: http://poj.org/problem?id=1064 思路: 二分答案,floor函数防止四舍五入 代码 ...

  8. 学习用java基于webMagic+selenium+phantomjs实现爬虫Demo爬取淘宝搜索页面

    由于业务需要,老大要我研究一下爬虫. 团队的技术栈以java为主,并且我的主语言是Java,研究时间不到一周.基于以上原因固放弃python,选择java为语言来进行开发.等之后有时间再尝试pytho ...

  9. Expected MultipartHttpServletRequest: is a MultipartResolver configured解决方案

    异常信息: java.lang.IllegalArgumentException: Expected MultipartHttpServletRequest: is a MultipartResolv ...

  10. windows MySQL 5.6.38 安装步骤

    文章转载于此出 mysql5.6.38 1067错误 可能是自己添加 了my.ini文件 其实不需要添加这个文件,直接在mydefault.ini中修改就行了 mysql 5.6 zip解压安装配置( ...