地图中的鼠标移动响应

概述:

假设如下场景:首先地图加载一个WMS或者切片,wms为POI或者切片上有POI,我们知道WMS或者切片是无法做到像Marker或者矢量的事件相应的,但是我们又需要对这些POI点进行响应,这就不太好办了。基于此想法,本文讲述此想法的实现思路以及OL2和Arcgis中的实现方式。

思路:

实现的关键是注册两个map的事件:1、四至发生变化的时候;2、鼠标移动的时候。

1、四至发生变化

当地图的四至发生变化时,我们需要将变化后四至内的POI点的数据返回到前台进行下一步处理,返回的逻辑可以采用一次性全部返回或者分区域返回,分区域返回的优势是减少数据的传输量,但是分区域返回时需要结合鼠标移动的同时响应的。

2、鼠标移动的时候

当获取到了当前区域的POI数据,当鼠标移动时,以鼠标点为中心,当前地图的分辨率*图标大小为长宽,创建一个正方形,去循环判断POI点是否落在的该正方形内,是,响应;否,返回。

效果:

1、OL2中

2、Arcgis for js

实现:

1、OL2中

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title>openlayers map</title>
    <link rel="stylesheet" href="../../../plugin/OpenLayers-2.13.1/theme/default/style.css" type="text/css">
    <style>
        html, body, #map{
            padding:0;
            margin:0;
            height:100%;
            width:100%;
            overflow: hidden;
        }
        .highlight-poi-label{
        	background-color: #ffffff;
		    color:#000000;
		    border: solid 1px #1E90F5;
		    border-radius: 3px;
		    font-size: 12px;
		    padding: 2px 5px;
		    white-space:nowrap;
		    position:absolute;
		    z-index: 999;
        }
    </style>
    <script src="../../../plugin/OpenLayers-2.13.1/OpenLayers.js"></script>
    <script src="../../../plugin/jquery/jquery-1.8.3.js"></script>
    <script>
        var map;
        var tiled;
        $(window).load(function() {
            var format = ‘image/png‘;
            var bounds = new OpenLayers.Bounds(
                    73.45100463562233, 18.16324718764174,
                    134.97679764650596, 53.531943152223576
            );
            var options = {
                controls: [],
                maxExtent: bounds,
                maxResolution: 0.2403351289487642,
                projection: "EPSG:4326",
                units: ‘degrees‘
            };
            map = new OpenLayers.Map(‘map‘, options);
            tiled = new OpenLayers.Layer.WMS(
                    "Geoserver layers - Tiled",
                    "http://localhost:8088/geoserver/lzugis/wms",
                    {
                        "LAYERS": ‘capital‘,
                        "STYLES": ‘‘,
                        format: format
                    },
                    {
                        buffer: 0,
                        displayOutsideMaxExtent: true,
                        isBaseLayer: true,
                        yx : {‘EPSG:4326‘ : true}
                    }
            );
            map.addLayers([tiled]);
            map.addControl(new OpenLayers.Control.Zoom());
            map.addControl(new OpenLayers.Control.Navigation());
            map.zoomToExtent(bounds);
            var features =[];
            $.ajax({
		    	url: "data/capital.geojson",
		    	async: false,
		    	success:function(result){
                    result = eval("("+result+")");
                    var geojson_format = new OpenLayers.Format.GeoJSON();
                    features = geojson_format.read(result);
            	}
		    });
            map.events.register("mousemove", map, function(e){
            	$(".highlight-poi-label").remove();
            	map.layerContainerDiv.style.cursor = "default";
            	var lonlat = map.getLonLatFromPixel(e.xy);
		    	var offset = map.resolution*5;
		    	var xmin = lonlat.lon-offset,
		    		ymin = lonlat.lat-offset,
		    		xmax = lonlat.lon+offset,
		    		ymax = lonlat.lat+offset;
		    	for(var i in features){
		    		var feature = features[i];
		    		var geom = feature.geometry;
		    		var _ptx = geom.x,_pty = geom.y;
		    		if(_ptx>=xmin&&_ptx<=xmax&_pty>=ymin&&_pty<=ymax){
		                map.layerContainerDiv.style.cursor = "pointer";
		                var scrPt = map.getViewPortPxFromLonLat(new OpenLayers.LonLat(_ptx, _pty));
		                var orgPx = map.layerContainerOriginPx;
		                var labelDiv = $("<div/>").addClass("highlight-poi-label").css("top",(scrPt.y-orgPx.y+15)+"px")
		                	.css("left",(scrPt.x-orgPx.x+17)+"px").html(feature.attributes.name);
		                $(map.layerContainerDiv).append(labelDiv);
		            }
		    	}
            });
        });
    </script>
