基于OL2实现百度地图ABCD marker的效果

本文概述:

上文中提到了在Arcgis for JS中实现百度地图ABCD的marker效果,在本文,讲述如何在OpenLayers2中实现类似的效果。

效果图展示如下:

为直观期间,先将效果贴出来。

联动展示

思路:

1、列表与地图的互动

鼠标经过列表时,修改列表图标,并根据列表返回的值在地图上绘蓝色的marker;鼠标移出,修改列表图标为红色,清空地图marker图层。

关键代码:

title.on("mouseover",function(){
  var i = $(this).attr("i");
  $("#img"+i).attr("src","img/blue.png");
  var data = $(this).data("attr");
  var hpt = new OpenLayers.LonLat(data.x,data.y);
  var hicon = new OpenLayers.Icon('img/blue.png',size,offset);
  hMarker = new OpenLayers.Marker(hpt,hicon);
  markerLyr.addMarker(hMarker);
  showName(hpt,data.name,"item-label-name");
});
title.on("mouseout",function(){
  var i = $(this).attr("i");
  $("#img"+i).attr("src","img/red.png");
  markerLyr.removeMarker(hMarker);
  hlabelLyr.clear();
});
title.on("click",function(){
  var data = $(this).data("attr");
  showInfowindow(data.name,data.desc);
}); 

2、地图与列表的互动

鼠标经过地图红色的marker时,修改对应列表图标,并将红色 marker的图片换成蓝色的;鼠标移出,修改对应列表图标,并修改marker为红色。

关键代码:

marker.events.register("click", feature, function(e){
  var data = e.object.attr;
  showInfowindow(data.name,data.desc);
});
marker.events.register("mouseover", feature, function(e){
  map.layerContainerDiv.style.cursor = "pointer";
  var id= e.object.id;
  $("#img"+id).attr("src","img/blue.png");
  $("#li"+id).css("background","#f2f2f2");
  var data = e.object.attr;
  var hpt = new OpenLayers.LonLat(data.x, data.y);
  showName(hpt,data.name,"item-label-name-map");
});
marker.events.register("mouseout", feature, function(e){
  map.layerContainerDiv.style.cursor = "url("
    + OpenLayers.Util.getRootPath()
    + "img/pan.cur),default";
  var id= e.object.id;
  $("#img"+id).attr("src","red.png");
  $("#li"+id).css("background","#ffffff");
  hlabelLyr.clear();
});
markerLyr.addMarker(marker);
var label = new OpenLayers.Label(pt,i+1,"item-label");
labelLyr.add(label); 

3、地图上的1,2,3,4...等数字是一个label图层,不参与联动;

4、数据以JSON的形式传递,在本实例中,根据地图的四至动态生成的,如下:

function getRandomXY(){
  var json = new Array();
  for(var i=0;i<8;i++){
    var w = bounds.getWidth();
    var h = bounds.getHeight();
    var x = Math.random() * w + bounds.left;
    var y = Math.random() * h + bounds.bottom;
    json.push({
      id:i,
      name:"name"+i,
      desc:"this is the name"+i,
      x:x,
      y:y
    })
  }
  return json;
}

完整代码如下:

