某市政项目要用到地铁图,展示上海地铁站点以及相关信息流,尝试使用HTML5技术来实现,自己折腾有点慢,找到一个HTML5的图形组件-Qunee for HTML5,简单学习一下,就可以很好的解决这类需求,做出优美的展现,下面以上海2012地铁图为例,效果如下:

示例讲解

首先需要解决数据问题,可以从维基百科或者上海地铁官网中获取,不过也免不了人工,要达到良好的显示效果,需要不只要记录站点的位置,还需要设置文本标签的理想位置,有时为了避免文字叠加,需要设置旋转角度……总之事在人为,想想办法,最终解决了数据问题,再加上Qunee图形组件的强大展示效果,做出来可以交互的在线地铁图

数据格式

采用JSON格式数据,分三种类型:文本标签、站点、地铁线

总的结构如下:

{

"labels" : [ ... ],

"stations" : [ ... ],

"lines" : [ ... ]

}复制代码文本标签数据

包含坐标和文字信息,如果文字需要旋转,则会增加”rotate”属性,下面是“莘庄”文本标签信息

{

"text" : "莘庄",

"x" : 883.591,

"y" : 1625.695

}复制代码文字与节点旋转效果

站点数据

包含坐标、旋转角度以及编号信息,下面是“莘庄”站的信息

{

"id" : 5,

"x" : 869.8513512641732,

"y" : 1597.6559686949402,

"rotate" : 0.7853981633974483

}复制代码地铁线数据

包含名称,颜色,以及经过的站点编号

{

"name" : "1",

"color" : "#e52035",

"stations" : [64, 70, 67, 71, 72, 65, 69, 73, 66, 68, 63, 62, 22, 61, 60, {"id": 21, "yOffset": 0.5}, 59, {"id": 18, "yOffset": -0.5}, 17, 58, 14, 7, 57, 6,

56, 44, 47, 5]

}复制代码对于特殊情况,比如两条地铁线共用一条线路的情况,会出现两条线重合,为了避免这种情况,还可以指定站点横向偏移量,比如上面一号线中的如下数据

{"id": 21, "yOffset": 0.5}复制代码因为上海地铁三号线与四号线共用线路较多,所以这种处理更加明显

三号线数据

{

"name" : "3",

"color" : "#f9d300",

"stations" : [6, 95, 96, 97, {"id":12,"yOffset":0.5}, {"id":11,"yOffset":0.5}, {"id":8,"yOffset":0.5}, {"id":9,"yOffset":0.5},

{"id":10,"yOffset":0.5}, {"id":25,"yOffset":0.5}, {"id":26,"yOffset":0.5}, {"id":238,"yOffset":0.5}, {"id":22,"yOffset":-0.5}, {"id":27,"yOffset":-0.5},

98, 99, 100, 101, 104, 105, 107, 108, 109, 106, 110, 111]

}复制代码地铁共线效果

创建图元

数据需要转换成qunee图元对象,三种类型分别对应三个创建函数

创建文本标签

function createText(name, x, y, rotate){

var text = graph.createNode(name, x, y);

if(rotate){

text.rotate = rotate;

}

text.zIndex = 20;

text.image = null;

text.setStyle(Q.Styles.BACKGROUND_COLOR, Q.toColor(0x88FFFFFF));

text.setStyle(Q.Styles.LABEL_ANCHOR_POSITION, Q.Position.LEFT_BOTTOM);

text.setStyle(Q.Styles.LABEL_POSITION, Q.Position.CENTER_MIDDLE);

text.setStyle(Q.Styles.LABEL_PADDING, PADDING);

return text;

}复制代码创建站点

