html5制作线路图,HTML5绘制上海地铁线路图

某市政项目用到地铁图展示,展示地铁站点以及相关信息流,使用Qunee组件可以很好的解决这类需求,做出优美的展现,下面以上海2012地铁图为例,效果如下:

上海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);

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/290922.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Cocos2d-x VS. OGEngine,联盟与部落的战争

在近期的全球移动开发者大会上,Unity发布了2D引擎,触控在同时发布了Cocos 3D引擎;而在差不多同时间,以安卓为主的OGEngine也发布了新版本,并宣布将支持跨平台。各大引擎频频大动作并不是巧合,这代表着移动游…

Android之获取设备的型号和手机厂商

1. 获取手机型号: String model android.os.Build.MODEL; 2. 获取手机厂商: String carrier android.os.Build.MANUFACTURER;

C#中的var理解

从 C# 3.0 开始,在方法范围内声明的变量可以具有隐式“类型”var。隐式类型本地变量为强类型,就像用户已经自行声明该类型,但编译器决定类型一样。i 的以下两个声明在功能上是等效的:var i 10; int i 10;var 关键字的常见用途是…

发布版本步骤

1&#xff0c;修改版本号 -eclipse中安卓工程的AndroidManifest.xml文件中修改 android:versionName"V1.0.1.170413.31"<日期-版本号1>2.获得软件APK &#xff0c;eclipse下windows-Android-build-取消勾选Atomatically refresh Force Skip packag…

Linux 2.6 完全公平调度算法CFS(Completely Fair Scheduler) 分析

转会http://www.ibm.com/developerworks/cn/linux/l-completely-fair-scheduler/index.html?cadrs-cn-0125 Linux 调度器简史 早期的 Linux 调度器使用了最低的设计&#xff0c;它显然不关注具有非常多处理器的大型架构&#xff0c;更不用说是超线程了。1.2 Linux 调度器使用了…

在计算机技术方面用英语怎么说,“计算机应用技术”用英语怎么说?

计算机应用技术 :1. Computer Applications Technology中国搜学网-学苑论坛 - 教育话题 - 学习交流 ... ...专利文献检索 The Searches of Patent Literature计算机应用技术 Computer Applications Technology精密电磁测量 Precise Electromagnetic Measurement ...2. Computer…

同页面多UpdatePanel的单独刷新

<!--UpdateMode"Conditional"设置为不共用的UpdatePanel--><asp:UpdatePanel runat"server" ID"up1" UpdateMode"Conditional"><ContentTemplate><asp:Button runat"server" ID"Button1" On…

linux之nautilus .命令浏览当前文件目录

1、比如我们在终端目前想打开这个路径下的文件目录&#xff0c;我们如果再去更加路径一个一个的打&#xff0c;就太浪费时间了&#xff0c;我们可以在终端这个路径下输入下面的命令就可以 ~/Desktop$ nautilus . 2、效果如下图

C# 异步与Windows应用程序

把 async 关键字用于 UWP 应用程序&#xff0c;需要注意&#xff0c;在 UI 线程中调用 await 之后&#xff0c;当异步方法返回时&#xff0c;将默认返回到 UI 线程中。这便于在异步方法完成后更新 UI 元素。注意为了创建 UWP 应用程序&#xff0c;需要 Windows 10&#xff0c;W…

重装系统后恢复oracle数据

2019独角兽企业重金招聘Python工程师标准>>> 由于前段时间重装了系统&#xff0c;今天重装了数据库oracle XE版本&#xff0c;用“移花接木”的手段将新装oracle的目录用原有目录直接给覆盖&#xff0c;于是顺利的启动了oracle服务&#xff0c;然后又打开plsql deve…

使用eclipse运行mapreduce程序

今天使用http://www.cnblogs.com/xia520pi/archive/2012/05/16/2504205.html上的方式搭建一个基于Eclipse的mapreduce开发环境&#xff0c;在运行WordCount例子时出现错误&#xff0c;经过检查后才发现&#xff0c;装了hadoop2.0插件的Eclipse在右击选择“run on hadoop”时不会…

java Split 用法

在java.lang包中有String.split()方法,返回是一个数组 我在应用中用到一些,给大家总结一下,仅供大家参考: 1、如果用“.”作为分隔的话,必须是如下写法,String.split("\\."),这样才能正确的分隔开,不能用String.split("."); 2、如果用“|”作为分隔的话,必…

html三列布局源码,HTML三列布局 - 黄柳淞的个人页面 - OSCHINA - 中文开源技术交流社区...

1.三列布局1三列布局body{padding: 0;margin: 0;}.left{width:33.3%;height: 500px;background-color: #ccc;float: left;}.middle{width:33.3%;height: 500px;background-color: #bbb;float: left;}.right{width:33.3%;height: 500px;background-color: #aaa;float: left;}33.…

Android之如何用dextra.ELF64查看安卓手机“设置“图标的源代码

1、找到手机“设置”图标的包名 adb shell dumpsys activity top 得到包名: com.android.settings 2、拉下odex文件 1)、通过包名得到odex文件 adb shell pm list pakcage -f | grep com.android.settings 2)、得到结果 package:/system/priv-app/Settings/Settings.apk=co…

unity3d Json解析工具类

使用到的是Newtonsoft.Json动态库&#xff0c;下载地址&#xff1a;http://www.newtonsoft.com/json using Newtonsoft.Json; using System.Collections.Generic; using System.IO;/// <summary> /// Json帮助类 /// </summary> public class JsonHelper {/// <…

.NET6之MiniAPI(二十):实体验证FluentValidation

为了验证api post上来的数据的有效性&#xff0c;我们可以引入FluentValidation(详见https://fluentvalidation.net)。在asp.net mvc中&#xff0c;使用的是模型验证&#xff0c;通过在实体类上添加特性达到验证效果。FluentValidation的原理是通过实现AbstractValidator<T&…

nagios的搭建及配置----(中)

上篇文章写到了我们布置的nagios监控本机的状态&#xff0c;下面我们来看下nagios监控服务器状态的配置。至于为什么要这么配置&#xff0c;大家可以自行去百度下看看使用NRPE插件实现对remote server 进行监控&#xff0c;远程服务器配置1&#xff0c;编译安装nagios-plugin&a…

计算机整个文稿应用回顾主题,《计算机应用基础》精品课程电子教案-PowerPoint 2003...

一&#xff0e;回顾上次课内容(提问方式)对于幻灯片的切换、配色方案的使用、母版的使用用实例进行提问&#xff0c;通过学生的操作了解学生掌握的情况&#xff0c;并加强学生的实践操作能力。二、新课教学(讲解法、示范法)5.6.1幻灯片切换具体操作方法如下&#xff1a;在【幻灯…

linux之so文件、a文件、o文件的区别

1、o文件 o 就相当于windows里的obj文件 ,一个.c或.cpp文件对应一个.o文件 .o 文件是源码编译出的二进制文件。 你先得了解从源代码到可执行文件的过程。以一个简单的add函数源文件为例。 int add(int a,int b) {return a+b; } 先预处理为.i文件gcc -E add.c -o add.i 再编译为…

【F大说】Flash的那些坑

转载自F大的自言自语←_←创建控件类时&#xff0c;基类不能用源码创建控件类时&#xff0c;基类要以swc方式提供&#xff08;不能用源码&#xff09;&#xff0c;否则控件中所包含的子元件实例名将被添加到基类&#xff0c;而不是控件类中去。调用gotoAndStop会导致帧代码插队…