HTML5数据可视化第四弹:交互式地铁线路图

前言

 

最近特别忙,承蒙大伙关照,3D机房的项目一个接着一个,领了一帮小弟,搞搞传帮带……有个小弟很不错,勤奋好学,很快就把API都摸透了,自己折腾着做了个HTML5的魔都的地铁线路图,能拖能拽的,还和电子地图做了交互。哥决定把小弟的成果给大家展示一下。

 

效果图对比

 

网上的地铁图还是很多的,小弟选了这张比较新的做参考。想当年哥来魔都打拼时,图上可就一红一绿打个叉……暴露年龄的话不多说,看图:

再来看看小弟做的:

 

我是一眼看不出区别,但这可不是一张效果图,而是一个新手仅用了几天做出来的东西,而且里面许多美化和调整是通过程序自动完成的,这就不容易了。更重要的是,它并不是一张死图,而是纯矢量、可交互、有动态效果、无失真缩放的拓扑图!我们先简单看一下交互效果,后面可以详细说说代码的实现。

 

文本提示弹弹弹

 

首先,把鼠标移到站点、路段、图标等位置,都会有文本提示弹出,这个比较基本,百度家的就有,小弟也就放了比较简单的弹出内容。如果加上基本介绍啊、相关提示啊、周边信息啊……要是加上广告,就可以赚钱了……反正什么都可以加嘛,就是一个setToolTip命令而已。

 

 

站点图标变变变

 

当鼠标移到站点上时,站点图标做了放大效果,这个效果很贴心,看了下百度家,用的是发光效果。

 

 

实现的方法也很简便,就是在注册站点矢量图形时,加入了动态判断。以下注册普通站点矢量图形的代码:

 

twaver.Util.registerImage('station',{
    w: linkWidth*1.6,
    h: linkWidth*1.6,
    v: function (data, view) {
        var result = [];
        if(data.getClient('focus')){
            result.push({
                shape: 'circle',
                r: linkWidth*0.7,
                lineColor:  data.getClient('lineColor'),
                lineWidth: linkWidth*0.2,
                fill: 'white',
            });
            result.push({
                shape: 'circle',
                r: linkWidth*0.2,
                fill:  data.getClient('lineColor'),
            });
        }else{
            result.push({
                shape: 'circle',
                r: linkWidth*0.6,
                lineColor: data.getClient('lineColor'),
                lineWidth: linkWidth*0.2,
                fill: 'white',
            });
        }
        return result;
    }
});

 

动画效果拽拽拽

 

从上图还可以看到,在换乘站图标中,除了增加了颜色,还实现了旋转效果。这个就秒杀百度家了。 来看代码:

 

twaver.Util.registerImage('rotateArrow', {
    w: 124,
    h: 124,
    v: [{
        shape: 'vector',
        name: 'doubleArrow',
        rotate: 360,
        animate: [{
            attr: 'rotate',
            to: 0,
            dur: 2000,
            reverse: false,
            repeat: Number.POSITIVE_INFINITY
        }]
    }]
});

 

当然这对于TWaver来说也很容易,只不过对rotate属性进行了动态改变而已。 另外,在单击和双击站点时,还实现了selected和loading的动画效果,值得点赞!

 

 

 

混合缩放炫炫炫

 

无失真缩放是矢量图的先天优势,小弟也掌握得炉火纯青,把TWaver的混合缩放模式用到极致,还有缩放比例控制、文字自动隐藏等小功能,方便订制。

 

 

代码也不复杂:

 

network.setZoomManager(new twaver.vector.MixedZoomManager(network));
network.setMinZoom(0.2);
network.setMaxZoom(3);
network.setZoomVisibilityThresholds({
    label : 0.6,
});

 

交互功能用起来

 

小弟很自豪地给我介绍这个功能:图标可以自由拖动,松开后会自动弹回。哥问小弟这有什么用,他一本正经地说:证明图是活的!

 

 

 