function createStation(station){

var node = graph.createNode(null/**station.name*/, station.x, station.y);

node.stationId = station.id;

node.setStyle(Q.Styles.LABEL_FONT_SIZE, 10);

node.setStyle(Q.Styles.LABEL_ANCHOR_POSITION, Q.Position.CENTER_MIDDLE);

node.setStyle(Q.Styles.LABEL_POSITION, Q.Position.CENTER_MIDDLE);

node.zIndex = 10;

if(station.rotate){

node.image = roundRect;

node.rotate = station.rotate;

}else{

node.image = circle;

}

node.setStyle(Q.Styles.SHAPE_FILL_COLOR, "#FFF");

node.setStyle(Q.Styles.SHAPE_STROKE_STYLE, "#000");

return node;

}复制代码创建地铁线

createLine(…)函数用于创建地铁线,使用了节点类型图元,并设置节点主体为路径,函数updateLine(…)用于从站点信息自动生成线路路径

function createLine(line){

var stations = line.stations;

var node = graph.createNode(line.name);

node.stations = stations;

node.movable = false;

node.setStyle(Q.Styles.LABEL_FONT_SIZE, 50);

node.setStyle(Q.Styles.LABEL_COLOR, line.color);

node.setStyle(Q.Styles.LABEL_ANCHOR_POSITION, Q.Position.LEFT_BOTTOM);

node.setStyle(Q.Styles.LABEL_POSITION, Q.Position.LEFT_TOP);

node.setStyle(Q.Styles.LAYOUT_BY_PATH, true);

node.anchorPosition = null;

node.setStyle(Q.Styles.SHAPE_STROKE, size);

node.setStyle(Q.Styles.SHAPE_STROKE_STYLE, line.color);

updateLine(node, true);

return node;

}复制代码

function updateLine(line, addListener){

var path = new Q.Path();

line.image = path;

var stations = line.stations;

var first = true;

Q.forEach(stations, function(s){

var station = getStation(s.id || s);

if(!station){

return;

}

if(addListener){

addLocationChangeListener(station.stationId, line);

}

var location = station.location;

var x = location.x, y = location.y;

if(s.yOffset){

var offset = s.yOffset * size;

var rotate = station.rotate || 0;

var sin = Math.sin(rotate);

var cos = Math.cos(rotate);

x += cos * offset;

y += sin * offset;

}

if(first){

first = false;

path.moveTo(x, y);

}else{

path.lineTo(x, y);

}

})

}复制代码交互处理

增加交互处理,监听站点拖动事件,保持地铁路线跟随站点位置变化

graph.interactionDispatcher.addListener(function(evt){

if(evt.kind != Q.InteractionEvent.ELEMENT_MOVING){

return;

}

var datas = evt.datas;

Q.forEach(datas, function(data){

if(!data.stationId){

return;

}

var listeners = stationLocationChangeListeners[data.stationId];

if(listeners){

for(var l in listeners){

updateLine(listeners[l]);

}

}

});

});复制代码

