热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

ArcGISAPI开发文档解析——View.hitTest()

return–异步的HitTestResult对象数组官方释义:返回与指定屏幕坐标相交的图形(具体可参考返回的数据结构示例)࿰

return–> 异步的 HitTestResult对象数组
官方释义:返回与指定屏幕坐标相交的图形(具体可参考返回的数据结构示例) ,每次单击交互查找鼠标指针下的所有对象。

两个参数:screenPoint, options
第一个参数:screenPoint 单击视图获取的屏幕坐标,一般可以通过View.on()事件触发得到,这也是为什么通常情况下View.hitTest()方法通常写在View.on()方法内部的原因
在这里插入图片描述

第二个参数:options 对象类型, 官方释义:相交的选项,当默认情况下,如果不透明度小于 1,则排除 map.ground。
主要有属性:include、exclude
Include:包含的图层和图形;不指定,则包含所有的图层和图形。
Exclude:排除的图层或图层;不指定,则包含所有的图层和图形。

返回的对象:异步的HitTestResult对象数组,当输入屏幕坐标的位置与视图中的图形相交时,将返回结果。如果图形具有非覆盖 IconSymbol3DLayer 符号系统,则只有第一个图形将从 hitTest 返回,数据结构参考:

{"screenPoint": {"x": 1110.666748046875,"y": 704.6666870117188},"results": [{"graphic": {"geometry": null,"symbol": null,"attributes": {"OBJECTID": 23259,"CNSTRCT_YR": 1950}},"mapPoint": {"spatialReference": {"latestWkid": 3857,"wkid": 102100},"x": -8237578.175357298,"y": 4972677.452421391,"z": 29.343255893327296},"distance": 6033.217135564263}],"ground": {"mapPoint": {"spatialReference": {"latestWkid": 3857,"wkid": 102100},"x": -8237575.894557083,"y": 4972679.5403643185,"z": 6.689946555570758},"distance": 6055.99127013477}
}

参考官方文档结构如下:
在这里插入图片描述

graphic: 视图中与输入屏幕坐标相交的图形。有些图层没有graphic.geometry(例如:SceneLayer 和PointCloudLayer)。graphics.attributes 仅包含客户端加载的属性,因此它可以是所有属性的子集。带有 [“*”] 的 FeatureLayer.outFields 可强制显示所有属性。graphics.symbol 仅存在于来自 GraphicsLayer 或 view.graphics 的图形,但可以使用 getDisplayedSymbol 计算显示的符号系统。
mapPoint :与输入屏幕坐标对应的视图空间参考中的点几何。
distance:从相机位置到此图形上的点几何图形的距离。在全局场景中,距离将以米为单位,而在局部场景中,距离将以视图的空间参考为单位。
ground :地面相交结果。即使地面被从 hitTest 中排除,也将始终返回地面撞击结果。
☞mapPoint:执行 hitTest 时击中地面的点。当地面完全没有被击中时(例如通过点击天空),这可能为空。
☞distance:从相机位置到地面的距离。如果地面完全没有被击中,则距离将为 0。在全局场景中,距离将以米为单位,而在局部场景中,距离将以视图的空间参考为单位。
☞screenPoint:单击视图的屏幕坐标(或本机鼠标事件)

我觉得这个方法更深入的应用在于和地面的相交碰撞检测,返回碰撞的结果,如下面的第一个demo中涉及,官方demo参考地址

