这个就颇有插值分析的样子了。也可以说是密度分析。做出来就是一个热力地图的样子。

比如,人口密度,降雨分布等。这都可以由这个例子做出来类似的。

由于上一篇已经介绍过Geoprocessor类和ParameterValue类了,所以这节就略去这些内容。想知道的同学可以点击这里,看上一篇相关内容。

与上一节不同的是,使用的不是execute()方法了,而是submitJob()方法,这是一个异步操作方法。尽管他们返回的类型是类似的。

官方给的解释很简洁明了,有了前几个的基础几乎可以瞬间抓住重点,如submitJob的参数的获取,对热力图结果如何获取和处理等,自行查询API即可。

我这篇博客则是对这个例子进行重点全解析。如果是老鸟,请直接看:How it works


看看结果

给定一个时间范围,就能查询该地区报警的频率。这里使用了图例这个widget,对其有读写操作。图中默认的时间按下红色按钮后,就可以看到如图的结果(3-5s)。

最中央红色区域是报警最频繁的区域,点状符号代表报警的时间(星期几)。

据说这个例子有点长,加油。

给出引用

require([
"esri/Map",
"esri/views/MapView",
"esri/tasks/Geoprocessor",
"esri/widgets/Legend",
"esri/widgets/Spinner",
"esri/layers/support/ImageParameters", "dijit/form/DateTextBox",
"dojo/dom",
"dojo/dom-construct",
"dojo/on",
"dojo/date/locale",
"dojo/parser",
"dijit/registry",
"dojo/domReady!"
],
function(Map, MapView, Geoprocessor, Legend, Spinner, ImageParameters,
DateTextBox, dom, domConstruct, on, locale, parser, registry) {
...
}
);

dijit这个东西是第三方控件(貌似),看DateTextBox就知道了。AJS4.x除了dojo也有用dijit(不明白为啥名字那么奇怪)

三个新鲜的玩意儿:Legend、Spinner和ImageParameters。

函数骨架

function(...){
parser.parse();//不知道干啥用的
on(dom.byId("hotspotButton"), "click", findHotspot); var map = new Map({...});
var view = new MapView({...}); //实例化GP
var gpUrl = ".../GPServer/XXX";//省略,但是还是GPServer
var gp = new Geoprocessor(gpUrl);
gp.outSpatialReference = {...} //图例
var legend = new Legend({...});
spinner = new Spinner({...});
domConstruct.place(spinner.domNode, view.root); //数据处理的重点部分,也是官方How it works主要涉及的部分
function findHotspot(){...}
function buildDefinitionQuery(){...}
function cleanup(){...}
function drawResultData(result){...} //非重点
function progTest(value){...}
function errBack(err){...}
}

按照官方的套路来,会更容易懂。那么久直接从findHotspot()、buildDefinitionQuery()、cleanup()、drawResultData(result)这四个方法说起吧。

How it works

允许我模仿一回官方的标题~

findHotspot():分析按钮的click事件,设置gp.submitJob()的参数对象params,并执行分析;在这里,使用了异步操作分析,终于看到了完整的then写法。

buildDefinitionQuery():gp.submitJob()的参数对象的生成方法,该方法返回了一个Object对象,供submitJob()使用。

cleanup():遍历map中的layer,如果发现名字全等于"HotspotLayer",移除。

drawResultData(result):绘制分析结果。

findHotspot()

function findHotspot() {
var params = {
Query: buildDefinitionQuery()
};
cleanup(); spinner.viewModel.point = view.center;
//经典的完整then()写法
gp.submitJob(params).then(drawResultData, errBack, progTest);
}

通过buildDefinitionQuery()获取需要的参数。

then写法,第一个drawResultData()是分析成功时要做的事情:绘制结果;

errBack()是分析失败要做的事情;

progTest()则是测试分析进展。

后两个比较简单,这样的写法类似try catch异常处理。

buildDefinitionQuery()

function buildDefinitionQuery() {
var defQuery;
var startDate = locale.format(registry.byId('fromDate').value, {
datePattern: 'yyyy-MM-dd hh:mm:ss',
selector: 'date'
});
var endDate = locale.format(registry.byId('toDate').value, {
datePattern: 'yyyy-MM-dd hh:mm:ss',
selector: 'date'
});
var def = [];
def.push("(Date >= date '" + startDate + "' and Date <= date '" +
endDate + "')");
def.push(
"(Day = 'SUN' OR Day= 'SAT' OR Day = 'FRI' OR Day ='MON' OR Day='TUE' OR Day='WED' OR Day ='THU')"
); if (def.length > 1) {
defQuery = def.join(" AND ");
}
return defQuery;
}

buildDefinitionQuery()方法

使用locale.format方法获取时间控件上的时间,分别为startDate和endData两个Object变量;

然后根据日期范围,设定一组SQL语句(应该是,语法比较怪异),名为def(装箱为String[])

最后把数组通过AND来链接成一个长字符串,赋值给defQuery这个变量,并返回defQuery变量作为返回值,也即为submitJob()的参数。

drawResultData(result)

function drawResultData(result) {
var imageParams = new ImageParameters({
format: "png32",
dpi: 300
}); var resultLayer = gp.getResultMapImageLayer(result.jobId);
resultLayer.opacity = 0.7;
resultLayer.title = "HotspotLayer"; map.layers.add(resultLayer);
spinner.viewModel.point = null;
}