</head>
<body>
<div id="map">
</div>
</body>
</html>

2、Arcgis for js

<!DOCTYPE html>
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <meta name="viewport" content="initial-scale=1, maximum-scale=1,user-scalable=no"/>
    <title></title>
    <link rel="stylesheet" href="http://localhost/arcgis_js_311/api/arcgis_js_api/library/3.11/3.11/esri/css/esri.css">
    <style type="text/css">
        html, body, #map {
            height: 100%;
            margin: 0;
            padding: 0;
            font-size: 62.5%;
            font-family:"Segoe UI","Helvetica Neue",Helvetica,Arial,sans-serif;
            overflow: hidden;
        }
        .highlight-poi-label{
        	background-color: #ffffff;
		    color:#000000;
		    border: solid 1px #1E90F5;
		    border-radius: 3px;
		    font-size: 12px;
		    padding: 2px 5px;
		    white-space:nowrap;
		    position:absolute;
		    z-index: 999;
        }
    </style>
    <script src="http://localhost/arcgis_js_311/api/arcgis_js_api/library/3.11/3.11/init.js"></script>
    <script src="../../plugin/jquery/jquery-2.2.3.min.js"></script>
    <script type="text/javascript">
        var map;
        require([
                    "esri/map",
                    "esri/layers/WMSLayer",
                    "esri/geometry/Point",
                    "esri/geometry/Extent",
                    "dojo/domReady!"],
                function(Map,
                         WMSLayer,
                         Point,
                         Extent)
                {
                    map = new Map("map",{logo:false});

                    var resourceInfo = {
                        extent: new Extent(-126.40869140625,31.025390625,-109.66552734375,41.5283203125,{wkid: 4326}),
                        layerInfos: [],
                        version : ‘1.1.1‘
                    };
                    var geoWmsUrl = "http://localhost:8088/geoserver/wms";
                    var geoWmsLayer = new WMSLayer(geoWmsUrl,{resourceInfo: resourceInfo});
                    geoWmsLayer.setImageFormat("png");
                    geoWmsLayer.setVisibleLayers(["capital"]);
                    map.addLayer(geoWmsLayer);
                    var mapCenter = new Point(103.847, 36.0473, map.spatialReference);
                    map.centerAndZoom(mapCenter,4);
                    var features =[];
            		$.ajax({
					    url: "data/capital.geojson",
					    async: false,
					    success:function(result){
			                features = eval("("+result+")");
			                features = features.features;
			            }
					});
                    map.on("mouse-move", function(e){
					    $(".highlight-poi-label").remove();
            			map.setMapCursor("default");
            			var offset = map.getResolution()*5;
            			var mapPt = e.mapPoint;
            			var xmin = mapPt.x-offset,
				    		ymin = mapPt.y-offset,
				    		xmax = mapPt.x+offset,
				    		ymax = mapPt.y+offset;
				    	for(var i in features){
				    		var feature = features[i];
				    		var _ptx = feature.geometry.coordinates[0],
				    			_pty = feature.geometry.coordinates[1];
				    		if(_ptx>=xmin&&_ptx<=xmax&_pty>=ymin&&_pty<=ymax){
				    			map.setMapCursor("pointer");
				                var scrPt = map.toScreen(new Point(_ptx, _pty, map.spatialReference))
				                var labelDiv = $("<div/>").addClass("highlight-poi-label").css("top",(scrPt.y+15)+"px")
				                	.css("left",(scrPt.x+17)+"px").html(feature.properties.name);
				                $("#"+map.id).append(labelDiv);
				    		}
				    	}
					});
                });
    </script>
</head>
<body>
<div id="map">
</div>
</body>
</html>

---------------------------------------------------------------------------------------------------------------

技术博客

http://blog.csdn.NET/gisshixisheng

在线教程

http://edu.csdn.Net/course/detail/799
Github

https://github.com/lzugis/

联系方式

q       q:1004740957

e-mail:[email protected]

公众号:lzugis15

Q Q 群:452117357(webgis)
             337469080(Android)

时间: 2024-10-24 12:03:33

地图中的鼠标移动响应的相关文章

3D Slicer Modify Mouse Event 修改3D Slicer中的鼠标响应事件