<!DOCTYPE html>
<html>
<head lang="en">
  <meta charset="UTF-8">
  <title>openlayers map</title>
  <link rel="stylesheet" type="text/css" href="http://localhost/olapi/theme/default/style.css"/>
  <style>
    html, body, #map{
      padding:0;
      margin:0;
      height:100%;
      width:100%;
      overflow: hidden;
      font-size: 12.5px;
      font-family:"宋体"
    }
    .item-list{
      position: absolute;
      top:100px;
      left: 20px;
      z-index: 999;
      border: 1px solid #ccc;
      width: 200px;
      background: #fff;
    }
    .list-close{
      background: url("img/panel_tools.png");
      width: 16px;
      height: 16px;
      float: right;
      margin: 3px 3px;
      background-position: -16px 0px;
    }
    .list-close:hover{
      cursor: pointer;
    }
    .list-title{
      background: #009dda;
      color: #fff;
      padding: 5px 8px;
      font-weight: bold;
    }
    ul{
      list-style: none;
      margin: -0px 0;
    }
    ul li{
      border-bottom: 1px dotted #eee;
      margin-left: -40px;
      margin-top: 5px;
      position: relative;
    }
    ul li:hover{
      background: #f2f2f2;
    }
    .item{
      padding: 2px 5px;
    }
    .item:hover{
      cursor: pointer;
    }
    .item-num{
      position: absolute;
      top: 4px;
      left: 12px;
      color:#fff;
      font-size: 15px;
      font-weight: bold;
    }
    .item-title{
      float: right;
      font-weight: bold;
      margin-right: 10px;
    }
    .item-content{
      padding: 3px 5px;
    }
    .item-detail{
      margin: 3px 5px;
      float: right;
    }
    .item-detail:hover{
      text-decoration: underline;
      color: #01A4F8;
      cursor: pointer;
    }
    .item-label{
      color:#fff;
      font-size: 15px;
      font-weight: bold;
      margin-top: 2px;
      margin-left: 7px;
    }
    .item-label-name,.item-label-name-map{
      border:1px solid #a6c9e2;
      background: #fff;
      padding: 3px 5px;
      font-size: 12px;
      margin-top: 23px;
      margin-left: 15px;
      border-radius: 5px;
    }
    .item-label-name-map{
      margin-left: 25px;
    }
  </style>
  <!--引入jquery 库 -->
  <script type="text/javascript" src="http://localhost/olapi/OpenLayers.js"></script>
  <script type="text/javascript" src="http://localhost/olapi/lib/OpenLayers/Lang/zh-CN.js"></script>
  <script src="http://localhost/jquery/jquery-1.8.3.js"></script>
  <script src="extend/LabelLayer.js"></script>
  <script>
    var map;
    var tiled;
    $(window).load(function() {
      var bounds = new OpenLayers.Bounds(
          87.57582859314434, 19.969920291221204,
          126.56713756740385, 45.693810203800794
      );
      var options = {
        controls: [],
        maxExtent: bounds,
        maxResolution: 0.1523098006807012,
        projection: "EPSG:4326",
        units: 'degrees'
      };
      map = new OpenLayers.Map('map', options);
      map.addControl(new OpenLayers.Control.Zoom());
      map.addControl(new OpenLayers.Control.Navigation());
      map.addControl( new OpenLayers.Control.MousePosition());
      var tiled = new OpenLayers.Layer.WMS(
          "province", "http://localhost:8088/geoserver/lzugis/wms",
          {
            "LAYERS": 'province',
            "STYLES": '',
            format: 'image/png'
          },
          {
            buffer: 0,
            displayOutsideMaxExtent: true,
            isBaseLayer: true,
            yx : {'EPSG:4326' : true}
          }
      );
      var markerLyr = new OpenLayers.Layer.Markers("marker");
      var labelLyr = new OpenLayers.Layer.Labels("label");
      var hlabelLyr = new OpenLayers.Layer.Labels("hlabelLyr");
      map.addLayers([tiled,markerLyr,labelLyr,hlabelLyr]);
      map.zoomToExtent(bounds); 

      var data = getRandomXY();
      console.log(data);
      var ul = $("#items");
      var size = new OpenLayers.Size(24,26);
      var offset = new OpenLayers.Pixel(0, 0);
      var hMarker=null;
      for(var i=0;i<data.length;i++) {
        /**
         * 地图内容
         */
        var pt = new OpenLayers.LonLat(data[i].x, data[i].y);
        var icon = new OpenLayers.Icon('img/red.png',size,offset);
        var feature = new OpenLayers.Feature(markerLyr,
            pt,
            {'icon': icon,'attr':data[i]});
        var marker = feature.createMarker();
        marker.attr = data[i];
        marker.id = i;
        marker.events.register("click", feature, function(e){
          var data = e.object.attr;
          showInfowindow(data.name,data.desc);
        });
        marker.events.register("mouseover", feature, function(e){
          map.layerContainerDiv.style.cursor = "pointer";
          var id= e.object.id;
          $("#img"+id).attr("src","img/blue.png");
          $("#li"+id).css("background","#f2f2f2");
          var data = e.object.attr;
          var hpt = new OpenLayers.LonLat(data.x, data.y);
          showName(hpt,data.name,"item-label-name-map");
        });
        marker.events.register("mouseout", feature, function(e){
          map.layerContainerDiv.style.cursor = "url("
            + OpenLayers.Util.getRootPath()
            + "img/pan.cur),default";
          var id= e.object.id;
          $("#img"+id).attr("src","red.png");
          $("#li"+id).css("background","#ffffff");
          hlabelLyr.clear();
        });
        markerLyr.addMarker(marker);
        var label = new OpenLayers.Label(pt,i+1,"item-label");
        labelLyr.add(label);
        /**
         * 列表内容
         */
        var li = $("<li />").attr("id","li"+i).appendTo(ul);
        var title = $("<div />").addClass("item").attr("i",i).data("attr",data[i]);
        var img = $("<img />").attr("id","img"+i).attr("src", "img/red.png")/*.attr("width", "16").attr("height", "18")*/;
        var num = $("<a />").addClass("item-num").html(i+1);
        var name = $("<div />").addClass("item-title").html(data[i].name);
        title.append(img).append(num).append(name);
        var content = $("<a />").addClass("item-content").html(data[i].desc);
        var detail = $("<a />").addClass("item-detail").html("详细>>");
        li.append(title).append(content).append(detail);
        title.on("mouseover",function(){
          var i = $(this).attr("i");
          $("#img"+i).attr("src","img/blue.png");
          var data = $(this).data("attr");
          var hpt = new OpenLayers.LonLat(data.x,data.y);
          var hicon = new OpenLayers.Icon('img/blue.png',size,offset);
          hMarker = new OpenLayers.Marker(hpt,hicon);
          markerLyr.addMarker(hMarker);
          showName(hpt,data.name,"item-label-name");
        });
        title.on("mouseout",function(){
          var i = $(this).attr("i");
          $("#img"+i).attr("src","img/red.png");
          markerLyr.removeMarker(hMarker);
          hlabelLyr.clear();
        });
        title.on("click",function(){
          var data = $(this).data("attr");
          showInfowindow(data.name,data.desc);
        });
      } 

      $(".item-list").draggable({
        handle:'.list-title'
      });
      $("#close").on("click",function(){
        $(".item-list").hide();
      }); 

      function showName(pt,name,classname){
        var label = new OpenLayers.Label(pt,name,classname);
        hlabelLyr.add(label);
      }
      function showInfowindow(title,content){
        $("<div />").window({
          width:200,
          height:80,
          modal:true,
          maximizable:false,
          minimizable:false,
          collapsible:false,
          closable:true,
          title:title,
          content:content
        });
      } 

      function getRandomXY(){
        var json = new Array();
        for(var i=0;i<8;i++){
          var w = bounds.getWidth();
          var h = bounds.getHeight();
          var x = Math.random() * w + bounds.left;
          var y = Math.random() * h + bounds.bottom;
          json.push({
            id:i,
            name:"name"+i,
            desc:"this is the name"+i,
            x:x,
            y:y
          })
        }
        return json;
      }
    });
  </script>
