lzugis——Arcgis Server for JavaScript API之POI

news/2023/6/8 7:41:36

POI(Point Of Interest),感兴趣点,其实呢,严格意义上说应该不是POI,但是单位就这样叫了,我也就这样叫了,其实现的功能大致是这样的:用过百度地图的朋友们都知道你在百度地图时,当鼠标经过某个点时会显示这个对象的名称,点击该对象,会弹出该对象的详细信息。如下图所示:


实现后的效果呢就是这样子的,下面呢我来说说在Arcgis Server for JavaScript API下,我实现该效果的思路与想法。


首先,得有一个图层用于显示这些点对象,这个图层可以是切片,也可以是WMS,也可以是featurelayer,反正只要是能将这些东西在地图上显示出来就Ok了。

map = new Map("map",{logo:false,center: [106.6854, 35.8364],slider: true
});
var tiledLayer = new Tiled(tiledUrl);
map.addLayer(tiledLayer);	

接下来说说这些点究竟是怎么回事,其实呢,这些点呢就是一个JSON格式的数据,里面的每一个对象包含了该对象的属性信息,返回的JSON格式的大概如下:

{total:3,layerpoi:[{poiCode:'0',poiTitle:'wlmq',poix:9748157.53561782,poiy:5429353.112666599 },{poiCode:'1',poiTitle:'hhht',poix:12453416.840686005,poiy:4997253.113785474 },{poiCode:'2',poiTitle:'lz',poix:11528834.54654876,poiy:4319715.295065851 }]
}
注意,每一个对象必须得有一个id,name,x,y,前面这四个是必须的,其他的可有可无,至于说怎么返回,这个事情你自己考虑,怎么方便怎么来,asp.net可以用*.ashx,java可以考虑servlet或者别的,反正能返回这个JSON就Ok。那么,我何时请求让他返回呢,有两个时间:1、地图初始化加载的时候;2、地图的extent发生变化的时候。我们可以用ajax来实现:

function excuteData(dataUrl){$.ajax({type: "post",dataType: "JSON",url: dataUrl,data: {level: mapLevel, bbox: bbox},success: function(json){      					var data = json.layerpoi;total=json.total; if(total!=0){for(var i in data){var xmin,ymin,xmax,ymax;xmin=data[i].poix-offset;ymin=data[i].poiy-offset;xmax=data[i].poix+offset;ymax=data[i].poiy+offset;var poiExtent = new esri.geometry.Extent(xmin,ymin,xmax,ymax,map.spatialReference);poiArray[i] = new POI(data[i].poiType,data[i].poiTitle,data[i].poix,data[i].poiy,poiExtent);	      							}}}});
}
分析上面的代码,ajax请求,传递的参数为level(地图的级别),bbox(地图当前的四至),意思就是通过当前地图的级别和四至判断当前可是范围内所包含的点对象的个数与信息,success后返回JSON,首先,判断total的个数是否为0,不为0,说明有点对象,这时,根据地图的比例尺计算一个合理的offset,根据x、y、offset给每一个点对象创建一个extent,你可以建一个对象类将这些对象点的信息存储起来:

function POI(code,title,x,y,extent){this.code=code;this.title=title;this.x=x;this.y=y;this.extent=extent;
}
接着,实现移动鼠标去判断鼠标当前所在点是否被对象点所包含,包含了,显示该对象的信息,并高亮显示给对象:

	    //鼠标移动事件function mapMouseMove(evt){var point = evt.mapPoint;for(var i = 0; i < poiArray.length; i++){	            		var extent=poiArray[i].extent;	if(extent.contains(point)){console.log("true");poipoint = new esri.geometry.Point([poiArray[i].x,poiArray[i].y],map.spatialReference);var graphicMarker = new esri.Graphic(poipoint, pmsHover);map.graphics.add(graphicMarker);var font  = new esri.symbol.Font();font.setSize("10pt");font.setFamily("微软雅黑");var text = new esri.symbol.TextSymbol(poiArray[i].title);text.setFont(font);text.setColor(new dojo.Color([0,0,0,100]));text.setOffset(15,-20);var graphicLabel = new esri.Graphic(poipoint,text);map.graphics.add(graphicLabel);flag=i;
				break;}else{console.log("false");map.graphics.clear();          			flag=null;}}}map.on("mouse-move",mapMouseMove);
给地图添加鼠标移动事件,当移动到对象出现对象名称时,点击该对象,出现对象的详细信息,所以给地图添加click事件:

	   function mapClick(evt){if(flag==null){return;}else{map.centerAt(poipoint);map.infoWindow.setTitle(poiArray[flag].title);map.infoWindow.setContent("类型:"+poiArray[flag].type+"<br>X:"+poiArray[flag].x+"<br>Y:"+poiArray[flag].y);map.infoWindow.show(poipoint);}}map.on("click",mapClick);