地铁线路图显示效果php,基于HTML5制作在线上海地铁图相关推荐

  1. 绘制地铁线路html,基于HTML5技术绘制上海地铁图

    某市政项目用到地铁图展现,展现地铁站点以及相关信息流,使用Qunee组件能够很好的解决这类需求,作出优美的展示,下面以上海2012地铁图为例,效果以下:node 示例讲解 首先须要解决数据问题,能够从 ...

  2. 自动绘图html,基于HTML5技术绘制上海地铁图

    某市政项目用到地铁图展示,展示地铁站点以及相关信息流,使用Qunee组件可以很好的解决这类需求,做出优美的展现,下面以上海2012地铁图为例,效果如下: 示例讲解 首先需要解决数据问题,可以从维基百科 ...

  3. html5地图连线原理,基于html5技术绘制上海地铁图 – 双车道路况信息

    上海地铁图的绘制,最近有客户提出了新的需求:双车道,并显示路网状态信息.经过一番研究,在原地铁图基础上做了扩展实现 交通图介绍 路况状态在GIS系统中广泛应用,谷歌地图,百度地图都有实时路况的功能,太 ...

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

    原标题:基于 HTML5 Canvas 的交互式地铁线路图 作者:xhload3d my.oschina.net/xhload3d/blog/1629064 摘要:感觉目前地铁上的地铁线路图也不是很人 ...

  5. 基于html5的在线教育,基于HTML5的在线学习系统的设计与实现

    基于HTML5的在线学习系统的设计与实现 发布时间:2019-11-18所属分类:科技论文浏览:1次 摘 要: 摘 要: 在线课程学习网站的发展迅速,吸引了广大用户.基于 HTML5 的在线学习系统经 ...

  6. html5脑图_基于HTML5的三维思维导图软件开发技术研究

    龙源期刊网 http://www.qikan.com.cn 基于 HTML5 的三维思维导图软件开发技术 研究 作者:汪升华 唐国纯 来源:<软件工程> 2017 年第 10 期 摘 要: ...

  7. 基于 HTML5 Canvas 的交互式地铁线路图

    前言 前两天在 echarts 上寻找灵感的时候,看到了很多有关地图类似的例子,地图定位等等,但是好像就是没有地铁线路图,就自己花了一些时间捣鼓出来了这个交互式地铁线路图的 Demo,地铁线路上的点是 ...

  8. 基于 HTML5 Canvas 的交互式地铁线路图 1

    前言 前两天在 echarts 上寻找灵感的时候,看到了很多有关地图类似的例子,地图定位等等,但是好像就是没有地铁线路图,就自己花了一些时间捣鼓出来了这个交互式地铁线路图的 Demo,地铁线路上的点是 ...

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

    前言 前两天在 echarts 上寻找灵感的时候,看到了很多有关地图类似的例子,地图定位等等,但是好像就是没有地铁线路图,就自己花了一些时间捣鼓出来了这个交互式地铁线路图的 Demo,地铁线路上的点是 ...

最新文章

  1. MySQL事务效率测试
  2. 类型之间的相互转换php,php学习之数据类型之间的转换介绍
  3. java容器02--ArrayList源码分析
  4. AutoCompleteExtender智能扩展实例
  5. chmod和chown命令的用法
  6. 科学计算机度转弧度,角度弧度换算器在线(70°角度转换弧度)
  7. 苹果id登陆不上去怎么回事_shopee虾皮台湾站 app怎么登陆不上去,shopee虾皮台湾站app最新版...
  8. 聚类分析在SPSS中的应用
  9. excel身份证号计算年龄
  10. 鏈接腳本、靜態庫、共享庫
  11. 宝塔 linux面板,宝塔Linux面板安装使用入门教程_Linux系统云服务器/云服务器/独立服务器建站面板安装入门教程...
  12. 宋叔日记--新手级别入门全能赚钱软件!
  13. 京东能成为快手的老铁吗?
  14. Cisco 9100系列AP清空配置
  15. 采用先进先出的退货问题
  16. 2016微信公开课·张小龙演讲全文(上)
  17. python 电压 谐波_用python计算thd
  18. 快讯:科创板股票全线上涨 瀚川智能和沃尔德涨停
  19. html合并单元格自动换行,html的table标签用js做合并单元格操作
  20. 虚拟内存不足造成的蓝屏_问题分析及解决

热门文章

  1. 云课堂计算机测试答案,2020智慧职教云课堂计算机应用答案完整满分课后作业答案...
  2. python面向对象的特征_python 面向对象的三大特性
  3. PS网页设计教程XI——在PS中创建柔和的绿色环保的网页布局
  4. 安装Matlab R2022a/64位
  5. 历史上几次股市大崩盘
  6. dns服务器响应配置,没有配置的dns服务器响应
  7. 泛微OA E9后端环境搭建(IDEA) Ecology 9二次开发环境搭建 ecology二次开发
  8. excel单元格下拉选项怎么设置_使用Excel制作搜索式下拉菜单,让你不再烦恼下拉选项多内容...
  9. BroadCast Channel
  10. python小球游戏代码