</head>
<body>
<div id="map"></div>
  <div class="item-list">
    <div id="close" class="list-close"></div>
    <div class="list-title">结果列表</div>
    <ul id="items">
    </ul>
  </div>
</body>
</html>

在本实例中,扩展了OpenLayers的图层Labels和对象Label。

以上就是本文全部叙述,希望大家喜欢。

(0)

相关推荐

  • 基于Arcgis for javascript实现百度地图ABCD marker的效果

    先给大家展示实现后效果: 为直观期间,先贴出来我做的效果 列表展示和地图展示以及联动 显示信息 实现思路: 1.列表与地图的互动 鼠标经过列表时,修改列表图标,并根据列表返回的值在地图上绘蓝色的marker:鼠标移出,修改列表图标为红色,清空地图marker图层. 关键代码: title.on("mouseover",function(){ var attr = $(this).data("attr"); $("#icon"+attr.id).c

  • 百度地图给map添加右键菜单(判断是否为marker)

    废话不多说了,直接给大家贴代码了. js: var s;//经度 var w;//纬度 map.addEventListener("rightclick",function(e){ if(e.overlay){//判断右键单击的是否是marker }else{ s = e.point.lng;//经度 w = e.point.lat;//维度 RightClick();//右键单击map出现右键菜单事件 } }); //右键单击map出现右键菜单事件 function RightCli

  • 基于OL2实现百度地图ABCD marker的效果

    本文概述: 上文中提到了在Arcgis for JS中实现百度地图ABCD的marker效果,在本文,讲述如何在OpenLayers2中实现类似的效果. 效果图展示如下: 为直观期间,先将效果贴出来. 联动展示 思路: 1.列表与地图的互动 鼠标经过列表时,修改列表图标,并根据列表返回的值在地图上绘蓝色的marker:鼠标移出,修改列表图标为红色,清空地图marker图层. 关键代码: title.on("mouseover",function(){ var i = $(this).a

  • Android百度地图添加Marker失真问题的解决方案

    Marker失真问题 由于公司项目原因,用了很多次百度地图API,基础的地图定位.显示地图就不多说了,这里主要说一下百度地图添加Marker图标. 最开始接触百度地图添加Marker图标的时候,发现自己设置的图标是多大地图上就显示多大,感觉有点失真,看起来很不舒服,但通过网上搜索,并没有找到解决办法,就没怎么注意图标失真的问题,毕竟是一个小项目,不是面向大众的,最近开发的一个项目同样有这个需求,而且是面向大众开发的,我就想为什么摩拜单车的图标那么清晰,我的图标却失真. 就是这么清晰 通过Reso

  • 百度地图去掉marker覆盖物或者去掉maker的label文字方法

    如下所示: var marker = new BMap.Marker(...); //方法1 map.removeOverlay(marker); //方法2 marker.remove(); //如果是Marker设置的setLabel还可以设置其样式来隐藏 mapComponent.state.bikeMarkLabel.setStyle({ display:"none" }); 41787 label与marker的方法相同. 建议使用方法1和方法2,方法3只是隐藏而不是清除 以

  • 基于Android实现百度地图定位过程详解

    一.问题描述 LBS位置服务是android应用中重要的功能,应用越来越广泛,下面我们逐步学习和实现lbs相关的应用如定位.地图.导航等,首先我们看如何基于百度地图实现定位功能 二.配置环境 1.注册密钥:地址http://developer.baidu.com/map/ 2.下载定位SDK,并导入SDK如图所示: 三.编写MyApplication类 编写MyApplication类,为了使用方便我们可以将实现定位的方法封装的Application组件中 封装下列方法 1.  获取定位信息--

  • 百度地图JavascriptApi Marker平滑移动及车头指向行径方向

    相信只要是使用百度地图做实时定位服务的朋友都会遇到这个问题,在对坐标位置进行覆盖物展示的时候,会出现由于获取坐标数据时间或者两个坐标点相距过远,导致在视觉上看Marker移动就像"僵尸跳"一样,一蹦一蹦的给客户看分分钟鄙视你到不能自已.另外如果用的是有指向性图标ICON的时候,更会引来吐槽~诶诶诶,你这小车车怎么在这个立交桥转弯的时候车头向着后面呢?怎么搞得嘛你!会不会弄啊你! 所以今天参照百度大大提供的路书开源文件实现下自己的需求,记录一下以便提供参考. 一.覆盖物在获取坐标数据的同

  • 基于百度地图api清除指定覆盖物(Overlay)的方法

    最近用百度地图api做项目,需要同时在地图显示marker与Polyline,且Polyline需要根据点击来显示或清除,所以遇到了清除指定覆盖物的问题,各种搜索后未能找到完美的解决方法,通过自己思考,摸索了一方法能解决这个问题,发出来给大家分享.好了,进入正题: 清除覆盖物有两个方法:map.removeOverlay()或者 map.clearOverlays(),clearOverlays()方法一次移除所有的覆盖物,removeOverlay()一次移除一个指定覆盖物,显然,我要一次移除

  • Android 百度地图marker中图片不显示的解决方法(推荐)

    目的: 根据提供的多个经纬度,显示所在地的marker样式,如下: 问题: 1.发现marker中在线加载的图片无法显示出来: 2.获取多个对象后,却只显示出了一个marker: 以下为官网实现方法: 通过查阅百度官网的文档,我们可以知道,地图标注物的实现方法如下: //定义Maker坐标点 LatLng point = new LatLng(39.963175, 116.400244); //构建Marker图标 BitmapDescriptor bitmap = BitmapDescript

  • android实现百度地图自定义弹出窗口功能

    我们使用百度地图的时候,点击地图上的Marker,会弹出一个该地点详细信息的窗口,如下左图所示,有时候,我们希望自己定义这个弹出窗口的内容,或者,干脆用自己的数据来构造这样的弹出窗口,但是,在百度地图最新的Android SDK中,没有方便操作这种弹出窗口的类,虽然有一个PopupOverlay,但是它只支持将弹出内容转化为不多于三个Bitmap,如果这个弹出窗口里想有按钮来响应点击事件,用这个就不能满足要求了,于是,看了一遍百度地图覆盖物的API,我决定用自定义View的方法来实现类似的效果,

  • 基于百度地图实现产品销售的单位位置查看功能设计与实现

    1.描述 本人最近参与基于MVC5+EF6+ Bootstrap3的食品安全监管系统设计.开发.先前感觉百度地图很神秘的样子.高大上的样子,设计.开发过程遇到些问题,经查看园子高手指点.示例摸索实践,终将百度地图嵌入系统.为感谢各位朋友的帮助,今有空,将基于百度地图实现产品销售的单位位置查看功能,分享给大家.不当之处,欢迎指正. 2.产品生产批次查询 查看单位产品生产批次信息,根据产品生产批次查看,产品销售单位情况. 效果图如下: 3.产品销售地图 根据选择的产品生产批次信息,查询统计产品销售到

随机推荐