view.on("immediate-click", (event) => {// get the returned hitTestResult// and draw points on all return mappoints and connect to a line// (using promise chaining for cleaner code and error handling)view.hitTest(event, { exclude: [view.graphics] }).then((hitTestResult) => {// print the information to the panelhitresultground.textContent = `${Math.round(hitTestResult.ground.distance)} m`;hitresultcount.textContent = hitTestResult.results.length;let lastHit = null;// 点击后有命中对象if (hitTestResult.results.length > 0) {// 最后一个命中对象赋给地面lastHit =hitTestResult.results[hitTestResult.results.length - 1];// 为每个命中对象创建点图形hitTestResult.results.forEach((result, index) => {const hitObject = new Graphic({geometry: result.mapPoint,symbol:index === 0 ? firstObjectPointSymbol : objectPointSymbol //第一个命中点和其他点样式区分});view.graphics.add(hitObject);// 修改点击命中图层的透明度let graphic = result.graphic;// change the layer to be transparentgraphic.layer.opacity = 0.8;// highlight the hit objectview.whenLayerView(graphic.layer).then((layerView) => {highlightedList.push(layerView.highlight(graphic));});});}// 地面相交点if (hitTestResult.ground.mapPoint) {if (lastHit) {// 确保地面点离相机最远if (hitTestResult.ground.distance > lastHit.distance) {// an object under the ground could be more far away,// check first the distance before set the ground as last pointlastHit = hitTestResult.ground;}} else {lastHit = hitTestResult.ground;}// create point graphic for the groundconst hitGround = new Graphic({geometry: hitTestResult.ground.mapPoint,symbol: groundPointSymbol});view.graphics.add(hitGround);}//添加相机点到命中地面点的线图形if (lastHit) {// Draw a line to connect all hit objects and groundlet linePoints = [[view.camera.position.x,view.camera.position.y,view.camera.position.z],[lastHit.mapPoint.x, lastHit.mapPoint.y, lastHit.mapPoint.z]];view.graphics.add({geometry: {type: "polyline",paths: linePoints,spatialReference: view.spatialReference},symbol: lineSymbol});}}).catch((error) => {console.error(error);});});

第二个demo 更多的主要展示视图的加载和事件间的交互,在hitTest的应用主要是拿到结果的graphic进行查询高亮

view.on("pointer-move", eventHandler);view.on("pointer-down", eventHandler);function eventHandler(event) {// only include graphics from hurricanesLayer in the hitTestconst opts = {include: hurricanesLayer};// the hitTest() checks to see if any graphics from the hurricanesLayer// intersect the x, y coordinates of the pointerview.hitTest(event, opts).then(getGraphics);}let highlight, currentYear, currentName;function getGraphics(response) {// the topmost graphic from the hurricanesLayer// and display select attribute values from the// graphic to the userif (response.results.length) {const graphic = response.results[0].graphic;const attributes = graphic.attributes;const category = attributes.CAT;const wind = attributes.WIND_KTS;const name = attributes.NAME;const year = attributes.YEAR;const id = attributes.OBJECTID;if (highlight &&(currentName !== name || currentYear !== year)) {highlight.remove();highlight = null;return;}if (highlight) {return;}document.getElementById("info").style.visibility = "visible";document.getElementById("name").innerHTML = name;document.getElementById("category").innerHTML ="Category " + category;document.getElementById("wind").innerHTML = wind + " kts";// highlight all features belonging to the same hurricane as the feature// returned from the hitTestconst query = layerView.createQuery();query.where = "YEAR = " + year + " AND NAME = '" + name + "'";layerView.queryObjectIds(query).then((ids) => {if (highlight) {highlight.remove();}highlight = layerView.highlight(ids);currentYear = year;currentName = name;});} else {// remove the highlight if no features are// returned from the hitTestif (highlight) {highlight.remove();highlight = null;}document.getElementById("info").style.visibility = "hidden";}}


推荐阅读
  • 模板引擎StringTemplate的使用方法和特点
    本文介绍了模板引擎StringTemplate的使用方法和特点,包括强制Model和View的分离、Lazy-Evaluation、Recursive enable等。同时,还介绍了StringTemplate语法中的属性和普通字符的使用方法,并提供了向模板填充属性的示例代码。 ... [详细]
  • 本文介绍了在Vue项目中如何结合Element UI解决连续上传多张图片及图片编辑的问题。作者强调了在编码前要明确需求和所需要的结果,并详细描述了自己的代码实现过程。 ... [详细]
  • 本文介绍了在MFC下利用C++和MFC的特性动态创建窗口的方法,包括继承现有的MFC类并加以改造、插入工具栏和状态栏对象的声明等。同时还提到了窗口销毁的处理方法。本文详细介绍了实现方法并给出了相关注意事项。 ... [详细]
  • 如何自行分析定位SAP BSP错误
    The“BSPtag”Imentionedintheblogtitlemeansforexamplethetagchtmlb:configCelleratorbelowwhichi ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 本文介绍了使用哈夫曼树实现文件压缩和解压的方法。首先对数据结构课程设计中的代码进行了分析,包括使用时间调用、常量定义和统计文件中各个字符时相关的结构体。然后讨论了哈夫曼树的实现原理和算法。最后介绍了文件压缩和解压的具体步骤,包括字符统计、构建哈夫曼树、生成编码表、编码和解码过程。通过实例演示了文件压缩和解压的效果。本文的内容对于理解哈夫曼树的实现原理和应用具有一定的参考价值。 ... [详细]
  • php缓存ri,浅析ThinkPHP缓存之快速缓存(F方法)和动态缓存(S方法)(日常整理)
    thinkPHP的F方法只能用于缓存简单数据类型,不支持有效期和缓存对象。S()缓存方法支持有效期,又称动态缓存方法。本文是小编日常整理有关thinkp ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 本文介绍了Redis的基础数据结构string的应用场景,并以面试的形式进行问答讲解,帮助读者更好地理解和应用Redis。同时,描述了一位面试者的心理状态和面试官的行为。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • 本文介绍了深入浅出Linux设备驱动编程的重要性,以及两种加载和删除Linux内核模块的方法。通过一个内核模块的例子,展示了模块的编译和加载过程,并讨论了模块对内核大小的控制。深入理解Linux设备驱动编程对于开发者来说非常重要。 ... [详细]
  • Todayatworksomeonetriedtoconvincemethat:今天在工作中有人试图说服我:{$obj->getTableInfo()}isfine ... [详细]
  • PHP引用的概念和用法详解
    本文详细介绍了PHP中引用的概念和用法。引用是指不同的变量名访问同一个变量内容,类似于Unix文件系统中的hardlink。文章从引用的定义、作用、语法和注意事项等方面进行了解释和示例。同时还介绍了对未定义变量使用引用的情况,以及在函数和new运算符中使用引用的注意事项。 ... [详细]
  • 本文介绍了如何对PHP二维数组进行排序以及如何获取最大值。同时还提到了在数据分析系统中使用排序的实例,以及如何统计角色等级和创建角色总数。 ... [详细]
author-avatar
芳芳的地盘1990
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有