ImageParameters这个类是什么东西完全不知道...new出来完全没看懂哪里有用,各位可以试试删除这个实例再运行。//怀疑是SDK开发人员忘记删了。

从gp中获取MapImageLayer,这个getResultMapImageLayer()是个新方法,返回指定id的MapImageLayer实例。这里返回的MapImageLayer实例名为resultLayer。

设置好透明度和名字后,加入到map的layers中。这就算完成了。

最后再上一张逻辑图:

至于图例widget和那个啥spinner就不作为重点啦~有兴趣的同学可以深究一下,应该在widget章节有详细的说明的。

再次感叹then这个东西的强大之处,Promise对异步操作真的太方便了。

总结一下

...???上面那张逻辑图不就说明了一切吗???

黑人问号.jpg

ArcGIS API for JavaScript 4.2学习笔记[29] 热点(密度)分析——以报警频率为例【使用Geoprocessor类】的更多相关文章

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

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

  2. ArcGIS API for JavaScript 4.2学习笔记[28] 可视域分析【使用Geoprocessor类】

    想知道可视域分析是什么,就得知道可视域是什么 我们站在某个地方,原地不动转一圈能看到的所有事物就叫可视域.当然平地就没什么所谓的可视域. 如果在山区呢?可视范围就会被山体挡住了.这个分析对军事上有十分 ...

  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学习笔记[21] 对3D场景上的3D要素进行点击查询【Query类学习】

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

  6. ArcGIS API for JavaScript 4.2学习笔记[30] 点和线高程查询(第八章完结)

    终于到最后一篇了,可喜可贺. 本例先说明了如何进行单点的高程差分析,然后说明了道路的起伏分析.前者很直观地比较了两个年份的高程数据之间的差值,体现山区的高程变化(有啥用啊?)后者,一条路上的起点终点起 ...

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

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

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

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

  9. ArcGIS API for JavaScript 4.2学习笔记[7] 鹰眼(缩略图的实现及异步处理、Promise、回调函数、监听的笔记)

    文前说明:关于style就是页面的css暂时不做评论,因为官方给的例子的样式实在太简单了,照抄阅读即可. 这篇文章有着大量AJS 4.x版本添加的内容,如监听watch.Promise对象.回调函数. ...

随机推荐

  1. 谷歌浏览器 插件安装配置Momentum chrome

    总之一句话就是这个Momentum插件可以把你的谷歌弄的漂亮一些,来搞一波 下载地址 http://www.cnplugins.com/down/predownnew.aspx?id=33842 下载 ...

  2. python中函数的参数解析

    python中函数的各种参数梳理: 1.形参:函数定义时传入的参数 2.实参:函数调用时传入的参数 (有形参必传实参,形参里自身特点可不传的,可传可不传) 3.缺省参数:不传为默认值,传了会覆盖(下面 ...

  3. 【Win 10 应用开发】在后台播放视频

    从 1607 (14393)版本开始,MediaPlayer 类就可以在前台与后台之间无缝播放,你不必再考虑前台与后之间的通信,所以从 14393 开始,你就不需要再用 BackgroundMedia ...

  4. 最强离线安装MySQL_8.0.2方法

    最强离线安装MySQL_8.0.2方法,一次就能安装成功. 按照此方式,离线安装MySQL五分钟都花不到,节省了大量的宝贵时间. 前戏,假设你已经从MySQL官网中获取了下面这个压缩包: 解压之后变成 ...

  5. [Docker网络]模拟一台交换机的拓扑

    [Docker网络]模拟一台交换机的拓扑 本例主要对Docker网络进行实际运用. 背景介绍 一台虚拟机如何模拟成一台多端口交换机分别连接多台虚拟机? bridge网桥技术 实验准备 docker d ...

  6. windows平台下基于QT和OpenCV搭建图像处理平台

        在之前的博客中,已经分别比较详细地阐述了"windows平台下基于VS和OpenCV"以及"Linux平台下基于QT和OpenCV"搭建图像处理框架,并 ...

  7. CCF-201312-4-有趣的数

    问题描述 试题编号: 201312-4 试题名称: 有趣的数 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 我们把一个数称为有趣的,当且仅当: 1. 它的数字只包含0, 1, ...

  8. 大数据学习系列之二 ----- HBase环境搭建(单机)

    引言 在上一篇中搭建了Hadoop的单机环境,这一篇则搭建HBase的单机环境 环境准备 1,服务器选择 阿里云服务器:入门型(按量付费) 操作系统:linux CentOS 6.8 Cpu:1核 内 ...

  9. 从源代码到Runtime发生的重排序

     源代码和Runtime时执行的代码很可能不一样,这是因为编译器.处理器常常会为了追求性能对改变执行顺序.然而改变顺序执行很危险,很有可能使得运行结果和预想的不一样,特别是当重排序共享变量时.  从源 ...

  10. 19_Android中图片处理原理篇,关于人脸识别站点,图片载入到内存,图片缩放,图片翻转倒置,网上撕衣服游戏案例编写

    1载入图片到内存 (1).数码相机照片特别是大于3m以上的,内存吃不消,会报OutOfMemoryError,若是想仅仅显示原图片的1/8,能够通过BitmapFactory.Options来实现.详 ...