高亮地图点及属性信息展示优化方案

作者:小阳

1、序言

本文主要是利用了UTFGrid图层快速交互获取地物信息的特点,以SuperMap iClient for JavaScript的开发作为示范。(注:要实现本文所讲述的功能,同时需要SuperMap iServer和SuperMap iClient for JavaScript 7C系列及以上的版本才支持)。

在此之前,我先简要的讲一下什么是UTFGrid:UTFGrid只包含地物的属性信息,可以根据地物的屏幕像素位置在客户端快速获地物的属性信息, 如:实现鼠标悬停或鼠标单击某一地物时,快速获取该地物某些属性信息。UTFGrid可由iServer动态生成,也可以将其预先切成瓦片。详细了解UTFGrid(请参见参见

2、优化思路

1.使用分布式切图切属性瓦片缓存

这里要着重说一下UTFGrid单元格网大小的设置,这个值决定了UTFGrid的效率和精准度,设置的值越小精度越高,但是单元格也会越多,在一定程度上也会影响性能,怎样设置这个参数取决于地物的像素尺寸。首先,这个参数能被瓦片的大小整除,比如UTFGrid的瓦片大小为256x256,那么这个值就应该要被256整除。其次,我们需要参考地物在最小比例尺下的像素尺寸来设置(UTFGrid隐藏的情况下除外),如:在地图的最小比例尺下点符号的像素尺寸大概为8x8的大小,这里可以设置pixcell的值为8x8,在精度允许的情况下,这种情况推荐设置为16x16,因为8x8的单元格比较小,在监听鼠标事件时不易成功。

2.iServer启用属性瓦片缓存

默认发布的地图服务是没有启用 UTFGrid缓存的,需要进入到服务管理页面找到发布的地图服务,然后点击进入到缓存一栏勾选是否启用属性瓦片缓存

iServer默认将UTFGrid瓦片放置在\webapps\iserver\output\sqlite路径下。

如果不启用属性瓦片缓存可以使用UTFGrid吗?答案是肯定的,如果是在大数据量的前提下,建议将UTFGrid预先切成瓦片,下图是各种方式使用UTFGrid的性能对比。

3.编程实现

初始化

var map,layer,vectorLayer,infowin,infowin1,highlightFea,popfeature,
                host = document.location.toString().match(/file:\/\//)?"http://localhost:8090":‘http://‘ + document.location.host,
                url="http://support.supermap.com.cn:8090/iserver/services/map-changchun/rest/maps/长春市区图_Local";
        var controlmove,controlclick,utfgridPark,utfgridSchool;

        function init(){
            map = new SuperMap.Map("map", {controls: [
                new SuperMap.Control.ScaleLine(),
                new SuperMap.Control.Zoom(),
                new SuperMap.Control.LayerSwitcher(),
                new SuperMap.Control.Navigation({
                    dragPanOptions: {
                        enableKinetic: true
                    }
                })],
                projection: "EPSG:0",
                //设置地图的最大范围,这行代码相当重要
                maxExtent:new SuperMap.Bounds(48.4 , -7668.25,8958.85 , -55.58 )
            });
            layer = new SuperMap.Layer.TiledDynamicRESTLayer("China", url, {transparent: false}, {useCanvas: true, maxResolution: "auto",
                scales:[1/2000,1/4000,1/8000,1/16000,1/32000]
            });
            vectorLayer=new SuperMap.Layer.Vector("Vector Layer");
//注意:pixcell与utfgridResolution两个属性有对应关系,在使用的时候也要注意场景;
//1.其中pixcell为发送给服务端请求utfgrid瓦片的精度,数值越小,精度越高,相应的瓦片大小也就越大;
//2.utfgridResolution为客户端解析瓦片使用的精度,应该与pixcell的值相等,否则会产生位置与属性对应不上的问题;
//3.通常如果UTFGrid图层为面图层,对应的数据量会比较大,为了不影响页面的正常浏览,可以将这两个属性设的大一些;
//4.isUseCache设置是否使用缓存,使用缓存能够提高性能;

            utfgridSchool = new SuperMap.Layer.UTFGrid("UTFGridLayerSchool", url,
                    {
                        layerName: "[email protected]",
                        utfTileSize: 256,
                        pixcell: 16,
                        isUseCache: true
                    },
                    {
                        utfgridResolution: 16
                    });
            utfgridSchool.maxExtent=layer.maxExtent;
            utfgridPark = new SuperMap.Layer.UTFGrid("UTFGridLayerPark", url,
                    {
                        layerName: "[email protected]",
                        utfTileSize: 256,
                        pixcell: 16,
                        isUseCache: true
                    },
                    {
                        utfgridResolution: 16
                    });
            utfgridPark.maxExtent=layer.maxExtent;

            //监听move事件控件
            controlmove = new SuperMap.Control.UTFGrid({
                layers: [utfgridPark,utfgridSchool],
                callback: callback,
                handlerMode: "move"
            });
            //监听click事件控件
            controlclick = new SuperMap.Control.UTFGrid({
                layers: [utfgridPark,utfgridSchool],
                callback: callback2,
            });

            layer.events.on({"layerInitialized": addLayer});
            map.addControl(controlmove);
            map.addControl(controlclick);
            map.events.on({"zoomend":reviewUTFgrid});
        }
     function addLayer() {
            var center = new SuperMap.LonLat(4539.98 , -3835.29);
            map.addLayers([layer,vectorLayer,utfgridSchool,utfgridPark,]);
            map.setCenter(center, 0);
            reviewUTFgrid();
        }

高亮点:在这里,我们利用了Control.UTFGrid监听move事件的方式,获取到点的坐标,然后绘制一个feature叠加到该点上实现高亮。如果想实现类似于百度地图每种类型的点都有不同的高亮图标方式,可以在feature的源数据属性表里面加字段来判断。实现效果如下:

        //move事件回调函数
        var callback = function (infoLookup) {
            if(infowin)
            map.removePopup(infowin);
            if(highlightFea)
            vectorLayer.removeFeatures(highlightFea);
            if (infoLookup) {
                var info;
                for (var idx in infoLookup) {
                    info = infoLookup[idx];
                    if (info && info.data) {
                        var dom = "<div style=‘padding: 5px;padding-left:5px;font-size:12px;font-family:Microsoft YaHei;line-height:8px;color: black;background:lightgoldenrodyellow‘>" + info.data.name +"<br></br>"+"点击查看更多..."+ "</div>";
                         //设置x与y的像素偏移量,不影响地图浏览;
                        var xOff = (1 / map.getScale()) * 0.003;
                        var yOff = -(1 / map.getScale()) * 0.003;
                        var pos = new SuperMap.LonLat(new Number(info.data.X)+xOff,new Number(info.data.Y)+yOff);
                        infowin = new SuperMap.Popup("chicken",
                                pos,
                                new SuperMap.Size(0, 0),
                                dom,
                                false, null);
                        //根据弹窗内容自动调整弹窗大小
                        infowin.autoSize=true;
                        //设置默认样式不显示
                        infowin.setBackgroundColor("none");
                        map.addPopup(infowin);
                        highlightFea = new SuperMap.Feature.Vector(new SuperMap.Geometry.Point(info.data.X,info.data.Y),
                                null,
                                {

                                    //绘制矢量点方式
//                                    pointRadius:7,
//                                    fillColor:"#3399FF",
//                                    fillOpacity:0.5,
//                                    strokeColor:"#0033FF",
//                                    strokeWidth:3,
//                                    strokeOpacity:0.2
                                    //引用图片方式
                                    externalGraphic:"image/h12.png",
                                    graphicWidth:15,
                                    graphicHeight:15

                                }
                        );
                        vectorLayer.addFeatures([highlightFea]);
                    }
                }
            }
        };

弹窗展示:利用Control.UTFGrid监听click事件的方式,并结合Popup展示地物的信息,这里的Popup为自定义的CSS样式,因为Popup本身为div,可以任意设计CSS样式。实现效果如下:

 //点击弹窗回调函数
        var callback2=function(infoLookup1)
        {
            if(infowin1)
                map.removePopup(infowin1);
            if(popfeature)
                vectorLayer.removeFeatures(popfeature);
            if (infoLookup1) {
                if (infoLookup1) {
                    var info1;
                    for (var idx1 in infoLookup1) {
                        info1 = infoLookup1[idx1];
                        if (info1 && info1.data) {
                            var dom1 = "<div class=‘pop‘ >" +
                                    "<div class=‘pop_header‘><div class=‘pop_close‘ onclick=‘closeInfoWin1()‘></div></div>" +
                                    "<img src=‘image/park.png‘ style=‘height: auto;width: auto;max-width: 100%;opacity: 1‘>" +
                                    "<div class=‘pop_content‘><p><span>地点:</span><span>" + info1.data.name + "</span></p><p><span>坐标:</span><span>x:" + info1.data.X + "  y:" + info1.data.Y + "</span></p></div>" +
                                    "<div class=‘pop_arrow‘></div>" +
                                    "</div>";
                            var xOff1 = -(1 / map.getScale()) * 0.018;
                            var yOff1 = (1 / map.getScale()) * 0.035;
                            var pos1 = new SuperMap.LonLat(new Number(info1.data.X) + xOff1, new Number(info1.data.Y) + yOff1);
                            infowin1 = new SuperMap.Popup("chicken",
                                    pos1,
                                    new SuperMap.Size(20, 20),
                                    dom1,
                                    false, null);
                            //根据弹窗内容自动调整弹窗大小
                            infowin1.autoSize = true;
                            //设置默认样式不显示
                            infowin1.backgroundColor = "none";
                            //移动地图以确保弹窗显示在窗口内
                            infowin1.panMapIfOutOfView=true;
                            map.addPopup(infowin1);
                            popfeature = new SuperMap.Feature.Vector(new SuperMap.Geometry.Point(info1.data.X, info1.data.Y),
                                    null,
                                    {
                                        externalGraphic: "image/radar.gif",
                                        graphicWidth: 64,
                                        graphicHeight: 64
                                    }
                            );
                            vectorLayer.addFeatures([popfeature]);
                        }
                    }
                }
            }
        };

源码地址http://download.csdn.net/detail/supermapsupport/9503675

时间: 2024-10-07 03:11:32

高亮地图点及属性信息展示优化方案的相关文章

地图点聚合优化方案

一.为什么需要点聚合 在地图上查询结果通常以标记点的形式展现,但是如果标记点较多,不仅会大大增加客户端的渲染时间,让客户端变得很卡,而且会让人产生密集恐惧症(图1).为了解决这一问题,我们需要一种手段能在用户有限的可视区域范围内,利用最小的区域展示出最全面的信息,而又不产生重叠覆盖. 图1 二.已尝试的方案---kmeans 直觉上用聚类算法能较好达成我们目标,因此采用简单的kmeans聚类.根据客户端的请求,我们知道了客户端显示的范围,并到索引引擎里取出在此范围内的数据,并对这些数据进行kme

XMPP个人信息展示

在现阶段的通信服务中.各种标准都有,因此会出现无法实现相互连通,而XMPP(Extensible Message and presence Protocol)协议的出现.实现了整个及时通信服务协议的互通.有了这个协议之后,使用不论什么一个组织或者个人提供的即使通信服务,都可以无障碍的与其它的及时通信服务的用户进行交流.比如google 公司2005年推出的Google talk就是一款基于XMPP协议的即时通信软件.以下我们就谈论一下怎样简单的使用XMPP的好友和个人电子名片 1.在XMPPFr

网站信息展示(html)

网站信息展示 需求-在页面展示一些文字信息,需要排版 技术分析-html:超文本标签语言 htlm 作 用:展示 超文本:超越了一般文本,描述文本的字体.颜色.图片 标 签:标记 html书写规则: 文件的后缀名 .html(建议) 或者 .htm 标签必须用<>起来 已经定义好的标签 属性 格式:key = "value" 建议属性的值用引号引起来. 不区分大小写 注意: 最好将所有的内容放在一个标签中 <html></html> 有开始标签和结束

Web Scraper 高级用法——抓取属性信息 | 简易数据分析 16

这是简易数据分析系列的第 16 篇文章. 这期课程我们讲一个用的较少的 Web Scraper 功能--抓取属性信息. 网页在展示信息的时候,除了我们看到的内容,其实还有很多隐藏的信息.我们拿豆瓣电影250举个例子: 电影图片正常显示的时候是这个样子: 如果网络异常,图片加载失败,就会显示图片的默认文案,这个文案其实就是这个图片的属性信息: 我们查看一下这个结构的 HTML(查看方法可见 CSS 选择器的使用的第一节内容),就会发现图片的默认文案其实就是这个 <img/> 标签的 alt 属性

C#读取shp的属性信息

一个完整的ESRI的shape文件包括一个主文件,一个索引文件,和一个dBASE表文件.主文件是一个直接存取,变记录长度文件,其中每个记录描述一 个由其顶点列表组成的shape.在索引文件中,每条记录是在主文件中对应记录距离主文件头部的偏移量.dBASE中记录的是对应主文件中记录的属性记 录,每条主文件记录对应dBASE中的一条属性记录.几何对象和属性间的一一对应关系是基于记录编号的.在dBASE文件中的属性记录必须和主文件中的记 录保持相同的顺序.如果只需要处理dBASE文件,可以用操作数据库

定义通用的可通过lambda表达式树来获取属性信息

我们一般获取某个类型或对象的属性信息均采用以下几种方法: 一.通过类型来获取属性信息 var p= typeof(People).GetProperty("Age");//获取指定属性 var ps = typeof(People).GetProperties();//获取类型的所有属性 二.通过实例来获取属性信息 People people = new People(); var pro = people.GetType().GetProperty("Age");

JavaScript实现联想校招员工信息展示

原文摘自我的前端博客,欢迎大家来访问 http://www.hacke2.cn 起因 今天和豪哥聊天,才知道他是我老乡,而且特别近..真的感觉他是我的贵人,这是他从 联想校招扣出来的,我们就用JavaScript来实现吧 联想校招员工信息展示点击弹出详细信息 过程 给的有HTML还有CSS3,我打算先用前端模板技术讲信息都出来,之前数据是写死在HTML 数据封装在data.js里 var data = []; data.push({ 'name' : 'Dillon', 'enname' : '

2017-3-8 学生信息展示习题

(满分100分,少一个功能或限制扣5分,少一项大功能扣20分) 题目要求:(请仔细阅读需求,并严格按照需求编写程序) 连续输入5个学生的信息,每个学生都有以下4个内容: 1.学号 - 自动生成,不需要手动填写,第一个学生为"S001"第二个为"S002"依次类推2.姓名 - 不能为空,输入正确方可继续,否则需要用户一直填写3.生日 - 不能为空,需要验证时间格式是否正确,如果错误则一直填写4.成绩 - 不能为空,0~100之间的数,需要有小数位数 注意:以上内容必须

[C#] 常用工具类——应用程序属性信息访问类

using System; using System.Collections.Generic; using System.Text; using System.Reflection; namespace Utils { /// <summary> /// <para> </para> /// 常用工具类——应用程序属性信息访问类 /// <para> -------------------------------------------</para&g