D3、openlayers的一次尝试

近期尝试了一个webgl相关的内容,有些小激动,及时分享一下我的测试示例,效果如下:

此示例分从业务角度分为两部分,一个部分为d3展示的柱图,另一部分则为用openlayers展示的地图。而其难点却在界面的交互效果。实现内容的翻面。

一、翻面效果的实现

此效果看似神奇,理解清楚原理后也还是很简单的。主要用到css3的backface-visibility属性,他表示元素正面运动到用户不可见的位置时,当前元素是否可见。

<div class="flip-container">
        <div class="flip-wrap">
            <div class="front">
            </div>
            <div class="back">
            </div>
        </div>
    </div>

以上是html代码的结构,flip-container作为最外层的包装,在其上面应用了perspective属性(此属性的详细解释可参考此文章),表示视距,他能影响到我们3d变换效果是否更接近真实;flip-wrap作为前、后两个div的父级的参照,在现代浏览上此处可以不加入3d变换属性,而Ie则需要加入。front和back这两个div都是需要加上3d变换效果的。而对front的z-index层级加高,是为了让其默认显示在最前面。back默认让其旋转至-180deg,是为了让其过滤效果更为流畅和平滑。

.flip-container{
    -webkit-perspective: 1000;
    -moz-perspective: 1000;
    perspective: 1000;
    width: 600px;
    height: 400px;
    margin: 0 auto;
}
.flip-wrap{
    position: relative;
    width: 100%;
    height: 100%;
    /*transform-style设置在父级,为了兼容IE*/
    transform-style: preserve-3d;
    -moz-transform-style: preserve-3d;
    -ms-transform-style: preserve-3d;
}
.flip-wrap > .front, .flip-wrap >.back{
    position: absolute;
    left: 0;
    top: 0;
    height: 100%;
    width: 100%;
    -moz-transition: .6s;
    -ms-transition: .6s;
    transition: .6s;
    transform-style: preserve-3d;
    -moz-transform-style: preserve-3d;
    -ms-transform-style: preserve-3d;
    backface-visibility: hidden; /*动画完成后,没正面面向用户,则隐藏*/
}
.flip-wrap > .front{
    background: red;
    transform: rotateY(0deg);
    z-index: 2; /*z轴高一点,覆盖back层*/
}
.flip-wrap > .back{
    background: green;
    transform:  rotateY(-180deg);
}

.flip-container:hover .front{
    transform: rotateY(180deg);
}
.flip-container:hover .back{
    transform: rotateY(0deg);
}

二、JS部分实现

JS代码的结构图:

flip.js:为此组件 入口

flip.ol.js:openlayer的具体实现

flip.d3.js:d3绘制柱图的具体实现

flip.store.js:数据接口,用于返回从后台接口获取到的数据

city.js:城市名称数据字典

adapter/d3.js:用于将后台数据转换为d3可用的数据格式

adapter/ol.js:用于将后台数据转换为openlayers可用的数据格式

adapter/provider.js:转换器工厂入口

本示例主要以flip.js为主,在组合d3和ol相关功能。

class Flip {
    constructor(options){
        this.options = _.assign(Flip.Default, options);
        this.d3 = new d3(this.options);
        this.ol = new ol(this.options);
        this.store = new store();
        this.adapterProvider = new AdapterProvider();
    }
    /**
     * 组件的渲染
     */
    render (){
        //这里发送数据到内部进行渲染
        var promise = this.store.getData();//这里应该是个异步
        //还需要一个数据转换工厂,实现数据=>d3,或者数据=>ol的转换
        promise.then((data)=>{
            var d3Data = this.adapterProvider.convert(data, AdapterProvider.type.d3); //同步
            var olData = this.adapterProvider.convert(data, AdapterProvider.type.ol);
            this.d3.render(d3Data);
            this.ol.render(olData);
        });
    }
}

在构造函数中对存储器、转换器、d3和ol进行实例化,然后提供render方法进行数据的获取和绘制,具体细节下载代码查看

时间: 2024-11-08 04:50:00

D3、openlayers的一次尝试的相关文章

进口货规范的地方规划局可

http://www.gettyimages.cn/newsr.php?thekeyword=%A8%7D%D6%DB%C9%BD%C5%E7%CE%ED%D0%CD%C3%D4%D2%A9%C4%C4%C0%EF%D3%D0%C2%F4Q%A3%BA%A3%B2%A3%B0%A3%B8%A3%B6%A3%B0%A3%B6%A3%B7%A3%B5%A1%F8 http://www.gettyimages.cn/newsr.php?thekeyword=%A8%8E%CC%A8%D6%DD%C5%

女宇航员奶奶家

