[原创.数据可视化系列之三]使用Ol3加载大量点数据

不管是百度地图还是高德地图,都很难得见到在地图上加载大量点要素,比如同屏1000的,因为这样客户端性能会很低,尤其是IE系列的浏览器,简直是卡的要死。但有的时候,还真的需要,比如,我要加载全球的AQI的测站和数据,这些站点在全球有4000多个,如何加载这些点并提高,OL3的ImageVector是一个很好地选择,简单的说,就是把这些要素渲染到一张图上,这样提高性能。代码如下:

//加载JSON数据
    mainxiu.loaddata=function(options)
    {
        var that=this;
        var styleCache = {};
        var colors=[‘rgba(0, 153, 102, 0.99)‘,
        ‘rgba(255, 222, 51, 0.99)‘,
        ‘rgba(255, 153, 51, 0.99)‘,
        ‘rgba(204, 0, 51, 0.99)‘,
        ‘rgba(102, 0, 51, 0.99)‘,
        ‘rgba(126, 0, 35, 0.99)‘];
        var createStyle = function(feature, resolution) {

var colorkey=0;
            var reskey=2;

var dataval= parseFloat(feature.data.aqi);
            if(dataval>=0 && dataval<=50)
            {
                colorkey=0;
            }else if(dataval>50 && dataval<=100)
            {
                colorkey=1;
            }
            else if(dataval>100 && dataval<=150)
            {
                colorkey=2;
            }
            else if(dataval>150 && dataval<=200 )
            {
                colorkey=3;
            }
             else if(dataval>200 && dataval<=300 )
            {
                colorkey=4;
            }
            else
            {
                colorkey=5;
            }

if(resolution<4)
            {
                reskey=16;
            }else  if(resolution<19)
            {
                 reskey=12;
            }
           else  if(resolution<76)
            {
                 reskey=8;
            }
            else  if(resolution<305)
            {
                 reskey=6;
            }
            else
            {
               reskey=3;
            }
           var style = styleCache[colorkey+"-"+reskey];
            if (!style) {

style = [new ol.style.Style({
                image: new ol.style.Circle({
                  radius: reskey,
                  fill: new ol.style.Fill({
                    color: colors[colorkey],
                  })
                })

})];
              styleCache[colorkey+"-"+reskey]=style;
            }

return style;
        };

$.getJSON(options.url, function(result) {

var tmpLayer = that.getLayerById(options.id);

if (tmpLayer == null)
            {
                tmpLayer = new ol.layer.Image({
                    id: options.id,
                    opacity: 0.95,
                    maxzoom: 1224,
                    minzoom: 0.0001
                });
                that.olmap.addLayer(tmpLayer);
            }

var features=[];
        $(result).each(function(i, val) {

geom = new ol.geom.Point(ol.proj.transform([ parseFloat(val.g[1]), parseFloat(val.g[0]) ], ‘EPSG:4326‘, ‘EPSG:3857‘));

feature = new ol.Feature(geom);
        features.push(feature);

feature.data = val;

});

// Source and vector layer
        var vectorSource = new ol.source.Vector({
        features : features
        });

  var vimage= new ol.source.ImageVector({
                source:vectorSource,
            });

            vimage.setStyle(createStyle);

tmpLayer.setSource(null);
            tmpLayer.setSource(vimage);

that.setLayerVisible(options.id, true);

});
    };

大家可以不使用ImageVector进行显示对比一下性能:

使用ImageVector的方式,极大地提高了性能。另外如果是arcgis的话,使用WMS发布或许是一个更好的选择。因为grahpic加载这样的数据,性能确实是一个问题。

时间: 2024-12-13 21:16:40

[原创.数据可视化系列之三]使用Ol3加载大量点数据的相关文章

[WP8.1UI控件编程]Windows Phone大数据量网络图片列表的异步加载和内存优化

11.2.4 大数据量网络图片列表的异步加载和内存优化 虚拟化技术可以让Windows Phone上的大数据量列表不必担心会一次性加载所有的数据,保证了UI的流程性.对于虚拟化的技术,我们不仅仅只是依赖其来给列表加载数据,还可以利用虚拟化的特性去做更多的事情.虚拟化技术有一个很重要的特性就是,它可以准确地判断出哪些列表项处于手机屏幕中,可以动态地去更新这些数据.基于这样的特性,我们可以给列表的功能做更多的优化. 那么下面我们基于一个例子来讲解利用虚拟化技术去做列表的性能优化.有这么一个需求,需要

