基于HTML5制作在线上海地铁图
某市政项目要用到地铁图,展示上海地铁站点以及相关信息流,尝试使用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]);
- }
- }
- });
- });
在线示例
来源:http://blog.chinaunix.net/uid-29563534-id-4171575.html

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

Video Face Swap
완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

H5 코드에 대한 모범 사례는 다음과 같습니다. 1. 올바른 문서 선언 및 문자 인코딩 사용; 2. 시맨틱 태그를 사용하십시오. 3. HTTP 요청을 줄입니다. 4. 비동기 부하 사용; 5. 이미지 최적화. 이러한 관행은 웹 페이지의 효율성, 유지 관리 및 사용자 경험을 향상시킬 수 있습니다.

웹 표준과 기술은 현재까지 HTML4, CSS2 및 간단한 JavaScript에서 발전했으며 중대한 개발을 거쳤습니다. 1) HTML5는 캔버스 및 웹 스토리지와 같은 API를 도입하여 웹 응용 프로그램의 복잡성과 상호 작용을 향상시킵니다. 2) CSS3은 애니메이션 및 전환 기능을 추가하여 페이지를보다 효과적으로 만듭니다. 3) JavaScript는 화살표 기능 및 클래스와 같은 Node.js 및 ES6의 최신 구문을 통해 개발 효율 및 코드 가독성을 향상시킵니다. 이러한 변경으로 인해 웹 애플리케이션의 성능 최적화 및 모범 사례의 개발이 촉진되었습니다.

H5는 멀티미디어 지원, 오프라인 스토리지 및 성능 최적화로 웹 사용자 경험을 향상시킵니다. 1) 멀티미디어 지원 : H5 및 요소는 개발을 단순화하고 사용자 경험을 향상시킵니다. 2) 오프라인 스토리지 : WebStorage 및 IndexedDB는 오프라인으로 사용하여 경험을 향상시킵니다. 3) 성능 최적화 : 웹 워즈 및 요소는 성능을 최적화하여 대역폭 소비를 줄입니다.

HTML5는 현대적인 웹 페이지를 구축하는 핵심 기술로 많은 새로운 요소와 기능을 제공합니다. 1. HTML5는 웹 페이지 구조 및 SEO를 향상시키는 의미 론적 요소를 소개합니다. 2. 멀티미디어 요소를 지원하고 플러그인없이 미디어를 포함시킵니다. 3. 양식은 새로운 입력 유형 및 검증 속성을 향상시켜 검증 프로세스를 단순화합니다. 4. 웹 페이지 성능 및 사용자 경험을 향상시키기 위해 오프라인 및 로컬 스토리지 기능을 제공합니다.

HTML5 코드는 태그, 요소 및 속성으로 구성됩니다. 1. 태그는 컨텐츠 유형을 정의하고 다음과 같은 각도 브래킷으로 둘러싸여 있습니다. 2. 요소는 컨텐츠와 같은 시작 태그, 내용 및 엔드 태그로 구성됩니다. 3. 속성 시작 태그에서 키 값 쌍을 정의하고 기능을 향상시킵니다. 웹 구조를 구축하기위한 기본 단위입니다.

HTML5의 주요 요소에는 최신 웹 페이지를 작성하는 데 사용되는 ,,,,, 등이 포함됩니다. 1. 헤드 컨텐츠 정의, 2. 링크를 탐색하는 데 사용됩니다. 3. 독립 기사의 내용을 나타내고, 4. 페이지 내용을 구성하고, 5. 사이드 바 컨텐츠 표시, 6. 바닥 글을 정의하면, 이러한 요소는 웹 페이지의 구조와 기능을 향상시킵니다.

HTML5와 H5 사이에는 차이가 없으며, 이는 HTML5의 약어입니다. 1.HTML5는 HTML의 다섯 번째 버전으로 웹 페이지의 멀티미디어 및 대화식 기능을 향상시킵니다. 2.H5는 종종 HTML5 기반 모바일 웹 페이지 또는 응용 프로그램을 참조하는 데 사용되며 다양한 모바일 장치에 적합합니다.

H5 및 HTML5는 다른 개념입니다. HTML5는 새로운 요소 및 API를 포함하는 HTML의 버전입니다. H5는 HTML5를 기반으로 한 모바일 애플리케이션 개발 프레임 워크입니다. HTML5는 브라우저를 통해 코드를 구문 분석하고 렌더링하는 반면 H5 응용 프로그램은 컨테이너를 실행하고 JavaScript를 통해 기본 코드와 상호 작용해야합니다.
