使用 HTML + JavaScript 在高德地图上实现物流轨迹跟踪系统
在电商行业蓬勃发展的今天,物流信息查询已成为人们日常生活中的重要需求。本文将详细介绍如何基于高德地图 API 利用 HTML + JavaScript 实现物流轨迹跟踪系统的开发。
效果演示
项目概述
本项目主要包含以下核心功能:
- 地图初始化与展示
- 运单号查询功能
- 物流轨迹可视化显示
准备工作
-
注册高德开放平台账号,创建应用并获取API Key。
-
引入高德地图 API (将 API_Key 替换为自己的)和德地图 UI 组件库
<script src="https://webapi.amap.com/maps?v=2.0&key=API_Key"></script>
<script src="https://webapi.amap.com/ui/1.1/main.js"></script>
页面结构与样式设计
创建 HTML 结构
页面主要包含两个核心区域:
- container:用于承载地图展示的核心区域
- panel:右上角的操作面板,包含输入框、查询按钮和物流信息展示区
<div id="container"></div>
<div id="panel"><h3>物流轨迹查询</h3><div class="input-group"><input type="text" id="orderNumber" placeholder="请输入运单号"></div><button id="queryBtn">查询轨迹</button><div id="logistics-info"></div>
</div>
设计 CSS 样式
地图容器样式
#container {width: 100%;height: 100vh;position: relative;
}
操作面板样式
#panel {position: absolute;top: 10px;right: 10px;width: 300px;background: white;padding: 10px;box-shadow: 0 0 10px rgba(0,0,0,0.2);z-index: 999;border-radius: 5px;
}
.input-group {margin-bottom: 10px;
}
input, button {padding: 8px;width: 100%;box-sizing: border-box;
}
button {background: #1E90FF;color: white;border: none;cursor: pointer;
}
button:hover {background: #1874CD;
}
#logistics-info {margin-top: 10px;font-size: 14px;max-height: 300px;overflow-y: auto;
}
.info-item {margin-bottom: 5px;padding-bottom: 5px;border-bottom: 1px solid #eee;
}
.info-time {color: #888;font-size: 12px;
}
.info-content {color: #333;
}
核心功能实现
初始化地图
var map = new AMap.Map('container', {zoom: 10, // 缩放级别center: [116.397428, 39.90923], // 中心点坐标(北京)viewMode: '2D' // 使用2D视图
});
获取物流数据
这里只是示例,模拟了不同运单号返回不同数据,实际应用中可以通过请求后端 API 获取真实数据。
function getLogisticsData(orderNumber) {if (orderNumber === "123456") {return {status: "success",company: "顺丰速运",number: orderNumber,steps: [{time: "2023-05-01 08:00:00",location: [116.404, 39.915],content: "快件已到达【北京朝阳集散中心】"},// ...]};} else if (orderNumber === "654321") {return {status: "success",company: "中通快递",number: orderNumber,steps: [// ...]};} else {return {status: "error",message: "未找到该运单号的物流信息"};}
}
清除地图上的轨迹和标记
function clearMap() {if (polyline) {map.remove(polyline);polyline = null;}if (markers.length > 0) {map.remove(markers);markers = [];}
}
显示物流轨迹
function showLogisticsTrack(data) {// 清除之前的轨迹clearMap();// 更新物流信息显示var infoDiv = document.getElementById('logistics-info');infoDiv.innerHTML = '';if (data.status === "error") {infoDiv.innerHTML = '<div class="info-item">' + data.message + '</div>';return;}// 显示物流公司信息infoDiv.innerHTML += '<div class="info-item"><strong>' + data.company + '</strong> 运单号: ' + data.number + '</div>';// 提取轨迹点坐标var lineArr = [];// 按时间顺序排序(确保最早的步骤在最前面)data.steps.sort(function(a, b) {return new Date(a.time) - new Date(b.time);});// 添加标记和轨迹线data.steps.forEach(function(step, index) {// 添加到轨迹线lineArr.push(step.location);// 创建标记var marker = new AMap.Marker({position: step.location,map: map,content: '<div style="background: #1E90FF; color: white; border-radius: 50%; width: 20px; height: 20px; text-align: center; line-height: 20px;">' + (index + 1) + '</div>',offset: new AMap.Pixel(-10, -10)});// 信息窗口内容var infoContent = '<div style="padding: 5px;">' +'<div style="font-weight: bold;">步骤 ' + (index + 1) + '</div>' +'<div>' + step.content + '</div>' +'<div style="color: #888; font-size: 12px;">' + step.time + '</div>' +'</div>';// 点击标记显示信息窗口marker.on('click', function() {new AMap.InfoWindow({content: infoContent,offset: new AMap.Pixel(0, -30)}).open(map, step.location);});markers.push(marker);// 添加物流信息到面板infoDiv.innerHTML += '<div class="info-item">' +'<div class="info-time">' + step.time + '</div>' +'<div class="info-content">' + step.content + '</div>' +'</div>';});// 绘制轨迹线polyline = new AMap.Polyline({path: lineArr,isOutline: true,outlineColor: '#ffeeff',borderWeight: 1,strokeColor: "#3366FF",strokeOpacity: 1,strokeWeight: 5,strokeStyle: "solid",lineJoin: 'round',lineCap: 'round',zIndex: 50});map.add(polyline);// 调整视图以适应轨迹map.setFitView(polyline);
}
查询功能实现
输入运单号,点击【查询轨迹】按钮获取输入框中的运单号,根据运单号获取物流数据,显示物流轨迹。
document.getElementById('queryBtn').addEventListener('click', function() {var orderNumber = document.getElementById('orderNumber').value.trim();if (!orderNumber) return;var logisticsData = getLogisticsData(orderNumber);showLogisticsTrack(logisticsData);
});
完整代码
<!DOCTYPE html>
<html lang="zh-CN">
<head><meta charset="utf-8"><title>物流轨迹跟踪系统</title><style>body, html {margin: 0;padding: 0;}#container {width: 100%;height: 100vh;position: relative;}#panel {position: absolute;top: 10px;right: 10px;width: 300px;background: white;padding: 10px;box-shadow: 0 0 10px rgba(0,0,0,0.2);z-index: 999;border-radius: 5px;}.input-group {margin-bottom: 10px;}input, button {padding: 8px;width: 100%;box-sizing: border-box;}button {background: #1E90FF;color: white;border: none;cursor: pointer;}button:hover {background: #1874CD;}#logistics-info {margin-top: 10px;font-size: 14px;max-height: 300px;overflow-y: auto;}.info-item {margin-bottom: 5px;padding-bottom: 5px;border-bottom: 1px solid #eee;}.info-time {color: #888;font-size: 12px;}.info-content {color: #333;}</style>
</head>
<body>
<div id="container"></div>
<div id="panel"><h3>物流轨迹查询</h3><div class="input-group"><input type="text" id="orderNumber" placeholder="请输入运单号"></div><button id="queryBtn">查询轨迹</button><div id="logistics-info"></div>
</div><!-- 引入高德地图API -->
<script src="https://webapi.amap.com/maps?v=2.0&key=API_Key"></script>
<!-- 引入高德地图UI组件库 -->
<script src="https://webapi.amap.com/ui/1.1/main.js"></script><script>// 初始化地图var map = new AMap.Map('container', {zoom: 10, // 缩放级别center: [116.397428, 39.90923], // 中心点坐标(北京)viewMode: '2D' // 使用2D视图});// 轨迹线var polyline = null;// 轨迹点标记var markers = [];// 模拟物流数据(实际应用中应从后端API获取)function getLogisticsData(orderNumber) {if (orderNumber === "123456") {return {status: "success",company: "顺丰速运",number: orderNumber,steps: [{time: "2023-05-01 08:00:00",location: [116.404, 39.915],content: "快件已到达【北京朝阳集散中心】"},{time: "2023-05-01 10:30:00",location: [116.408, 39.925],content: "快件已从【北京朝阳集散中心】发出,下一站【北京海淀集散中心】"},{time: "2023-05-01 14:15:00",location: [116.300, 39.960],content: "快件已到达【北京海淀集散中心】"},{time: "2023-05-02 09:00:00",location: [116.310, 39.980],content: "快件正在派送中,派件员:张三,电话:138****1234"},{time: "2023-05-02 11:30:00",location: [116.315, 39.985],content: "快件已签收,签收人:李四"}]};} else if (orderNumber === "654321") {return {status: "success",company: "中通快递",number: orderNumber,steps: [{time: "2023-05-10 13:20:00",location: [121.4737, 31.2304],content: "快件已从【上海虹口集散中心】发出"},{time: "2023-05-11 08:45:00",location: [120.1551, 30.2741],content: "快件已到达【杭州集散中心】"},{time: "2023-05-11 16:30:00",location: [120.2108, 30.2468],content: "快件已从【杭州集散中心】发出,下一站【杭州西湖分部】"}]};} else {return {status: "error",message: "未找到该运单号的物流信息"};}}// 清除地图上的轨迹和标记function clearMap() {if (polyline) {map.remove(polyline);polyline = null;}if (markers.length > 0) {map.remove(markers);markers = [];}}// 显示物流轨迹function showLogisticsTrack(data) {// 清除之前的轨迹clearMap();// 更新物流信息显示var infoDiv = document.getElementById('logistics-info');infoDiv.innerHTML = '';if (data.status === "error") {infoDiv.innerHTML = '<div class="info-item">' + data.message + '</div>';return;}// 显示物流公司信息infoDiv.innerHTML += '<div class="info-item"><strong>' + data.company + '</strong> 运单号: ' + data.number + '</div>';// 提取轨迹点坐标var lineArr = [];// 按时间顺序排序(确保最早的步骤在最前面)data.steps.sort(function(a, b) {return new Date(a.time) - new Date(b.time);});// 添加标记和轨迹线data.steps.forEach(function(step, index) {// 添加到轨迹线lineArr.push(step.location);// 创建标记var marker = new AMap.Marker({position: step.location,map: map,content: '<div style="background: #1E90FF; color: white; border-radius: 50%; width: 20px; height: 20px; text-align: center; line-height: 20px;">' + (index + 1) + '</div>',offset: new AMap.Pixel(-10, -10)});// 信息窗口内容var infoContent = '<div style="padding: 5px;">' +'<div style="font-weight: bold;">步骤 ' + (index + 1) + '</div>' +'<div>' + step.content + '</div>' +'<div style="color: #888; font-size: 12px;">' + step.time + '</div>' +'</div>';// 点击标记显示信息窗口marker.on('click', function() {new AMap.InfoWindow({content: infoContent,offset: new AMap.Pixel(0, -30)}).open(map, step.location);});markers.push(marker);// 添加物流信息到面板infoDiv.innerHTML += '<div class="info-item">' +'<div class="info-time">' + step.time + '</div>' +'<div class="info-content">' + step.content + '</div>' +'</div>';});// 绘制轨迹线polyline = new AMap.Polyline({path: lineArr,isOutline: true,outlineColor: '#ffeeff',borderWeight: 1,strokeColor: "#3366FF",strokeOpacity: 1,strokeWeight: 5,strokeStyle: "solid",lineJoin: 'round',lineCap: 'round',zIndex: 50});map.add(polyline);// 调整视图以适应轨迹map.setFitView(polyline);}// 查询按钮点击事件document.getElementById('queryBtn').addEventListener('click', function() {var orderNumber = document.getElementById('orderNumber').value.trim();if (!orderNumber) return;var logisticsData = getLogisticsData(orderNumber);showLogisticsTrack(logisticsData);});
</script>
</body>
</html>
相关文章:

使用 HTML + JavaScript 在高德地图上实现物流轨迹跟踪系统
在电商行业蓬勃发展的今天,物流信息查询已成为人们日常生活中的重要需求。本文将详细介绍如何基于高德地图 API 利用 HTML JavaScript 实现物流轨迹跟踪系统的开发。 效果演示 项目概述 本项目主要包含以下核心功能: 地图初始化与展示运单号查询功能…...

19-项目部署(Linux)
Linux是一套免费使用和自由传播的操作系统。说到操作系统,大家比较熟知的应该就是Windows和MacOS操作系统,我们今天所学习的Linux也是一款操作系统。 我们作为javaEE开发工程师,将来在企业中开发时会涉及到很多的数据库、中间件等技术&#…...

html基础01:前端基础知识学习
html基础01:前端基础知识学习 1.个人建立打造 -- 之前知识的小总结1.1个人简历展示1.2简历信息填写页面 1.个人建立打造 – 之前知识的小总结 1.1个人简历展示 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8&qu…...
Golang学习之旅
Golang学习之旅:初探Go语言的奥秘 在当今这个快速发展的技术时代,编程语言层出不穷,每一种都有其独特的魅力和适用场景。作为一名对技术充满热情的开发者,我一直在探索新的知识,以提升自己的编程技能。最近࿰…...

【RoadRunner】自动驾驶模拟3D场景构建 | 软件简介与视角控制
💯 欢迎光临清流君的博客小天地,这里是我分享技术与心得的温馨角落 💯 🔥 个人主页:【清流君】🔥 📚 系列专栏: 运动控制 | 决策规划 | 机器人数值优化 📚 🌟始终保持好奇心&…...

基于RK3576+FPGA芯片构建的CODESYS软PLC Linux实时系统方案,支持6T AI算力
基于RK3576芯片构建的CODESYS软PLC Linux实时系统方案,结合了异构计算架构与工业实时控制技术,主要特点如下: 一、硬件架构设计 异构多核协同 Cortex-A72四核(2.3GHz):处理运动轨迹规划、AI视觉等…...
鸿蒙OSUniApp复杂表单与动态验证实践:打造高效的移动端表单解决方案#三方框架 #Uniapp
UniApp复杂表单与动态验证实践:打造高效的移动端表单解决方案 引言 在移动应用开发中,表单处理一直是一个既常见又具有挑战性的任务。随着HarmonyOS生态的蓬勃发展,越来越多的开发者开始关注跨平台解决方案。本文将深入探讨如何使用UniApp框…...
在linux系统上搭建git服务器(ssh协议)
1.在windows上生成RSA密钥对 ssh-keygen -t rsa -b 2048 -C"git用户名/邮箱地址" 命令执行后会在 C:\Users\${windows登录账户}\.ssh 目录下生成密钥对 其中 id_rsa 为私钥,id_rsa.pub 为公钥 2.在 linux 系统上登记公钥 vim ~/.ssh/authorized_keys…...

适配器模式:让不兼容接口协同工作
文章目录 1. 适配器模式概述2. 适配器模式的分类2.1 类适配器2.2 对象适配器 3. 适配器模式的结构4. C#实现适配器模式4.1 对象适配器实现4.2 类适配器实现 5. 适配器模式的实际应用场景5.1 第三方库集成5.2 遗留系统集成5.3 系统重构与升级5.4 跨平台开发 6. 类适配器与对象适…...
NodeJS全栈开发面试题讲解——P12高性能场景题
12.1 设计一个高并发点赞接口,如何优化性能? 设计要点: 问题: 点赞操作是高频写操作,数据库直接写可能成为瓶颈。 优化方案: 缓存计数 异步落库 点赞先写缓存(Redis Hash / Sorted Set&…...

DDP与FSDP:分布式训练技术全解析
DDP与FSDP:分布式训练技术全解析 DDP(Distributed Data Parallel)和 FSDP(Fully Sharded Data Parallel)均为用于深度学习模型训练的分布式训练技术,二者借助多 GPU 或多节点来提升训练速度。 1. DDP(Distributed Data Parallel) 实现原理 数据并行:把相同的模型复…...

【Spring AI 1.0.0】Spring AI 1.0.0框架快速入门(1)——Chat Client API
Spring AI框架快速入门 一、前言二、前期准备2.1 运行环境2.2 maven配置2.3 api-key申请 三、Chat Client API3.1 导入pom依赖3.2 配置application.properties文件3.3 创建 ChatClient3.3.1 使用自动配置的 ChatClient.Builder3.3.2 使用多个聊天模型 3.4 ChatClient请求3.5 Ch…...

【笔记】在 MSYS2(MINGW64)中正确安装 Rust
#工作记录 1. 环境信息 Windows系统: MSYS2 MINGW64当前时间: 2025年6月1日Rust 版本: rustc 1.87.0 (17067e9ac 2025-05-09) (Rev2, Built by MSYS2 project) 2. 安装步骤 步骤 1: 更新系统包数据库并升级已安装的包 首先,确保我们的 MSYS2 系统是最新状态。打…...

从汇编的角度揭秘C++引用,豁然开朗
C中的引用是指已有对象的别名,可以通过该别名访问并修改被引用的对象。那么其背后的原理是什么呢?引用是否会带来额外的开销呢?我们从一段代码入手,来分析一下引用的本质。 #include <stdio.h> int main() {int a 10;int …...
设计模式系列(07):建造者模式(Builder)
本文为设计模式系列第7篇,聚焦创建型模式中的建造者模式,涵盖定义、原理、实际业务场景、优缺点、最佳实践及详细代码示例,适合系统学习与实战应用。 目录 1. 模式概述2. 使用场景3. 优缺点分析4. 实际应用案例5. 结构与UML类图6. 代码示例7…...
Maven 项目中集成数据库文档生成工具
在 Maven 项目中,可以通过集成 数据库文档生成工具(如 screw-maven-plugin、mybatis-generator 或 liquibase)来自动生成数据库文档。以下是使用 screw-maven-plugin(推荐)的完整配置步骤: 1. 添加插件配置…...

聊聊Tomato Architecture
序 本文主要研究一下Tomato Architecture Clean/Onion/Hexagonal/Ports&Adapters Architectures Clean Architecture clean architecture定义了四层结构,最内层是entities(enterprise business rules),再往外是use cases(application business ru…...

小白的进阶之路系列之十二----人工智能从初步到精通pytorch综合运用的讲解第五部分
在本笔记本中,我们将针对Fashion-MNIST数据集训练LeNet-5的变体。Fashion-MNIST是一组描绘各种服装的图像瓦片,有十个类别标签表明所描绘的服装类型。 # PyTorch model and training necessities import torch import torch.nn as nn import torch.nn.functional as F impor…...
Java并发编程实战 Day 6:Future与异步编程模型
【Java并发编程实战 Day 6】Future与异步编程模型 在今天的课程中,我们将深入学习Java中的Future与异步编程模型。这是为期30天的"Java并发编程实战"系列的第6天。 理论基础 Future接口 Future接口是Java提供的用于表示异步计算的结果。它提供了以下方…...
.NET Core 中预防跨网站请求伪造 (XSRFCSRF) 攻击
.NET Core 中预防跨网站请求伪造 (XSRF/CSRF) 攻击 在如今的网络环境中,安全问题一直是开发者们不可忽视的重要方面。跨网站请求伪造(Cross-Site Request Forgery,简称 CSRF)就是一种常见且具有威胁性的网络攻击方式。攻击者通过…...
MFC Resource.h 文件详解与修改指南
MFC Resource.h 文件详解与修改指南 Resource.h 是 Visual C 和 MFC 项目中用于集中管理资源标识符(Resource ID)的头文件。它由 Visual Studio 的资源编辑器自动生成并维护,也可以手动编辑。理解并合理使用该文件对于管理对话框、控件、菜单…...

2025年06月03日Github流行趋势
项目名称:onlook 项目地址url:https://github.com/onlook-dev/onlook项目语言:TypeScript历史star数:12871今日star数:624项目维护者:Kitenite, drfarrell, spartan-vutrannguyen, apps/devin-ai-integrati…...
AI视频编码器(0.4.3) 调试训练bug——使用timm SoftTargetCrossEntropy时出现loss inf
检查过程 进入loss内部实现: > /root/miniconda3/envs/UMT2/lib/python3.9/site-packages/timm/loss/cross_entropy.py(35...

【数据分析】基于Cox模型的R语言实现生存分析与生物标志物风险评估
禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍加载R包数据下载导入数据数据预处理生存分析画图输出图片其他标记物的分析总结系统信息介绍 分析生存数据与多种生物标志物之间的关系。它通过Cox比例风险模型来评估不同生物标志物…...

使用nginx配置反向代理,负载均衡
首先啥叫反向代理 咋配置呢,那当然是在nginx目录下改conf文件了 具体咋改呢,那就新增一个新的server配置,然后在location里新增你想代理的服务器 实际上负载均衡也就是根据反向代理的思路来的,如下所示 配置的话实际上也与上…...

从 iPhone 备份照片: 保存iPhone图片的5种方法
随着智能手机越来越融入我们的生活,我们的照片已成为我们设备上最有价值的数据形式之一。然而,iPhone内部存储空间仍然有限,因此我们需要将iPhone中的照片备份到另一个地方,以释放空间并确保珍贵的图像记忆的安全。阅读本指南&…...

Spring Ai 从Demo到搭建套壳项目(一)初识与实现与deepseek对话模式
前言 为什么说Java长青,主要是因为其生态圈完善,Spring又做了一款脚手架,把对接各个LLM厂商的sdk做了一遍,形成一系列的spring-ai-starter-** 的依赖。 目前为止版本去到1.0.0.M6,golang跟不上了吧, Make …...

快速上手pytest
1. pytest的基础 1.1 什么是pytest pytest 是 python 中的一个测试框架,用于编写简洁、可扩展的测试代码,帮助开发者验证结果是否与预期相符。 python 中有很多的测试框架,那我们为什么要学习 pytest 呢? pytest 的优势&…...

设备驱动与文件系统:02 键盘
操作系统中键盘驱动的讲解 在这一讲中,我将为大家讲解键盘相关内容。从上一讲开始,我们进入了操作系统第四个部分的学习,也就是操作系统对设备的驱动与管理。 上一讲我们探讨的是显示器,并且提到,一个终端设备是由显示…...
matlab分布式电源接入对配电网的影响
MATLAB仿真的分布式电源接入对于配电网的影响,潮流计算加了固定的pq 分布式电源接入对配电网的影响/bustypes.m , 1004 分布式电源接入对配电网的影响/case34.m , 5385 分布式电源接入对配电网的影响/case9.m , 1366 分布式电源接入对配电网的影响/dSbus_dV.m , 14…...