使用Trae生成交互式地铁线路图

前言

你是否也好奇前端能不能实现地铁线路图的效果,答案是可以的。 本文将使用Trae帮我们实现地铁线路图的效果,并且通过SVG实现鼠标跟随效果。

为啥使用SVG?

SVG是可缩放矢量图形(Scalable Vector Graphics)的简称,SVG 使用 XML 格式定义图像。 SVG 图像在放大或改变尺寸的情况下其图形质量不会有所损失。 SVG 是万维网联盟的标准,SVG 与诸如 DOM 和 XSLF 等W3C标准是一个整体。

实现难度

地铁线路图本质上是一种复杂的数据可视化应用,它需要将抽象的地理位置、线路连接关系转化为直观的视觉表达。

Trae AI在这一过程中展现出了卓越的数据建模和可视化能力,它不仅能够理解地铁线路的数据结构,还能够将其转化为美观、易用的交互式图形。

还有可以使用Echart实现,但是Echart实现起来比较复杂,需要自己绘制地铁线路图,而Trae AI则可以直接使用现成的SVG文件,大大简化了开发过程。

SVG实现地铁线路图

SVG简介

SVG 是一种基于 XML 的图像格式,用于描述二维矢量图形。SVG 图像可以无限放大而不失真,并且可以与 CSS 和 JavaScript 一起使用,以实现交互性和动画效果。

对Trae进行提问

使用最简单高效的方法实现这个地铁线路图

Trae的核心代码结构

看看最终的效果

效果可能不是很好,但是已经实现了,并且可以无限放大,并且可以与 CSS 和 JavaScript 一起使用,以实现交互性和动画效果。

如果你有想法,可以让Trae将细节完善好,比如调整间距之类的。

Trae代码解读

地铁线路数据 站点坐标数据(简化版,实际应用中可能需要更精确的坐标) 初始化SVG元素

ini 复制代码
const svg = document.getElementById('subway-map');
const tooltip = document.querySelector('.tooltip');
let isDragging = false;
let startPoint = { x: 0, y: 0 };
let viewBox = { x: 0, y: 0, width: 1000, height: 800 };
let currentScale = 1;

绘制地铁线路和站点,创建线路组、创建站点组、绘制站点、绘制线路

ini 复制代码
        function renderSubwayMap() {
            // 清空SVG
            svg.innerHTML = '';

            const linesGroup = document.createElementNS('http://www.w3.org/2000/svg', 'g');
            linesGroup.setAttribute('class', 'lines');
            svg.appendChild(linesGroup);
            
            const stationsGroup = document.createElementNS('http://www.w3.org/2000/svg', 'g');
            stationsGroup.setAttribute('class', 'stations');
            svg.appendChild(stationsGroup);
            
            const stationNamesGroup = document.createElementNS('http://www.w3.org/2000/svg', 'g');
            stationNamesGroup.setAttribute('class', 'station-names');
            svg.appendChild(stationNamesGroup);
            
            subwayData.lines.forEach(line => {
                const lineElement = document.createElementNS('http://www.w3.org/2000/svg', 'path');
                lineElement.setAttribute('class', 'line');
                lineElement.setAttribute('id', line.id);
                lineElement.setAttribute('stroke', line.color);
                
                let pathData = '';
                line.stations.forEach((station, index) => {
                    const coords = subwayData.stationCoordinates[station];
                    if (coords) {
                        if (index === 0) {
                            pathData += `M${coords[0]},${coords[1]}`;
                        } else {
                            pathData += ` L${coords[0]},${coords[1]}`;
                        }
                    }
                });
                
                lineElement.setAttribute('d', pathData);
                linesGroup.appendChild(lineElement);
            });

工具提示函数

ini 复制代码
function showTooltip(e) {
    const station = e.target.getAttribute('data-station');
    const stationName = e.target.getAttribute('data-station-name');
    tooltip.textContent = `${stationName}(${station})`;
    tooltip.style.opacity = '1';
    moveTooltip(e);
}

拖拽和缩放功能

javascript 复制代码
    svg.addEventListener('mousedown', startDrag);
    svg.addEventListener('mousemove', drag);
    document.addEventListener('mouseup', endDrag);
    svg.addEventListener('wheel', zoom);

总结

通过以上步骤,我们成功创建了一个简单的地铁线路图,并添加了拖拽和缩放功能。这些功能使得用户可以更方便地查看和操作地图。

这次主要是练习了svg的使用,后续会继续完善这个项目,添加更多的功能,比如点击站点显示站点信息,添加站点之间的距离等等。

非常感谢Trae的帮助,他的生成的代码和指导对我完成这个项目非常有帮助。

相关推荐
小码哥_常5 小时前
一套自己部署的 IM,客户端是同一份 Flutter
前端·后端
蜗牛攻城狮7 小时前
微前端四大方案选型对比与最佳实践:qiankun、micro-app、wujie、Module Federation
前端·微前端·qiankun·前端架构·micro-app·wujie
她说可以呀8 小时前
Vue插槽
前端·javascript·vue.js
qq_448011169 小时前
Vue + Jinja2两套模版与法冲突造成undefinedError
前端·javascript·vue.js
aixingpan9 小时前
aixingpan.cn API开发文档:前端查询夏令时和时区接口指南
前端·php
2601_958352909 小时前
23.5×19mm 换掉一整条音频链?|A-68 集成了什么:ADC / DAC / 24.576MHz 时钟 / AEC / 波束降噪,主控仅需 6 根线
前端·音视频·ai降噪·回声消除·语音模块
志尊宝10 小时前
AI原生前端开发(039):AI辅助的Nuxt 4全栈开发
前端·vue.js·ai-native
FRing0311 小时前
JavaScript入门到精通三十二(深拷贝、浅拷贝、递归函数)
开发语言·前端·javascript
excel11 小时前
双 Token 与前端使用 Crypto 公私钥鉴权换 Token,哪种方案更好?
前端·后端
外收内放11 小时前
Python基础语法练习题(73)
java·前端·python