地图中的鼠标移动响应
来源:互联网 发布:自制西门子编程线 编辑:程序博客网 时间:2024/05/22 03:52
概述:
假设如下场景:首先地图加载一个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>
<!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:niujp08@qq.com
公众号:lzugis15
Q Q 群:452117357(webgis)
337469080(Android)
- 地图中的鼠标移动响应
- 百度地图弹出层中的div跟随鼠标移动
- MFC中的消息响应(左键按下鼠标)和(移动鼠标)
- QT中的鼠标移动
- js中的鼠标移动
- 一个响应鼠标移动的简单实例!
- 简单的角色响应鼠标而移动
- CSS 鼠标响应事件,鼠标经过CSS,鼠标移动CSS,鼠标点击CSS
- CSS 鼠标响应事件,鼠标经过CSS,鼠标移动CSS,鼠标点击CSS
- 让Shockwave flash控件响应鼠标移动的事件
- C#关于鼠标移动到 标题栏的响应操作
- mousemove事件,鼠标移动过快时,无法全部响应
- GoogleMapsV3-----基础地图(鼠标移动画矩形)
- 随鼠标移动在状态栏显示地图坐标
- WM_LBUTTONDOW实现地图不断往鼠标方向移动位置
- 鼠标控制地图的平滑移动和缩放
- 关于移动中的button的响应问题
- 响应鼠标
- day 1
- 2017.1.20【初中部 GDKOI】模拟赛B组 邻近(near) 题解
- 【JZOJ3892】【NOIP2014模拟10.25A组】放棋子
- 2017.1.20【初中部 GDKOI】模拟赛B组 电影院(cinema) 题解
- 【NOIP2014模拟10.25A组】画矩形
- 地图中的鼠标移动响应
- 【JZOJ3893】【NOIP2014模拟10.25A组】画矩形
- 【USACO TRAINING】奶牛家谱
- 【LeetCode】 279. Perfect Squares
- 关于第二类斯特林数
- 1、LED闪烁实验
- struts2中的国际化
- cmos单元电路的形态
- Servlet会话Cookie和Session