基于html5技术绘制上海地铁图 - 双车道路况信息

前面介绍了上海地铁图的绘制,最近有客户提出了新的需求:双车道,并显示路网状态信息。经过一番研究,在原地铁图基础上做了扩展实现

进入微软、亚马逊,谷歌等美国IT企业工作人才项目,起薪40万,百度搜索(MUMCS)

交通图介绍

路况状态在GIS系统中广泛应用,谷歌地图,百度地图都有实时路况的功能,太复杂并非好事,就像地铁图,按真实经纬度呈现反而不够直观,交通图、路网也是如此,去掉无关信息,将有限的数据(路,收费站,路况)展现出来,成为一种解决方案

百度地图中的路况信息

双车道的绘制

来看具体实现,原来的地铁图是一条线表示,改用双线绘制,可表现来往的方向,canvas并没有双线线形,需要自己实现,双线的算法类似2d中的stroke算法,stroke拐点有三种方式:尖的、圆角、斜面,考虑到路网拐角不会太尖,所以简单实现,采用miter方式,沿线各个拐点左右偏移

三种连接点类型

绘制双车道,计算拐点的法线和夹角

function drawDoubleLine(path, points, isDoubleLine, size, lineDirection) { var p0, p1; Q.forEach(points, function (p) { if (!p1) { p1 = p; return; } p1._a = Math.atan2(p.y - p1.y, p.x - p1.x); if (p0) { p1.angle = Math.atan2(Math.sin(p0._a) + Math.sin(p1._a),
Math.cos(p0._a) + Math.cos(p1._a)); p1.angle -= Math.PI / 2; var theta = Math.abs(p1._a - p0._a); if (theta > Math.PI) { theta = 2 * Math.PI - theta; } p1.inclinedAngle = Math.PI - theta; } else { p1.angle = p1._a - Math.PI / 2; } p0 = p1; p1 = p; }); p1.angle
= Math.atan2(p1.y - p0.y, p1.x - p0.x) - Math.PI / 2; if (lineDirection == "left") { drawLine(path, points, 0.5, size); return; } if (lineDirection == "right") { drawLine(path, points, -0.5, size); return; } if (!isDoubleLine) { drawLine(path, points, 0, size);
return; } drawLine(path, points, 0.5, size); drawLine(path, points, -0.5, size); }

绘制连线

function drawLine(path, points, yOffset, size, doubleLine) { Q.forEach(points, function (p, index) { var angle = p.angle; var inclinedAngle = p.inclinedAngle; var x = p.x, y = p.y; var offset = yOffset; if (offset) { offset *= 2 / 3 * 0.8; } if (p.yOffset)
{ offset += p.yOffset; } if (offset) { offset *= size; if (inclinedAngle) { offset /= Math.max(0.2, Math.sin(inclinedAngle / 2)); } var sin = Math.sin(angle); var cos = Math.cos(angle); x += cos * offset; y += sin * offset; } if (index == 0) { path.moveTo(x,
y); } else { path.lineTo(x, y); } }); }

双车道呈现效果

路况状态绘制

路况状态也是呈线条状,与路网绘制相同,只不过为单向,还是上面的绘制函数,参数lineDirection表示车道方向,左侧车道偏移50%,右侧则偏移-50%,这样可以实现两侧不同的状态

function drawDoubleLine(path, points, isDoubleLine, size, lineDirection) { ... if (lineDirection == "left") { drawLine(path, points, 0.5, size); return; } if (lineDirection == "right") { drawLine(path, points, -0.5, size); return; } ... }

路况模拟数据

与原来的例子相同,路况信息也可以通过JSON数据加载,整个为一个array,集合中每个元素为一条路的路况片段信息,"line"属性表示所在路线的编号,"fragments"表示路况片段集合,每个片段包含三个属性,与路线的json表示相同,只不过增加了"direction"属性,表示片段的方向

[{ "line": "11", "fragments": [ { "color": "#FF0000", "direction": "right", "stations": [230, 231, 232] }, { "color": "#FFFF00", "direction": "left", "stations": [229, 230, 231, 232] }, { "color": "#00FF00", "direction": "left", "stations": [227, 228, 229]
} ] }]

路况运行效果

上面11号线上的模拟数据,得到下面的效果

在线演示

在线演示:http://demo.qunee.com/#Shanghai Metro Map 2012

示例下载:路况图示例.zip

基于html5技术绘制上海地铁图 - 双车道路况信息

时间: 2024-08-07 04:15:25

基于html5技术绘制上海地铁图 - 双车道路况信息的相关文章

Ionic构建Hybrid App - 上海地铁图