好吧你赢了,虽然是个没什么卵用的功能,但闲的蛋疼的时候可以随便玩上几十分钟我也是信的。

 

连续单击同一站点

 

连续单击同一站点(注意不是双击),可以将经过此站点的所有线路突出显示出来。小弟说加入这个功能纯粹因为简单易做,我……竟然表示非常理解,谁年轻时没耍过这类轻松又讨好的小招数呢?

 

 

 

双击站点

 

双击站点,竟然弹出了本站周边的电子地图!知道引入他山之玉,看来小子可教啊。我发现他的定位方法,有的是用经纬度,有的是关键词查询。小弟狡黠地说,开始是人工查每个站点经纬度的,干了一段儿发现太麻烦,后来改路子了。马大大说的,懒人改变世界,我服!

 

 

 

最后来八一八程序设计的思路吧,小弟是棵好苗子,能做出那么像样的程序,必然是深思熟虑过的。不想再听我啰嗦的朋友,也可以直接发邮件给我,tw-service@servasoft.com,来鉴赏下小弟的成果。

 

数据文件的整理

 

数据格式,选择了JavaScript原生支持的json文件,直观方便。 数据结构,按照站点、线路、杂项三大块来组织,结构清晰,利于遍历、查询等操作。

 

{
    "stations":{
        "l01s01":{ },
        …………
    }
    "lines":{
        "l01":{……},
        …………
    }
    "sundrys":{
        "railwaystationshanghai":{……},
        …………
    }
}

 

命名比较规范,通过名字就可以看出基本信息(例如“l01s01”就是1号线第1个站点),甚至直接利用名字就可以进行查询和遍历。

 

    "l01s01":{
        "id":"l01s01",
        "name":"莘庄",
        "loc":{"x":419,"y":1330},
        "label":"bottomright.bottomright",
    },
    …………

 

 

站点路线的创建

 

首先是读取json文件的数据。

 

   function loadJSON(path,callback){
        var xhr = new XMLHttpRequest();
        xhr.onreadystatechange = function(){
            if (xhr.readyState === 4) {
                if (xhr.status === 200) {
                   dataJson = JSON.parse(xhr.responseText);
                   callback && callback();
               }
           }
       };
       xhr.open("GET", path, true);
       xhr.send();
    }

 

 

因为读取文件是一个异步的过程,所以要程序的展开都要放在文件读取函数的内部。

 

    function init(){
        loadJSON("shanghaiMetro.json", function(){
            initNetwork(dataJson);
            initNode(dataJson);
        });
    }

 

 只要通过对站点进行一次遍历,车站的建立就完成了。

 

    for(staId in json.stations){
        var station = json.stations[staId];
        staNode = new twaver.Node({
            id: staId,
            name: station.name,
            image:'station',
        });
        staNode.s('label.color','rgba(99,99,99,1)');
        staNode.s('label.font','12px 微软雅黑');
        staNode.s('label.position',station.label);
        staNode.setClient('location',station.loc);
        box.add(staNode);
    }

 

再对数据文件中的各条线路下的所有站点进行遍历,在站点间依次创建Link。

 

    for(lineId in json.lines) {
        ……
        for(staSn in line.stations) {
            ……
            var link = new twaver.Link(linkId,prevSta,staNode);
            link.s('link.color', line.color);
            link.s('link.width', linkWidth);
            link.setToolTip(line.name);
            box.add(link);
        }
    }

 

再对label位置进行调整,否则站点名称会显示的很乱。小弟是通过在原始数据中手动加入位置信息来实现的,稍显笨了一点,应该可以通过程序自动判断站点周围空间来进行智能调整。 最后再加入图标,一张原始的地铁图就呈现出来了。

 

 

 

路线拐点的添加

 

基本的示意功能已经具备了,这里,小弟让我很欣赏的一点是没有就此停止,而是进一步做了调整,使线路只保留了横平竖直和正斜的走向,以达到整齐美观的效果。可能看起来与参考图稍稍有些不同,主要因为各路段基本只添加了一个拐点,这样做既大大简化了程序,又基本保证了图形的美观度。想远一点,做多一点,是块做产品的好料子。

 

 

