高性能的GL三角形Mapbox GL JS

5
我正在尝试创建一个基本的、基于网格的、但性能良好的天气箭头可视化系统。
编辑2: 最新版本在此处:(Mapbox Tracker),使用下面描述的工作流程
使用说明: - 点击风标图标(在左侧) - 等待三角形出现在屏幕上 - 拖动时间滑块(在底部)
正如你所观察到的(特别是在较大的分辨率或快速拖动时间滑块时),绘制三角形时会有相当大的性能损失。
我非常感谢任何关于如何使用当前API中的某些东西来帮助,或者任何关于如何利用当前图形管道的一些自定义缓冲区的想法,只需要旋转、缩放、更改已经填充在屏幕空间中的三角形的颜色。
我觉得我的具体用例将极大地受益于这样的东西,我真的不知道该如何处理它。
我有一个朴素的实现,使用以下工作流程运行:
- 创建geojson FeatureCollection源 - 创建填充层 - 使用数据驱动属性:填充颜色

数据功能:

  1. 获取地图边界
  2. 将sw和ne投影到屏幕点上(map.project(LatLng))
  3. 将高度和宽度分成部分
  4. 循环遍历宽度和高度部分
  5. 查找数据
  6. 访问数据旋转属性
  7. 基于中心点+大小创建顶点
  8. 旋转顶点
  9. 为顶点创建Point对象
  10. 取消投影的Point Object并包装map.unproject(Point).wrap()
  11. 创建Feature对象,分配数据驱动颜色
  12. 将未投影的LatLng分配为多边形几何体的坐标
  13. 添加到Collection的Feature数组中
  14. 在图层上调用setData

虽然这样可以工作,但我正在寻求更加性能友好的方法的建议。

我在思考是否可以创建自定义图层,只需要绘制到屏幕坐标来表示相对于其LatLng点的数据。这样我就可以在屏幕空间中绘制着色、缩放、旋转的三角形,然后使它们根据新的相对LatLng位置更新相关数据。

例如,在屏幕上更新某种类型的网格,而不必进行以下操作:解除投影,然后使用map.getSource('arrows').setData(d)更新要素集合源,requestAnimationFrame(function)等。我在其他项目中也使用了three.js完成类似的操作,但我更愿意使用更为本地化的Mapbox。如果这样做,我会看到相当大的性能提升吗?我以前没有处理过原始的gl调用等,所以如果需要达到那个级别,我可能需要一两个指针来指向正确的方向。
编辑:
之前使用gmaps / three.js实现的内容:volvooceanrace(等待左侧按钮从灰色变为黑色),单击顶部按钮,在悬停时显示“风”标签,滑动下面的红色时间条以更改数据。
添加了当前工作实现的屏幕截图Mapbox GL Arrows
1个回答

0

不确定2016年有什么可用的,但现在一个合理的方法可能是使用symbol图层,并使用icon-rotate数据驱动属性来根据其数据点的属性旋转每个图标。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接