基于html5绘制上海地铁图 - 路况信息展示

简介:

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


image

交通图介绍

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

百度地图中的路况信息

baidu地图路况信息


image

**
双车道的绘制
**
来看具体实现,原来的地铁图是一条线表示,改用双线绘制,可表现来往的方向,canvas并没有双线线形,需要自己实现

三种连接点类型

双线的算法类似2d中的stroke算法,stroke拐点有三种方式:尖的、圆角、斜面,考虑到路网拐角不会太尖,所以简单实现,采用miter方式,沿线各个拐点左右偏移

image

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

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);
        }
    });
}

双车道呈现效果


image

路况状态绘制

路况状态也是呈线条状,与路网绘制相同,只不过为单向,还是上面的绘制函数,参数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]
    }
]

}]**
路况运行效果

image

相关文章
|
2天前
|
Java
有关Java发送邮件信息(支持附件、html文件模板发送)
有关Java发送邮件信息(支持附件、html文件模板发送)
54 1
|
7月前
|
安全 Java Spring
【Java用法】Java 过滤html标签获取纯文本信息
【Java用法】Java 过滤html标签获取纯文本信息
124 0
|
2天前
|
移动开发 前端开发 HTML5
HTML5实现酷炫个人产品推广、工具推广、信息推广、个人主页、个人介绍、酷炫官网、门户网站模板源码
HTML5实现酷炫个人产品推广、工具推广、信息推广、个人主页、个人介绍、酷炫官网、门户网站模板源码
|
2天前
|
数据采集 前端开发 搜索推荐
HTML元信息
HTML元信息
16 1
|
2天前
|
Java
有关Java发送邮件信息(支持附件、html文件模板发送)
有关Java发送邮件信息(支持附件、html文件模板发送)
95 0
|
2天前
|
前端开发
HTML和CSS拼成的像素图
HTML和CSS拼成的像素图
24 0
|
10月前
|
前端开发
Echarts实战案例代码(49):基于不支持立体漏斗图Funnel的HTML+CSS解决方案
Echarts实战案例代码(49):基于不支持立体漏斗图Funnel的HTML+CSS解决方案
113 0
|
人工智能 JavaScript 前端开发
原生JS + HTML + CSS 实现快递物流信息 API 的数据链式展示
全国快递物流查询 API 是一种提供实时、准确、可靠的快递物流信息查询服务的接口。它基于现有的物流信息系统,通过API接口的方式,向用户提供快递物流信息的查询、跟踪、统计等功能。
256 0
原生JS + HTML + CSS 实现快递物流信息 API 的数据链式展示
|
缓存
Discuz!论坛如何去除隐藏文章内容图片鼠标经过时显示“下载附件”等信息解决方法本文来自:XM技术学习分享,原地址:http://xmwl.cc/mb/41.html
在discuz!系统中发帖上传图片,鼠标经过的时候会显示一个小菜单,显示图片的基本信息和下载链接,有些站长觉得每次鼠标经过的时候弹出这个体验不好希望去掉!本文来自:XM技术学习分享,原地址:http://xmwl.cc/mb/41.html
670 0