当然为了提高程序的灵活性,应对必须添加两个或以上拐点的情况,也使用了人工拐点的手段。不过这里人工拐点被设成一个隐形的节点,可能利于智能拐点的判断,但也有可能在路线操作时造成混乱。如何处理更好还可以进一步推敲。

 

var createTurnSta = function(line, staSn){
    staTurn = new twaver.Node(staSn);
    staTurn.setImage();
    staTurn.setClient('lineColor',line.color);
    staTurn.setClient('lines',[line.id]);
    var loc = line.stations[staSn];
    staTurn.setClient('location',loc);
    box.add(staTurn);
    return staTurn;
}

 

接点位置的调整

 

大家可以看到,并不是所有路段都直接连入站点中心,在许多情况下必须要进行偏移。

 

var createFollowSta = function(json, line, staNode, staId){
    staFollow = new twaver.Follower(staId);
    staFollow.setImage();
    staFollow.setClient('lineColor',line.color);
    staFollow.setClient('lines',[line.id]);
    staFollow.setHost(staNode);
    var az = azimuth[staId.substr(6,2)];
    var loc0 = json.stations[staId.substr(0,6)].loc;
    var loc = {x:loc0.x+az.x, y:loc0.y+az.y};
    staFollow.setClient('location',loc);
    box.add(staFollow);
    return staFollow;
}

 

 

小弟采取了虚拟节点的办法,就是在站点的旁边,添加一个Follower(但并不显示出来),让并行的不同线路连接到不同的Follower上。通过调整Follower的位置,来实现线路与站点连接点的控制。

 

var azimuth = {
    bb: {x: 0, y: linkWidth*zoom/2},
    tt: {x: 0, y: -linkWidth*zoom/2},
    rr: {x: linkWidth*zoom/2, y: 0},
    ll: {x: -linkWidth/2, y: 0},
    br: {x: linkWidth*zoom*0.7/2, y: linkWidth*zoom*0.7/2},
    bl: {x: -linkWidth*zoom*0.7/2, y: linkWidth*zoom*0.7/2},
    tr: {x: linkWidth*zoom*0.7/2, y: -linkWidth*zoom*0.7/2},
    tl: {x: -linkWidth*zoom*0.7/2, y: -linkWidth*zoom*0.7/2},
    BB: {x: 0, y: linkWidth*zoom},
    TT: {x: 0, y: -linkWidth*zoom},
    RR: {x: linkWidth*zoom, y: 0},
    LL: {x: -linkWidth, y: 0},
    BR: {x: linkWidth*zoom*0.7, y: linkWidth*zoom*0.7},
    BL: {x: -linkWidth*zoom*0.7, y: linkWidth*zoom*0.7},
    TR: {x: linkWidth*zoom*0.7, y: -linkWidth*zoom*0.7},
    TL: {x: -linkWidth*zoom*0.7, y: -linkWidth*zoom*0.7}
};

 

介绍到这里就结束了,虽然是个小例子,但美观性和实用性都还过得去,小弟花了心思去做,其实稍加改造就可以做出高铁图、公交图、运行图等应用。设想一下,如果能用在轨道交通列控中心大屏监控里,是多么炫酷。说到这,又想起了前段时间云栖大会上刚看到的杭州城市数据大脑,不知何时,哥也能参与一把那样的项目呢?可视化,哥的强项…… 最后,想要看程序,或者想玩“地铁拖拖乐”的各位,都可以给我留言和发邮件:tw-service@servasoft.com。