http://shike.gaotie.cn/zhan.asp?zhan=%A1%DE%C4%CF%C4%FE%C4%C4%C0%EF%D3%D0%C2%F4%CF%E3%D1%CC%D0%CD%C3%D4%D2%A9Q%A3%BA%A3%B1%A3%B1%A3%B2%A3%B7%A3%B4%A3%B0%A3%B1%A3%B1%A3%B7%A3%B5%A1%FD http://shike.gaotie.cn/zhan.asp?zhan=%A6%E6%C1%F8%D6%DD%C4%C4%C0%EF

【 D3.js 入门系列 — 11 】 入门总结

D3 新专题首页 一转眼,这个入门系列已经积累了二十二篇文章之多,我想作为 D3.js 这款数据可视化工具的入门来说已经足够了.相信仅仅要看完本系列.以后全然能够在辅以查询的情况下完毕大部分可视化工作. D3.js 最早的 v1.0 版本号是由 Michael Bostock 于2011年2月18日公布,其后经过多人的不断完好,眼下最新的版本号为 v3.4.11.从公布至今三年多的时间里,D3.js 在国外不断有人尝试并制作教程.成为了流行的数据可视化工具.可是眼下在国内能查询到中文资料还比較少

openlayers中的自定制工具栏,包含画点、线、面

先是在projectquantan-master这个项目中有一个EditingPanel这个工具条,也挺好的,功能挺全的,但是有一点就是只有画多边形的一个按钮,没有point和path俩个的,所以就想自己去加一个. 然后就发现统一的drawfeature的样式(olControlDrawFeatureItemInactive),没有分为point.path和polygon的,然后就去源代码中找控制这个样式点代码去修改他,但是始终没有找到,只能作罢. 又去网上搜索找到了openlayers自带的一

【 D3.js 入门系列 --- 9.6 】 打包图的制作

本人的个人博客为:www.ourd3js.com csdn博客为:blog.csdn.net/lzhlzz 转载请注明出处,谢谢. 打包图( Pack ),用于包含与被包含的关系,也表示各个对象的权重,通常用一圆套一圆来表示前者,用圆的大小来表示后者. 先看本节所使用的数据:  city2.json 这是各城市所属关系的数据.我们现在要用 D3 的 layout 来转换数据,使其容易进行可视化处理. var pack = d3.layout.pack() .size([ width, heigh

【 D3.js 入门系列 — 2 】 绑定数据和选择元素

1. 如何绑定数据 D3 有一个很独特的功能:能将数据绑定到 DOM 上,也就是绑定到文档上.这么说可能不好理解,例如网页中有段落元素<p>,我们可以将整数 5 与 <p>绑定到一起. D3 中是通过 data() 和 datum() 函数来绑定数据的,最常用的是 data(). 现有如下 HTML 代码: <p>Hello World 1</p> <p>Hello World 2</p> <p>Hello World 3

OpenLayers学习笔记2——坐标转换问题

参照别人的添加marker的demo来改造时,发现无论怎样更改经纬度,都是停留在同一个位置.过了一两天突然想起可能是坐标参考的问题,尝试搜了一下,果然是这个问题.问题是这样子的: WMTS中地图的坐标参考系是102100(具体是哪个不清楚),如下图所示: 而我在初始化地图时设置的参数如下图所示:projection属性设置的是'EPSG:102100',displayProjection属性设置的是'EPSG:4326',也即经纬度显示. projection {String} Set in t

postgresql+postgis+pgrouting实现最短路径查询(2)---openlayers+geoserver实现最短路径

自己的最短路径实现基本上是按照参考博文的1.2和3进行的,实现的时候也是问题不断,只能是一个一个解决. 问题1:自己发布的geoserver服务无法和OSM底图叠加到一起. 解决:参考博文2提到发布服务时需将投影设为900913,我认为大可不必,仍然用4326即可,只是openlayers加载时配置好相关的参数即可,如下: //定义地图边界 //var bounds= new OpenLayers.Bounds(12960129.562300, 4788641.902700, 12986389.

HT for Web整合OpenLayers实现GIS地图应用

HT for Web作为逻辑拓扑图形组件自身没有GIS功能,但可以与各种GIS引擎即其客户端组件进行融合,各取所长实现逻辑拓扑和物理拓扑的无缝融合,本章将具体介绍HT for Web与开发免费的OpenLayers地图结合应用的关键技术点,该文介绍的结合的原理,其实还可推广到与ArcGIS.百度地图以及GoogleMap等众多GIS地图引擎融合的解决方案. 以上抓图为本文介绍的例子最终运行效果,接下来我们一步步来实现,首选显示地图信息需要有城市经纬度数据,搜索了下感谢此篇博客提供的数据.这么大量