跳到主要内容

更新日志

记录 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:移除 autoInitautoStart 选项
  • 更好的开发体验:创建后即可直接使用

事件坐标优化

双坐标系统

  • screenX/screenY:真实屏幕像素坐标
  • canvasX/canvasY:Canvas 内部坐标(考虑 devicePixelRatio)

[0.2.4] - 2024-11-19

修复 🐛

WindLayer 闪烁问题完全修复

  • 随机初始年龄,避免所有粒子同时消亡
  • 随机生命周期,增加视觉变化
  • 移除定期清理逻辑,避免闪烁
  • 完全消除闪烁,动画更加平滑自然

[0.2.2] - 2024-11-19

新增功能 ✨

VectorLayer Point 描边支持

Point 现在支持 strokeColorstrokeWidth 属性,使用片段着色器实现平滑的圆形描边效果。

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.5s1.8s28% ↓
主线程阻塞150ms20ms87% ↓
帧率下降15 fps3 fps80% ↓
交互响应30ms< 16ms47% ↓
纹理上传次数每帧仅一次99% ↓
渲染时间8ms3ms62% ↓

浏览器兼容性 🌐

  • Chrome 56+
  • Firefox 51+
  • Safari 15+
  • Edge 79+

覆盖 97%+ 的现代浏览器。


版本说明

语义化版本

本项目遵循 语义化版本 2.0.0

  • 主版本号:不兼容的 API 修改
  • 次版本号:向下兼容的功能性新增
  • 修订号:向下兼容的问题修正

贡献

感谢所有为 Mapjar 做出贡献的开发者!

如有问题或建议,请访问 GitHub 提交 Issue 或 Pull Request。