html代码实现全国地图分布,html5 svg浙江地图map省市地区代码 特效描述:html5svg浙江地图 map省市地区代码。html5基于svg绘制中国浙江地图,点击map地图省市区进入浙江地区城市,如果需要还有全国地图以及其他省市地图。可联系我。代码结构1. 引入JS2. HTML代码/>/>舟山市宁波市嘉兴市湖州市杭州市衢州市丽水市金华市绍兴市台州市温州市var classObj=[{name:"zhoushan",zipcode:"330901"... 阅读详情

相关推荐

基于地铁图设计理念的JavaScript关系图自动布局与绘制实战

在数据可视化与前端开发中,清晰展示复杂系统架构、网络拓扑或业务流程关系是常见需求。传统力导向图虽然能表达连接,但往往布局混乱,可读性差。地铁线路图的设计哲学——‘拓扑重于地理’,通过正交布线、站点对齐和色彩标识,将复杂关系抽象为清晰、规则的视觉图表,为此类需求提供了绝佳范式。其技术价值在于将美学原则转化为可计算的布局约束,结合自动化的力导向模拟与网格对齐算法,实现从数据到规整图形的自动生成。本文深入探讨了如何运用Konva.js与自定义布局算法,构建一个能够自动生成类似地铁图的‘横平竖直’关系图工具,并详细

weixin_29013129的博客 293

HTML5,不只是看上去很美(第四弹:可交互地铁线路图)

用TWaver HTML5制作的上海地铁图,一个简单实用的小应用,具有纯矢量、可交互、有动态效果、无失真缩放等特点。可以方便扩展各种实用功能,也可以稍加改造应用于高铁、公交等类似图形展示。

TWaver可视化 1万+

实战 | 用D3.js打造动态交互式力导向关系图

本文详细介绍了如何使用D3.js创建动态交互式力导向关系图,涵盖从基础搭建到高级功能的实现。通过模拟物理世界的引力和斥力,D3.js力导向图能清晰展示复杂关系网络,如社交网络或组织架构,并支持拖拽交互、动态高亮等实用功能,是数据可视化的强大工具。

weixin_29218963的博客 323

HTML绘制交互图,基于 HTML5 Canvas 的交互式地铁线路图

原标题:基于 HTML5 Canvas 的交互式地铁线路图作者:xhload3dmy.oschina.net/xhload3d/blog/1629064摘要:感觉目前地铁上的地铁线路图也不是很人性化,很多交互方面没有考虑到用户的需求?感觉总是有各种容易看串的信息,利用 html5 canvas 完成的这个交互式地铁线路图 Demo,如果地铁上的展示信息稍微有点交互会怎么样?不用忙着上车下车,轻轻一...

weixin_42185419的博客 1719

js点击绘制地铁线路图地铁站(可自定义颜色)百度map_subway line

可支持h5、web端js绘制百度地铁线路图

hdu 1195 Open the Lock(bbfs(双向广搜))

<br />第一次使用双向广搜算法求解,感觉效率的确提高了不止两倍。刚开始的一直WA,后来发现是每次都要扩展一层的节点,然后在扩展另一层的节点,而不是每次只扩展一个节点。<br /> /* Author: ACb0y Date: 2010-9-21 Type: bbfs(双向广搜) ProblemId: hdu 1195 Open the Lock Result: AC */ #include <iostream> #include <queue> using namespace

个人独立博客http://www.acb0y.cn/ 1526

java界面绘制地铁路线_基于 HTML5 Canvas实现 的交互式地铁线路图

前言前两天在 echarts 上寻找灵感的时候,看到了很多有关地图类似的例子,地图定位等等,但是好像就是没有地铁线路图,就自己花了一些时间捣鼓出来了这个交互式地铁线路图的 Demo,地铁线路上的点是在网上随便下载了一个,这篇文章记录自己的一些收获(毕竟我还是个菜鸟)以及代码的实现,希望能够帮到一些朋友。当然,如果有什么意见的可以直接跟我说,大家一起交流才会进步。效果图地图稍微内容有点多,要全部展示...

weixin_39624774的博客 445

EGO_Plannerv2代码学习(一):栅格建图之V1 V2的区别

最近在尝试将高飞老师的集群规划器部署到真实无人机上跑一下,开这个新帖记录下学习过程中的问题和想法。

qq_41069236的博客 5749

java界面绘制地铁路线_基于 HTML5 Canvas 的交互式地铁线路图

前言前两天在 echarts 上寻找灵感的时候,看到了很多有关地图类似的例子,地图定位等等,但是好像就是没有地铁线路图,就自己花了一些时间捣鼓出来了这个交互式地铁线路图的 Demo,地铁线路上的点是在网上随便下载了一个,这篇文章记录自己的一些收获(毕竟我还是个菜鸟)以及代码的实现,希望能够帮到一些朋友。当然,如果有什么意见的可以直接跟我说,大家一起交流才会进步。效果图地图稍微内容有点多,要全部展示...

weixin_28869849的博客 908

Linux【实战】—— LAMP环境搭建 & 部署网站

由LinuxApacheMySQLPHP组成的一个web网络平台。

2201_75935630的博客 4980

cst-python联合仿真的问题解决

cst与python联合仿真出现无法调用CST的问题解决

ayihu_的博客 2370

HTML5:Subway Map Visualization jQuery Plugin(示例畫深圳地鐵線路圖)

深圳地鐵羅寶線和蛇口線示例:見上圖。 要求瀏覽器版本:browser does support HTML5 canvas element:Google Chrome V 8+;Mozilla Firefox V 3.6+;Opera V 11+;Apple Safari V 5+;Microsoft Internet Explorer V 9+。 javascript: /* ...

weixin_34290390的博客 236

别再死记硬背了!用TwinCAT 3手把手教你配置EtherCAT伺服驱动的PDO映射(DS402协议)

本文详细介绍了如何使用TwinCAT 3配置EtherCAT伺服驱动的PDO映射(DS402协议),涵盖环境准备、设备扫描、PDO映射实战及高级技巧。通过具体操作步骤和常见问题排查,帮助工程师快速掌握EtherCAT通信配置,提升运动控制系统的效率和稳定性。

weixin_29185493的博客 321

HTML5大数据可视化效果(二)可交互地铁线路图

前言 最近特别忙,承蒙大伙关照,3D机房的项目一个接着一个,领了一帮小弟,搞搞传帮带,乌飞兔走,转眼已经菊黄蟹肥……有个小弟很不错,勤奋好学,很快就把API都摸透了,自己折腾着做了个HTML5的魔都的地铁线路图,能拖能拽的,还和电子地图做了交互。哥决定把小弟的成果纳入“HTML5大数据可视化效果”系列,以示鼓励(P.S. 其实还挺有压力的,后浪推前浪,新人赶旧人。我们这些老鸟也得注意,免得...

weixin_30568715的博客 1251

PyQt5自动化测试,让测试更加便利

PyQt5是一个Python的GUI编程工具包,帮助开发者可以更加简单、快捷地创建图形界面和处理用户输入。在PyQt5中有两种常见的测试方式:手动测试和自动化测试。手动测试需要通过点击、输入等交互操作进行测试,自动化测试则是通过程序模拟鼠标、键盘等操作进行测试。这段代码创建了一个简单的窗口,其中包含一个按钮。这段代码打开一个本地HTML文件,点击页面上的按钮并检查输出是否为“Button clicked”。以上就是在PyQt5中进行自动化测试的简单示例。使用PyQt5可以大大简化测试过程,提高测试效率。

PixelCoder的博客 710

实战篇| app爬虫不用真机

之前写过一篇基于真机app爬虫《App爬虫实战篇-以华为真机手机爬取集换社的app为例》,如果大家有用真机爬虫的经历,会深刻认识到真的不方便,一是自己的手机,经常会被电话、微信等打断,二是闲置手机,面对小批量数据还能勉强,大批量爬虫,会导致成本指数级上升,并且控制起来相对麻烦。以下就是常见的模拟器。emulator -avd my_avd -no-snapshot-save # 启动时不保存 snapshot。emulator -avd my_avd -wipe-data # 清除数据(恢复到出厂)

youbingchen的博客 596

发现中国地铁名字的秘密

一个小小的地铁名,就是一座城市风貌的一部分,它反映着不同地方的水土,也承载着各个城市的文化和历史。 本文试图从地铁站名出发,一探这一个个名字能否反映出每一寸土地的性格,文化。 参考文章:183条地铁线路,3034个地铁站,发现中国地铁名字的秘密。 数据集准备: 爬取高德地图地铁图:http://map.amap.com/subway/index.html ...

weixin_33869377的博客 399

强化学习:从经典强化学习理解强化学习

1. 背景介绍 强化学习(Reinforcement Learning,RL)作为机器学习领域的重要分支,近年来取得了长足的进步。其核心思想是让智能体通过与环境的交互学习最优策略,从而最大化累积奖励。不同于监督学习和非监督学习,强化学习无需预先标注数据,而是通过试错的方式逐步学习,具有更强的适应性和泛化能力。

AI架构师小马 1799

前端绘制地铁路线图

前端绘制地铁路线图

Bunny的博客 4287

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

WebGIS 地铁交通线网 | 图扑数字孪生

图扑软件基于 HTML5 的 2D、3D 图形渲染引擎,结合 GIS 地图,以 B/S 技术架构打造地铁线网数字孪生平台。

HT for Web 3D 1619

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

fireworks-tech-graph 事件轨道交通图(Style 11 Event Transit):用地铁隐喻绘制 Kafka 流处理拓扑

本文讲解 fireworks-tech-graph 12 套视觉风格中的 **Style 11 Event Transit(事件轨道交通图)**:它用“地铁线路图”的隐喻来表现事件驱动系统——Topic 是轨道、处理步骤是车站、声明的 junction 是分支点、死信(DLQ)拥有独立可见的线路。读完本文你将掌握:该风格适合什么场景、如何通过 `semantic_profile: "event-t

gitblog_00585的博客 609

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Parsedown 图片引用语法深度解析:`![alt][id]` 的解析流程与源码实现

图片引用(Image Reference)是 Markdown 引用式语法的图片形态:正文中用 `![alt][id]` 引用,文档任意位置用 `[id]: /path/to/image` 定义,二者分离后即可复用同一图片资源。本文以 Parsedown 仓库中的标准测试用例 [test/data/image_reference.md](https://gitcode.com/gh_mirrors

gitblog_00788的博客 805

Python自定义桑基图:从数据到交互式可视化的高效实现

本文详细介绍了如何利用Python高效创建交互式桑基图。通过对比Matplotlib、Pyecharts等方案的不足,提出了一种结合Python数据处理与ECharts前端渲染的轻量级实现方案。文章提供了从数据准备、工具使用到深度定制的完整实战指南,帮助数据分析师快速生成专业、美观的可视化图表,以清晰展示复杂系统中的数据流转与分配关系。

weixin_29046035的博客 254

用D3.js复刻《The Great Bear》地铁图式知识图谱实战

数据可视化是将复杂关系转化为直观图像的关键技术,而“地铁图”作为一种低认知成本的信息表达形式,天然适合呈现分类与关联。其核心原理在于用线路代表类别、站点代表实体、换乘站代表跨领域节点,这一模型可广泛应用于知识管理、学习路径规划、组织架构等场景。D3.js作为JavaScript生态中强大的可视化库,通过数据绑定与SVG渲染,能够高效实现从数据到图形的映射。本文以艺术家Simon Patterson的经典作品《The Great Bear》为灵感,结合UNK20 Day1任务,完整演示如何使用HTML、CSS

weixin_29011239的博客 243
上一篇: 10个TWaver网页3D可视化精彩案例
下一篇: VR技术在数据中心3D机房中的应用(上)
subnetwork
博客等级 码龄17年 17粉丝 84原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值