上面说了,请求返回JSON数据的时间有俩,所以还得给地图添加extent-change事件:

	    function extentChange(evt){mapLevel=map.getLevel();bbox=this.map.extent.xmin+","+this.map.extent.ymin+","+this.map.extent.xmax+","+this.map.extent.ymax;excuteData(dataUrl);}map.on("extent-change",extentChange);
这样,我所要的功能就基本上实现了,效果如下:

初始状态

鼠标经过时显示该对象的名称并高亮显示

单击时显示该对象的详细信息
到此,我的介绍就结束了,欢迎您关注lzugis
lzugis,关注GIS,gis路上有我,你并不孤独!






转载于:https://www.cnblogs.com/lzugis/p/6539906.html


https://dhexx.cn/news/show-17487.html

相关文章

websocket 多人群聊Demo ,演示握手,channel拦截器使用,并获取拦截器里的值,模拟登陆,实时显示在线用户等功能

此Demo的源码地址&#xff0c;先说明&#xff0c;仅为Demo&#xff0c;bug满天飞https://download.csdn.net/download/qq_41712271/16137309?spm1001.2014.3001.5503 本项目注释代码不多&#xff0c;更详细的注释&#xff0c;可看些项目&#xff0c;以下只列出核心代码https:/…

【软件分析与挖掘】An Empirical Study of Bugs in Build Process

摘要 对软件构建过程中所产生的错误&#xff08;build process bugs&#xff09;进行实证研究。 5个开源项目&#xff1a;CXF, Camel, Felix,Struts, and Tuscany。 把build process bugs 和 other bugs在3个维度比较&#xff1a;bug severity, bug fix time, the number of fi…

springboot+websocket+sockjs整合rabbitmq

前提条件 rabbitmq已经安装并开启了stomp插件https://blog.csdn.net/qq_41712271/article/details/115274738 此功能在这个项目中改进&#xff0c;以后消息都存储在rabbitmq中&#xff0c;websocket可以往mq里发消息&#xff0c;也可以接收mq的消息 https://blog.csdn.net/qq_4…

Kubuntu 14.10 mentohust 配置libpcap 锐捷校园网登录总结

首先需要说明&#xff0c;mentohust 和锐捷一样&#xff0c;都依赖 libpcap 这个函数库。 而配置libpcap 前&#xff0c;需要安装GCC、GNU M4 、 flex 、bison&#xff0c;不然就会报错 (以下均以 root 身份执行&#xff09; 1.安装GCCUbuntu默认安装了GCC&#xff0c;但是按照…

使用Jenkins配置自动化构建

持续集成是个简单重复劳动&#xff0c;人来操作费时费力&#xff0c;使用自动化构建工具完成是最好不过的了。 为了实现这个要求&#xff0c;我选择了Jenkins。从 http://mirrors.jenkins-ci.org/windows/latest下载windows下的最新安装版jenkins。&#xff08;如果不 能安装&a…

EF(EntityFramework) Migrations 迁移

1、开启程序包管理器控制台 2.安装EntityFrameworkPM> Install-Package EntityFramework3.启用迁移PM> Enable-Migrations –EnableAutomaticMigrations遇到的问题&#xff1a;4.创建迁移点PM> Add-Migration InitialCreate5.执行迁移点更新PM> Update-Database –…

springboot整合rabbitmq 消费者Consumer 手动进行ack确认

ack指Acknowledge&#xff0c;确认。 表示消费端收到消息后的确认方式。 有三种确认方式&#xff1a; 自动确认&#xff1a;acknowledge"none" 手动确认&#xff1a;acknowledge"manual" 根据异常情况确认&#xff1a;acknowledge"auto"&#xf…

LRU缓存实现(Java)

LRU Cache的LinkedHashMap实现LRU Cache的链表HashMap实现LinkedHashMap的FIFO实现调用示例LRU是Least Recently Used 的缩写&#xff0c;翻译过来就是“最近最少使用”&#xff0c;LRU缓存就是使用这种原理实现&#xff0c;简单的说就是缓存一定量的数据&#xff0c;当超过设定…

springboot整合rabbitmq 消费者Consumer限流

场景&#xff1a;请求瞬间增多&#xff0c;每秒5000个请求&#xff0c;防止A系统挂掉 注意&#xff1a;一定要开启手动ack确认 1 application.yml配置文件 server:port: 8021 spring:#给项目来个名字application:name: rabbitmq-test#配置rabbitMq 服务器rabbitmq:host: 127.0…

Android 图标右上角添加数字提醒

方法一&#xff1a;使用开源项目ViewBadger&#xff0c;github上的地址&#xff1a;https://github.com/jgilfelt/android-viewbadger 效果如图所示&#xff1a;[java] view plaincopy<TextView android:id"id/tv1" android:layout_width"wr…