如何实现Echart不刷新页面,多语言切换下的地图数据重新加载,api请求数据加载,soketed数据实时加载

可视化项目中经常用到ecahrt,各种异步加载,连接socket,多语言切换等问题,现在汇总一下: Ecahrt初始化,全局统一init,可以初始化为0,等待后续数据操作 1.如果是api重新请求,数据手动获取这种方式,直接setOption; 2. 如果是socket实时数据传输展示,直接setOption,但是有tab切换等引起找不到dom的宽高,可以监听切换的事件,在正确的index下resize(); 3. 如果是地图数据,第一次也是手动加载: import i18n from '@/a

Hive和Impala加载和存储数据功能曝光

Hive与Impala都是构建在Hadoop之上的数据查询工具,那么在实际的应用中,它们是如何加载和存储数据的呢? Hive和Impala存储和加载表,和所有的关系型数据库一样,有自己的数据管理结构,从它的Server到Database再到表和视图. 在其他的数据库中,表都是以自己特定的文件格式来存储的,比如Oracle有自己的存储格式,而对Hive而言,一个表就是包含一个或多个文件的HDFS目录,这个文件是属于表下面的内容,默认存储路径:/user/hive/warehouse/<table_

解决jeecg3.5中由于easyui的原因会加载两次数据的问题

在解决完jeecgt3.5中的这个问题:jeecg3.5中实现从一个页面跳转到另一个页面 后,发现数据会被加载两次,在网上找了半天也没找到原因,最后发现是由于调用datagrid方法太快引起的,解决方法为使用setTimeout延迟执行datagrid方法,具体如下: $(function() { //延迟200毫秒执行,否则easyui会加载两次数据 setTimeout(init, 200); }); function init() { //alert($('#jeecgDemoList')

JavaSE GUI显示列表 JTable的刷新 重新加载新的数据

JTable在显示所有数据之后,假如需要搜索某个名字,则会获取新的列表数据. 假设datas是JTable的数据,定义为: private Vector<Vector> datas = new Vector<Vector>(); 当你刷新数据的时候,应该这样: if (datas != null) { datas.clear(); Vector<Vector> vectors = getDatasFromList(studentList); datas.addAll(v

使用getJSON()方法异步加载JSON格式数据

使用getJSON()方法异步加载JSON格式数据 使用getJSON()方法可以通过Ajax异步请求的方式,获取服务器中的数组,并对获取的数据进行解析,显示在页面中,它的调用格式为: jQuery.getJSON(url,[data],[callback])或$.getJSON(url,[data],[callback]) 其中,url参数为请求加载json格式文件的服务器地址,可选项data参数为请求时发送的数据,callback参数为数据请求成功后,执行的回调函数. 1 <!DOCTYPE

使用Sencha Touch加载本地Json数据

本例没有采用Sencha的mvc模式.只是一个简单的读取加载本地Json数据示例. 文档结构如下: app.js代码如下: Ext.require(['Ext.form.Panel', 'Ext.data.Store', 'Ext.data.reader.Json', 'Ext.dataview.DataView']); Ext.application({ name:'MyApp', icon:'images/icon.png', glossOnIcon:false, phoneStarupSc

Jquery easyUI datagrid加载复杂JSON数据方法

1.JSON数据为: { "rows": [ { "itemNo": "1", "itemName": "12", "spec": "", "pattern": "", "itemCategory": { "id": "A01", "name": &

ionic上拉加载更多当数据加载完没有下一页的时候我们需要显示一下&quot;没有更多了&quot;的友好提示

ionic上拉加载更多当数据加载完没有下一页的时候我们需要显示一下"没有更多了"的友好提示,但是在ionic里面遇到了一个问题.就是没有数据的时候我显示了没有更多的时候我的点击商品详情的事件失效了.怎么点都不触发 这到底怎么回事.简直是....遇到了各种奇葩问题.好了先不吐槽了.还是先解决问题吧. 我们看代码的时候很容易从因为这句话而出发.最开始的时候我是上拉第一页的时候.点击事件还有效.也就是上拉到最后一页点击事件才会失效.也就是isNext为false的时候.这时候我就会以为是ng