从第一篇到现在都是基于地图的,不管怎么样,不管是2D还是3D,至少有个图。

这次来个没有图的例子,看看纯文字的空间查询是什么样的。

本例适用于后台查询或低性能电脑的查询。


预览图

由于4.3和4.2的这个例子没有任何实质性的改动,我直接从官方运行的4.3的例子:

默认打开的时候,按下Find按钮,右边就会出现转圈圈的图,其实是个GIF图片。

结果如上,将Spokane这个County的信息列举出来了,列出的字段有County Name、State、Population(2012)、%Population Change(2000-2010)四个。

对应的值以常规字体列在下方。

是不是很简单?代码可不一定简单。

给出引用

html上的引用就不需要css了:

<script src="https://js.arcgis.com/4.2/"></script>

只需要引用js库即可。

函数引用:

require([
"esri/tasks/FindTask",
"esri/tasks/support/FindParameters",
"dojo/_base/array",
"dojo/dom",
"dojo/on",
"dojo/domReady!"
],
function(FindTask, FindParameters, arrayUtils, dom, on) {
//代码
}
);

哦哟,FindTask居然不是用Query了,而是转用FindParameters。看来对Query、Find、Search这几个词还是要区别的。

函数参数骨架

function(FindTask, FindParameters, arrayUtils, dom, on) {
var loadingImg = dom.byId("loading"); var find = new FindTask({});
var params = new FindParameters({}); function doFind() {} var resultsTable = dom.byId("tbl"); function showResults(response) {}
function rejectedPromise(err) {} on(dom.byId("findBtn"), "click", doFind);
}

这个和上一个例子类似了,FindTask、FindParameters和QueryTask、Query差不多,成对出现:

var find = new FindTask({
url: "https://services.arcgisonline.com/arcgis/rest/services/Demographics/USA_2000-2010_Population_Change/MapServer"
});
var params = new FindParameters({
layerIds: [3],
searchFields: ["NAME"]
});

值得一提的是,FindTask这个类也是由ArcServer发布的服务实例化的。查阅API,得知FindTask类的细节:

FindTask

和QueryTask如出一辙,但是参数改为FindParameters了,返回值也变成FindResults类型的变量了。

FindParameters

和Query类似的东西:

列举几个常用属性:searchText(String)、searchFields(String[])、returnGeometry(Boolean)、outSpatialReference(SpatialReference)

前面两个就是本例中使用的属性了,searchText是用户输入的需要进行搜索的文本,searchFields则是进行搜索的字段。后两个和Query一样。

FindResult

列举几个常用属性:feature(Graphic)、foundFieldName(String)

前一个即为找到的几何(在属性表中对应一行),后一个为这个几何所在FindParameters中设定搜索的字段中的那一个。


function doFind() {
loadingImg.style.visibility = "visible";
params.searchText = dom.byId("inputTxt").value; find.execute(params)
.then(showResults)
.otherwise(rejectedPromise);
}

而doFind()和上一例的doQuery()也是类似的,成功就调用showResults(),失败就调用rejectedPromise()。

最后一个则是为findBtn这个DOM按钮添加click事件。

逻辑如下,和上一个例子几乎一毛一样,仅仅是showResults这个对返回结果的处理的方法不太一样罢了。

下方高能!!

function showResults(response) {

  var results = response.results;
resultsTable.innerHTML = ""; //如果返回的results是空,那么告诉用户
if (results.length === 0) {
resultsTable.innerHTML = "<i>No results found</i>";
loadingImg.style.visibility = "hidden";
return;
} //HTML操作,加一行,加4个单元格
var topRow = resultsTable.insertRow(0);
var cell1 = topRow.insertCell(0);
var cell2 = topRow.insertCell(1);
var cell3 = topRow.insertCell(2);
var cell4 = topRow.insertCell(3);
//HTML操作,给每一个单元格填入值
cell1.innerHTML = "<b>County Name</b>";
cell2.innerHTML = "<b>State</b>";
cell3.innerHTML = "<b>Population (2012)</b>";
cell4.innerHTML = "<b>% Population Change (2000 - 2010)</b>"; //!最关键的一段代码!
arrayUtils.forEach(results, function(findResult, i) {
var county = findResult.feature.attributes.Name;
var state = findResult.feature.attributes[
"State Abbreviation"];
var popGrowth = findResult.feature.attributes[
"2000-2010 Population Annual Compound Growth Rate (U.S. Census)"
];
var pop2012 = findResult.feature.attributes[
"2012 Total Population (Esri)"]; //HTML操作。加一行,加4个单元格,写入值。
var row = resultsTable.insertRow(i + 1);
var cell1 = row.insertCell(0);
var cell2 = row.insertCell(1);
var cell3 = row.insertCell(2);
var cell4 = row.insertCell(3);
cell1.innerHTML = county;
cell2.innerHTML = state;
cell3.innerHTML = pop2012;
cell4.innerHTML = popGrowth;
}); //转圈圈的GIF图不可见
loadingImg.style.visibility = "hidden";
}

别看这段代码很长,很多都是HTML的DOM元素操作,我们单独把关键段取出来:

