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


    概述:

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


    效果:

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


    效果图1


    联动展示

    思路:

    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%;
                100%;
                overflow: hidden;
                font-size: 12.5px;
                font-family:"宋体"
            }
            .item-list{
                position: absolute;
                top:100px;
                left: 20px;
                z-index: 999;
                border: 1px solid #ccc;
                 200px;
                background: #fff;
            }
            .list-close{
                background: url("img/panel_tools.png");
                 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({
                        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,代码不便在此公开,还望见谅,有需要的可通过下面的方式联系到我。





  • 相关阅读:
    003_当表中字段不能为空,但却没有赋值时?
    019_SSM——mybatis的#{id}可以根据是对象参数调用setId()的原码?
    002_com.wkcto自动添加错误
    018_SSM——Spring框架的byName与ByType实现自动注入的原码是什么呢?
    as3 文档类引用
    as3 连接mysql
    as2 针对加载进来的swf操作
    as3 arguments.callee与... (rest)
    as3 string split方法一些注意
    as3 Function 中的call与apply方法
  • 原文地址:https://www.cnblogs.com/lzugis/p/6539808.html
Copyright © 2020-2023  润新知