在3D Slicer中,我们如果想在自己写的插件中来修改默认的鼠标响应事件的话,就需要先将原有的响应事件链接删除,然后建立自定义的响应事件链接,然后将自己要实现的功能写在响应事件函数中. 比如Slicer中默认的鼠标左键拖拽,是任意旋转视图中的Camera,默认中的滑轮操作是拉远和拉近视图摄像机,默认的鼠标右键操作也是拉远和拉近视图摄像机的操作.这样滑轮就和鼠标右键的功能重复了,我们可以让鼠标右键实现其他的功能.比如在模型的Pitch, Yaw, Roll三个旋转方向上(其实旋转的只是试图中的摄

echarts地图中城市与省份之间的切换

在使用echarts地图中,可能会用到显示各省份的数据和显示各城市的数据.综合了这两种的配置项,只需传四个参数即可完成对这两种模式的切换. 下面就是配置项代码: //地图配置 //mapData:图表所需数据:mapType:地图模式或散点图模式(即按省份显示数据或按城市显示数据) //minValue:视觉映射组件最小值:maxValue:视觉映射最大值 function _setMap(mapData, mapType, minValue, maxValue) { var option =

DuiLib事件分析(一)——鼠标事件响应

最近在处理DuiLib中自定义列表行元素事件,因为处理方案得不到较好的效果,于是只好一层一层的去剥离DuiLib事件是怎么来的,看能否在某一层截取消息,自己重写. 我这里使用CListContainerElementUI行元素,元素中有插入button,平时行元素不显示,鼠标移动上去显示出来,鼠标移走就隐藏button.Duilib自己是不带这个功能的,它有一个鼠标移动上去的热点事件,按理说重写热点事件就好了.但是当时比较急没找到怎么触发的,之后一直没继续走这条思路.后来找到源码事件里面有 vo

iOS 9应用开发教程之ios9中实现button的响应

iOS 9应用开发教程之ios9中实现button的响应 IOS9实现button的响应 button主要是实现用户交互的.即实现响应.button实现响应的方式能够依据加入button的不同分为两种:一种是编辑界面加入button实现的响应:还有一种是使用代码加入button实现的响应. 1.编辑界面加入button实现的响应 使用编辑界面加入button能够使用拖动的方式来实现button的响应,它也是最简单的一种实现响应的方式. [演示样例2-4]下面将实现轻拍button,改变主视图背景

MFC中如何在TreeCtrl控件中获取鼠标左键消息时的有效点击位置

MFC中,当在TreeCtrl控件中添加鼠标左键消息时,就意味着,凡是在该控件中点击左键后即会响应鼠标左键的消息,可有时我们只想记下有效的鼠标左键点击的事件,如图所示: 只想在CheckBox中点击鼠标左键时,将已选中的Item的句柄存入到链表中,那么如何只将有效的鼠标左键的消息存入链表中呢? 下面是响应鼠标左键消息时从所有鼠标左键消息都响应到只响应有效的左键消息的三个版本: 当响应鼠标左键的消息时,第一个版本: 获取鼠标的点击位置(注意:此时获取的是针对于当前屏幕的鼠标点击位置,所以需要将其转

jQuery地图热点效果-鼠标经过弹出提示层信息

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head><title>地图热点效果-鼠标经过弹出提示信息</title><meta http-equiv="Content-Type" content="

(转)OL2中设置鼠标的样式

http://blog.csdn.net/gisshixisheng/article/details/49496289 概述: 在OL2中,鼠标默认是箭头,地图移动时,鼠标样式是移动样式:很多时候,为了形象起见,我们总是希望鼠标在地图上的时候和移动地图的时候鼠标的样式不是默认的效果,本文讲述如何实现这样的效果. 实现方式: 通过下面的代码实现修改鼠标样式. map.layerContainerDiv.style.cursor = ("url(img/openhand.cur),default&q

iOS 9应用开发教程之ios9中实现按钮的响应

iOS 9应用开发教程之ios9中实现按钮的响应 IOS9实现按钮的响应 按钮主要是实现用户交互的,即实现响应.按钮实现响应的方式可以根据添加按钮的不同分为两种:一种是编辑界面添加按钮实现的响应:另一种是使用代码添加按钮实现的响应. 1.编辑界面添加按钮实现的响应 使用编辑界面添加按钮可以使用拖动的方式来实现按钮的响应,它也是最简单的一种实现响应的方式. [示例2-4]以下将实现轻拍按钮,改变主视图背景颜色的功能.具体的操作步骤如下: (1)创建一个Single View Application

网站开发div在Jquery中的鼠标事件失去焦点

网站div在Jquery中的鼠标事件失去焦点,今天在做网站开发的时候遇到了个问题,就是我在用Jquery做导航的时候,用到了Jquery的鼠标事件mouseout,但问题出来了,我有两个div,A的div包含了B的div,本来我是想当鼠标移出A的div的时候隐藏div,可是当我的鼠标移到B的div在移出的时候也会触发jquery的隐藏事件,这让人很头痛. 在网上搜了下,找到了解决的法子,就是直接把mouseout换成了mouseleave就可以了,具体的问题请大家参考Jquery的开发文档吧