arrayUtils.forEach(results, function(findResult, i) {

  //从FindResult对象中获取需要的字段值
var county = findResult.feature.attributes.Name;
var state = findResult.feature.attributes["State Abbreviation"];
var popGrowth = findResult.feature.attributes[ "2000-2010 Population Annual Compound Growth Rate (U.S. Census)"];
var pop2012 = findResult.feature.attributes["2012 Total Population (Esri)"]; // HTML操作
...省略
});

注意到遍历的是results,这个东西是Object数组,被装箱成FindResult数组。这里其实就是从FindResult对象中获取feature的attribute的值,再在下方进行HTML操作而已。

那么这个results是怎么来的呢?注意doFind()方法的最头一句:

var results = response.results;

从传入参数response中获取的results属性。经过查阅,这个response不是FindResult,而是PortalQueryResult类型的参数。

PortalQueryResult有一个属性是results,值类型是Object数组。

那么现在就清楚了吧!这个小地方算是比较坑的。


总结一下。

使用FindTask和FindParameters进行“Find查找”操作,而不是“Query查询”,也不是“Search搜索”。

对结果FindResult进行读取,并写入HTML元素上进行结果显示。

整个例子没有地图,清新脱俗...#滑稽。

ArcGIS API for JavaScript 4.2学习笔记[23] 没有地图如何进行查询?【FindTask类的使用】的更多相关文章

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

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

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

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

  3. ArcGIS API for JavaScript 4.2学习笔记[6] goTo()地图动画

    这是个很有意思的例子,不过例子给的比较复杂,需要查很多API,我会在文章最后给出关键的类和属性解释. 同样发现一个很有意思的事儿:博客园似乎有爬虫,我4号发布的blogs,5号就在百度和google搜 ...

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

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

  5. ArcGIS API for JavaScript 4.2学习笔记[26] 缓冲区分析【基于geometryEngine工具类】

    要说GIS空间分析最经典的例子,就是缓冲区分析了. 本例使用geometryEngine来绘制缓冲区环.因为官方给的例子有3D和2D场景,所以就会显得比较复杂. 当鼠标在视图上点击时,就会生成一个缓冲 ...

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

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

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

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

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

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

  9. ArcGIS API for JavaScript 4.2学习笔记[24] 【IdentifyTask类】的使用(结合IdentifyParameters类)(第七章完结)

    好吧,我都要吐了. 接连三个例子都是类似的套路,使用某个查询参数类的实例,结合对应的Task类,对返回值进行取值.显示. 这个例子是Identify识别,使用了TileLayer这种图层,数据来自Se ...

随机推荐

  1. MySQL的安装(比较详细的安装步骤,包括客户端和服务端的安装,还有环境变量的配置以及使用Windows service启动MySQL)

    1.MySQL官网下载操作系统对应的MySQL安装包,解压之后就可以直接使用(免安装). MySQL安装包,一种是MySQL Enterprise Edition (commercial)企业版,还有 ...

  2. 玩转html

    简介 CSS 是什么? CSS是Cascading Style Sheets的简称,中文称为层叠样式表. 作用 能够对网页中元素位置的排版进行像素级精确控制,支持几乎所有的字体字号样式,拥有对网页对象 ...

  3. 虚拟机安装 deepin Linux 注意事项

    主要要注意下面几点: 一.虚拟机"客户机操作系统"类型 选择"Windows 7 x64" 选择"客户机操作系统"类型,这个选择十分重要,D ...

  4. 前端自动化测试漫长路之——Selenium初探

    引言 最近想解决前端开发或测试中的两个问题:一是界面UI的布局适配,能否在测试的过程中,通过命令操作真机打开相应页面然后截屏,通过对图片识别分类,发现有问题的图片,然后及时修复:二是页面性能分析,很多 ...

  5. github与git之间怎么建立连接

    git是一款强大的分布式版本控制系统,到底是什么意思呢?其实我也不知道,以后知道了再补上吧.下面咱们来讲一下github怎么与你电脑上的git建立起连接关系. 一.你要有一个github账号. 去百度 ...

  6. 使用PowerApps快速构建基于主题的轻业务应用 —— 入门篇

    作者:陈希章 发表于 2017年12月12日 前言 在上一篇文章 基于Office 365的随需应变业务应用平台 中我提到,随着随需应变的业务需要,以及技术的发展,业务应用的开发的模式也有了深刻的变化 ...

  7. Atcoder R84 D Small Multiple

    题意:给定一个正整数K,求K的倍数中,各位上的数字之和最小是多少? 思路非常巧妙,对于一个数,我们有定义两种改变方式: 1.加1,则数字之和+1(9的情况另行考虑) 2.乘10,数字之和不变 对于末位 ...

  8. MFC控件实现视频“暂停” “播放”循环

    问static有什么作用,朗朗上口,可是用起来呢 MFC"按钮"控件实现开始显示"播放",按一下之后就开始播放相关视频,并且按钮显示为"暂停" ...

  9. 我的Android进阶之旅------&gt;Android知识图谱

    Android知识图谱.快来看看哪方面有漏洞? 该图转自:http://blog.csdn.net/xyz_lmn/article/details/41411355

  10. Jena将owl文件持久化到数据库中

    package cn.edu.shu.db; import java.io.File; import java.io.FileInputStream; import java.io.IOExcepti ...