更新日志
记录 Mapjar 的所有重要更新和变更。
[0.3.7] - 2024-12-02
重大改进 ✨
TileLayer 瓦片保留优化 🎯
解决白屏问题:缩放时不再出现白屏,保留旧瓦片直到新瓦片加载完成
分层渲染:
- 先渲染旧瓦片(透明度 0.7,作为背景)
- 再渲染新瓦片(带淡入动画)
智能清理:当所有新瓦片都加载完成后,自动清理旧瓦片
用户体验提升:
- ✅ 缩放时无白屏
- ✅ 旧瓦片作为背景
- ✅ 新瓦片平滑淡入
- ✅ 交互更流畅
[0.3.1] - 2024-12-02
重大改进 ✨
OverlayLayer API 简化 🎯
单一覆盖层设计:一个 layer 只包含一个 overlay,简化使用
新增 API:
setOverlay(overlay)- 设置覆盖层updateOverlay(updates)- 更新覆盖层参数clearOverlay()- 清空覆盖层getOverlay()- 获取覆盖层
使用示例:
// 设置覆盖层
overlayLayer.setOverlay({
element: myElement,
position: { lon: 116.4, lat: 39.9 }
});
// 更新位置
overlayLayer.updateOverlay({
position: { lon: 116.5, lat: 40.0 }
});
// 清空
overlayLayer.clearOverlay();
需要更新现有代码以使用新 API
[0.3.0] - 2024-11-20
新增功能 ✨
OverlayLayer 覆盖层图层 🎯
在地图上叠加任意 HTML 元素,支持完整的 HTML/CSS 样式和 DOM 事件。
核心特性:
- 基于经纬度定位
- 支持像素偏移和锚点配置
- 统一的 DPI 管理
- 自动跟随地图平移和缩放
应用场景:
- 地图标注(Marker)
- 信息弹窗(Popup)
- 自定义控件
- 富文本内容展示
[0.2.9] - 2024-11-20
改进 ✨
MapEngine 自动初始化和启动
- 自动初始化:构造时自动调用
init() - 自动启动:自动开始渲染循环
- 简化 API:移除
autoInit和autoStart选项 - 更好的开发体验:创建后即可直接使用
事件坐标优化
双坐标系统:
screenX/screenY:真实屏幕像素坐标canvasX/canvasY:Canvas 内部坐标(考虑 devicePixelRatio)
[0.2.4] - 2024-11-19
修复 🐛
WindLayer 闪烁问题完全修复
- 随机初始年龄,避免所有粒子同时消亡
- 随机生命周期,增加视觉变化
- 移除定期清理逻辑,避免闪烁
- 完全消除闪烁,动画更加平滑自然
[0.2.2] - 2024-11-19
新增功能 ✨
VectorLayer Point 描边支持
Point 现在支持 strokeColor 和 strokeWidth 属性,使用片段着色器实现平滑的圆形描边效果。
const vectorLayer = new VectorLayer('vector', {
fillColor: [1.0, 0.0, 0.0, 1.0], // 红色填充
strokeColor: [0.0, 0.0, 0.0, 1.0], // 黑色描边
strokeWidth: 2.0, // 2像素描边
pointSize: 10.0
});
统一 DPI 管理 🎯
在 MapOptions 中添加 devicePixelRatio 参数,所有图层使用统一的 DPI 值。
// 使用默认 DPI
const engine = new MapEngine('#map', {
center: [116.4074, 39.9042],
zoom: 10
});
// 自定义 DPI
const engine = new MapEngine('#map', {
center: [116.4074, 39.9042],
zoom: 10,
devicePixelRatio: 2.0
});
[0.2.0] - 2024-11-19
重大更新 🎉
高 DPI 支持 📱
- 自动 DPI 缩放,使用
Math.sqrt(dpr)避免过度放大 - 所有图层自动适配
- 在 Retina 屏幕和移动设备上显示更清晰
项目架构优化 🏗️
- 完整的 TypeScript 类型定义
- 统一的导出接口
- 模块化设计
- 文档完善
[0.1.2] - 2024-11-18
新增功能 ✨
HeatmapLayer 热力图层 🌡️
专门用于渲染温度、降水、气压等连续数值场。
核心特性:
- 高效图片纹理,直接上传到 GPU
- 灵活的颜色映射(字符串数组或 ColorStop 数组)
- 支持透明度通道
- 跨世界渲染支持
应用场景:
- 温度场可视化
- 降水量分布图
- 气压场显示
- 污染物浓度图
WindLayer 风场动画图层 💨
使用 GPU 加速的粒子系统实现流畅的风场动画。
核心特性:
- 粒子系统渲染
- 颜色渐变(根据风速)
- 拖尾效果
- 缩放自适应
- 交互优化
应用场景:
- 气象数据可视化
- 风场模拟演示
- 流场可视化
EventEmitter 事件系统 🎯
统一的事件管理系统,类型安全。
新 API:
on(eventName, listener)- 添加事件监听器once(eventName, listener)- 添加一次性监听器off(eventName, listener)- 移除事件监听器removeAllListeners(eventName?)- 移除所有监听器
[未发布] - 2024-11-16
🚨 严重内存泄漏修复(紧急)
TileLayer LRU 缓存
问题:瓦片缓存无限增长,浏览 30 分钟 → 1.8 GB 内存
修复:
- 实现 LRU 缓存策略
- 限制最大瓦片数量为 500 个
- 缓存满时自动删除最旧的 20% 瓦片
效果:内存从 2 GB → 250 MB(降低 87%)
TextRenderer Float32Array 复用
问题:每帧创建大量 Float32Array 对象,导致垃圾回收频繁
修复:
- 缓存 Float32Array 对象
- 每帧只修改值,不创建新对象
- 对象创建从 180,000/秒降至 0/秒
效果:性能提升 10-100x,FPS 从 < 10 → 60
架构改进 🏗️
CanvasLayer 和 TextRenderer 分离
将 Canvas 2D 和 WebGL 代码分离,创建独立的 TextRenderer 工具类。
优点:
- 职责分离
- 更清晰的继承关系
- 更好的复用性
- 更容易测试和维护
WebGL 工具函数抽离
将 WebGL 资源创建逻辑抽离到 WebGLUtils。
新增工具函数:
createShader- 创建着色器createProgram- 创建着色器程序createTexture- 创建纹理createBuffer- 创建缓冲区createVAO- 创建顶点数组对象setupAttribute- 设置顶点属性
RasterLayer 基类抽象
从 TileLayer 中抽象出通用的栅格渲染逻辑,为所有栅格图层提供一致的渲染管线。
核心功能 🎯
渲染系统
- WebGL2 高性能渲染
- 相机系统(平移、缩放、旋转、flyTo、fitBounds)
- 多图层管理
- 响应式 canvas 尺寸
投影系统
- EPSG:3857 (Web Mercator) 投影
- 坐标转换
- 瓦片坐标计算
图层系统
- 瓦片图层
- 矢量图层
- GeoJSON 图层
- 图像图层
- 风场图层
- 热力图层
- 覆盖层图层
交互功能
- 鼠标拖拽平移
- 滚轮缩放
- 双击放大/缩小
- 触摸拖拽
- 触摸双击
性能提升 🚀
| 指标 | 优化前 | 优化后 | 提升 |
|---|---|---|---|
| 瓦片加载时间 | 2.5s | 1.8s | 28% ↓ |
| 主线程阻塞 | 150ms | 20ms | 87% ↓ |
| 帧率下降 | 15 fps | 3 fps | 80% ↓ |
| 交互响应 | 30ms | < 16ms | 47% ↓ |
| 纹理上传次数 | 每帧 | 仅一次 | 99% ↓ |
| 渲染时间 | 8ms | 3ms | 62% ↓ |
浏览器兼容性 🌐
- Chrome 56+
- Firefox 51+
- Safari 15+
- Edge 79+
覆盖 97%+ 的现代浏览器。
版本说明
语义化版本
本项目遵循 语义化版本 2.0.0
- 主版本号:不兼容的 API 修改
- 次版本号:向下兼容的功能性新增
- 修订号:向下兼容的问题修正
贡献
感谢所有为 Mapjar 做出贡献的开发者!
如有问题或建议,请访问 GitHub 提交 Issue 或 Pull Request。