Qunee有一个 上海地铁图的例子,有客户希望转成mobile app,考察过android的webview,以及PhoneGap等多种Hybrid App方案后,最后选择使用ionic,准确的说是ionic + PhoneGap + Qunee ionic是一种基于HTML5创建Hybrid应用的前端框架,借助phoneGap + angularJS实现一套跨平台,轻量的移动UI方案,本文将介绍借助ionic实现移动版Qunee上海地图的示例 背景知识 安装ionic所需软件环境 - java

基于HTML5实现的Heatmap热图3D应用

Heatmap热图通过众多数据点信息,汇聚成直观可视化颜色效果,热图已广泛被应用于气象预报.医疗成像.机房温度监控等行业,甚至应用于竞技体育领域的数据分析. 已有众多文章分享了生成Heatmap热图原理,可参考<How to make heat maps>和<How to make heat maps in Flex>,本文将介绍基于HTML5技术的实现方式,主要基于Cavans和WebGL这两种HTML5的2D和3D技术的应用,先上最终例子实现的界面效果和操作视频: 实现Heat

Html5 canvas 绘制彩票走势图

因需要 要实现一个类似彩票走势图的功能,初次学Html5 ,很多地方不明白,前段时间也发帖请教过这个问题,也是没给个明确说话,在网上搜了很多,也没有实现的例子,今天仔细研究了下,发现其实也不是很难,现将代码贴出来,共同学习! 先来一张效果图: 实现的代码: <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <me

基于HTML5和CSS的焦点图特效

基于HTML5和CSS的焦点图特效,HTML5 CSS 焦点图 特效 焦点幻灯 来源:http://www.huiyi8.com/jiaodianhuandeng/ 基于HTML5和CSS的焦点图特效

一个酷炫的,基于HTML5,Jquery和Css的全屏焦点图特效,兼容各种浏览器

基于HTML5和CSS的焦点图特效,梅花图案的背景很有中国特色,而且还会动哦,效果超炫,推荐下载! 演示图 html代码 1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 2 <html xmlns="http://www.w3.org/199

HT for Web基于HTML5的图像操作(二)

上篇介绍了HT for Web采用HTML5 Canvas的getImageData和setImageData函数,通过颜色乘积实现的染色效果,本文将再次介绍另一种更为高效的实现方式,当然要实现的功能效果是完全一样的.这次我们依然基于HTML5技术,但采用Canvas的globalCompositeOperation属性进行各种blending效果: 各种globalCompositeOperation效果可参考https://developer.mozilla.org/en-US/docs/W

基于HTML5实现的中国象棋游戏

棋类游戏在桌面游戏中已经非常成熟,中国象棋的版本也非常多.今天这款基于HTML5技术的中国象棋游戏非常有特色,我们不仅可以选择中国象棋的游戏难度,而且可以切换棋盘的样式.程序写累了,喝上一杯咖啡,和电脑对弈几把吧,相信这HTML5中国象棋游戏的实现算法你比较清楚,可以打开源码来研究一下这款HTML5中国象棋游戏. 在线预览   源码下载 实现的代码. html代码: <div class="box" id="box"> <div class=&qu

基于 HTML5 + WebGL 实现 3D 可视化地铁系统

前言 工业互联网,物联网,可视化等名词在我们现在信息化的大背景下已经是耳熟能详,日常生活的交通,出行,吃穿等可能都可以用信息化的方式来为我们表达,在传统的可视化监控领域,一般都是基于 Web SCADA 的前端技术来实现 2D 可视化监控,本系统采用 Hightopo 的 HT for Web 产品来构造轻量化的 3D 可视化场景,该 3D 场景从正面展示了一个地铁站的现实场景,包括地铁的实时运行情况,地铁上下行情况,视频监控,烟雾报警,电梯运行情况等等,帮助我们直观的了解当前的地铁站. 系统中

基于 HTML5 和 WebGL 的地铁站 3D 可视化系统

前言 工业互联网,物联网,可视化等名词在我们现在信息化的大背景下已经是耳熟能详,日常生活的交通,出行,吃穿等可能都可以用信息化的方式来为我们表达,在传统的可视化监控领域,一般都是基于 Web SCADA 的前端技术来实现 2D 可视化监控,本系统采用 Hightopo 的 HT for Web 产品来构造轻量化的 3D 可视化场景,该 3D 场景从正面展示了一个地铁站的现实场景,包括地铁的实时运行情况,地铁上下行情况,视频监控,烟雾报警,电梯运行情况等等,帮助我们直观的了解当前的地铁站. 系统中