先说结论,结论当然是:大功告成,喜大普奔。看效果图:

好了,接下来说一下过程

先回顾一下这个系列的第一篇第二篇

第一篇是直接改的 mapboxgl 源码,在源码里面对瓦片的位置进行纠偏,遇到的问题是,地图旋转时会有错位,还有瓦片纠偏后屏幕边缘会有空白。

第二篇是写了一个 mapboxgl 自定义图层,遇到的问题是,地图在大比例尺时,瓦片会疯狂抖动。

这两篇文章发出后,有两位大牛针对上面的问题,给出了建设性的意见。

一位是思否上的网友“undefined”(这个不是bug,是他的名称),他在看了第一篇文章后,找出了地图旋转时瓦片错位的原因,并给出了解决方法。

按照上面的思路,我重新写了一个不包含旋转参数的 pixelMatrix 矩阵后,错位问题解决。

解决了错位后,接下来解决屏幕边缘出现空白的问题。

我的思路是,在计算瓦片的显示范围时,对显示范围进行偏移,让程序按偏移的范围去请求瓦片,这样后续瓦片纠偏后,就不会出现空白区域了。

在二维地图中,瓦片显示的范围是根据屏幕 4 个角的坐标直接计算的。但 mapboxgl 是三维地图,三维地图的显示范围是根据相机的参数来计算的,需要判断相机视椎体和瓦片的相交关系,这里还没有整明白。

所以,这个方案就又卡这儿了。

另一位网友是 mapboxgl 技术交流群里的“可乐瓶里泡枸杞”,他指出了第2篇文章中,大比例尺时地图抖动问题的原因,并给出了解决思路。

上图的博客链接中详细说明了地图抖动的原因,大概意思是:webgl 只支持 float32 精度,而 JS 默认是采用 float64 精度,JS 中的高精度数字向webgl 传输时会造成精度损失,这种损失带来的影响就是地图抖动,比例尺越大抖动的越厉害。

如何能避免精度的损失?博客中介绍了 deck.gl 的做法:

  1. 将经纬度坐标转墨卡托坐标这一步,放到 webgl 中来实现,目的是为了使用 GPU 计算
  2. 在比例尺大于12级时,不再直接使用墨卡托坐标,而是计算墨卡托坐标和屏幕中心点的相对位置。使用 float32 的精度保存相对位置是完全没有问题的,这样就规避了精度损失的问题
  3. 重写 view 和 Projection 矩阵

按这个思路,我将上次写的 mapboxgl 自定义图层纠偏插件进行了改造,最终大比例尺时地图不再抖动了。

但又很快遇到了新问题:拖动地图时,瓦片和鼠标的移动距离不一致。

返回去看那篇博客的在线示例,也有同样的问题

既然这样,那就解决问题吧,瞅了瞅代码,总觉得下面这两行不顺眼,

不除 2 了试试,哈哈,一招命中,问题解决。

至此,mapboxgl 对高德地图瓦片纠偏的问题成功解决,我把他封装成了插件,方便大家使用。GIS兵器库中又多了一件趁手的兵器。

这个插件目前不仅仅是支持高德地图瓦片,所有 gcj02 坐标的地图瓦片都支持。

当然,作为插件来讲,它还不够完美,目前发现有这么几个可以完善的地方:

  1. 跟 mapboxgl 自带的瓦片图层相比,瓦片在缩放时有点发虚
  2. 地图缩放时,瓦片没有过渡效果
  3. 移除图层后,有时会莫名其妙的突然出现
  4. 在手机端显示有问题

这些问题,后续会慢慢完善。也欢迎大家一起参与进来,多提 Issues 和 Pull requests

地址

在线示例:http://gisarmory.xyz/blog/index.html?demo=mapboxglMapCorrection3

插件地址:http://gisarmory.xyz/blog/index.html?source=mapboxglMapCorrection3

总结

  1. 解决 mapboxgl 中高德地图瓦片偏移的问题有两个方案,方案一改源码,方案二写自定义图层
  2. 方案一有了突破,解决了地图旋转时瓦片错位的问题,但偏移后屏幕边缘空白的问题没有解决
  3. 方案二在成功解决了地图大比例尺上瓦片抖动的问题后,最终实现了瓦片的纠偏
  4. 将方案二的代码封装成了插件,方便大家使用

原文地址:http://gisarmory.xyz/blog/index.html?blog=mapboxglMapCorrection3

关注《GIS兵器库》, 只给你网上搜不到的GIS知识技能。

本文章采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。欢迎转载、使用、重新发布,但务必保留文章署名《GIS兵器库》(包含链接:  http://gisarmory.xyz/blog/),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。

mapboxgl 互联网地图纠偏插件(三)的更多相关文章

  1. mapboxgl 互联网地图纠偏插件(二)

    前段时间写的mapboxgl 互联网地图纠偏插件(一)存在地图旋转时瓦片错位的问题. 这次没有再跟 mapboxgl 的变换矩阵较劲,而是另辟蹊径使用 mapboxgl 的自定义图层,重新写了一套加载 ...

  2. mapboxgl 互联网地图纠偏插件(一)

    之前写过一个 leaflet 互联网地图纠偏插件,引用插件后一行代码都不用写,就能解决国内互联网地图瓦片的偏移问题. 最近想对 mapboxgl 也写一个这样的插件. 原因是自己发布的OSM矢量瓦片地 ...

  3. openlayers应用“三”:百度地图纠偏

    前两篇文章介绍了openlayers3加载百度在线和离线瓦片地图,页面上能够正常显示.地图加载后在地图上显示一条GPS轨迹,发现离实际位置相差太远,如下图所示: 轨迹形状和实际形状相同,但是位移太远, ...

  4. Arcmap中加载互联网地图资源

    本文转载自:http://blog.3snews.net/space.php?uid=6955280&do=blog&id=67981 前一段时间想在Arcmap中打开互联网地图中的地 ...

  5. [转]在Arcmap中加载互联网地图资源的4种方法

    转自http://blog.3snews.net/space.php?uid=6955280&do=blog&id=67981 前一段时间想在Arcmap中打开互联网地图中的地图数据, ...

  6. WebGIS中自定义互联网地图局部注记的一种方案

    文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/ 1.    前言 实际项目中我们经常会遇到这样一种场景:地图底图可能是互 ...

  7. 在Arcmap中加载互联网地图资源的4种方法

    前一段时间想在Arcmap中打开互联网地图中的地图数据,如影像数据.基础地图数据等,经过简单研究目前总结了四种方法,整理下与大家分享,有些内容可能理解有误,希望大家多多指教.4种方法如下: a)    ...

  8. 在Arcmap中加载互联网地图资源的4种方法(转载)

    前一段时间想在Arcmap中打开互联网地图中的地图数据,如影像数据.基础地图数据等,经过简单研究目前总结了四种方法,整理下与大家分享,有些内容可能理解有误,希望大家多多指教.4种方法如下: a)    ...

  9. CAD图与互联网地图网页端相互叠加显示技术分析和实现

    需求分析 之前相关的博文中介绍了如果在Web网页端展示CAD图形(唯杰地图云端图纸管理平台 https://vjmap.com/app/cloud),当一些CAD图纸有实际地理坐标位置时,如地形图等, ...

随机推荐

  1. layui tabs选项卡 响应试不显示问题

    添加: var element = layui.element; //Tab的切换功能,切换事件监听等,需要依赖element模块 element.init();

  2. 37.qt quick- 高仿微信实现局域网聊天V3版本(添加登录界面、UDP校验登录、皮肤更换、3D旋转)

    1.版本介绍(已上传至群里) 版本说明: 添加登录界面. UDP校验登录. 皮肤更换. 3D旋转(主界面和登录界面之间切换) . 效果图如下所示: 如果效果图加载失败,可以去哔哩哔哩 https:// ...

  3. ctf常见编码形式(罗师傅)

    https://zhuanlan.zhihu.com/p/30323085 这是原链接 ASCII编码 •ASCII编码大致可以分作三部分组成: •第一部分是:ASCII非打印控制字符(参详ASCII ...

  4. 使用oss来存取及优化图片资源

    目录 1. 开通阿里云OSS,并创建存储空间 2. 图片上传及处理 2.1 图片上传 2.2 图片处理 前言: 在日常开发中,不免会遇到需要实现图片上传与展示的需求.比如一个文章发布系统,我们通常会开 ...

  5. ESXi 切换直通导致无法识别硬盘解决

    在解决虚机挂载U盘的过程中(已经处理了:VMware中的虚机如何挂载U盘),怎么样都无法加载U盘,故进行了一次操作直通操作的过程中,不小心把所有的存储和控制器全部直通了,导致Esxi主机无法识别到自己 ...

  6. 脱离OBDeploy工具,手工部署OceanBase方法

    [简介] OBDeploy是OceanBase集群部署的工具,可以通过简单的几行命令,就能快速的进行OceanBase部署.但对于初学者来讲,可能会比较困惑,Deploy到底做了哪些事情?里面的具体步 ...

  7. mysql 修改my.ini

    1.C:\Program Files\MySQL\MySQL Server 5.5\bin>mysqladmin shutdown可能提示:localhost不能启动mysql2.C:\Prog ...

  8. etcd中watch源码解读

    etcd中watch的源码解析 前言 client端的代码 Watch newWatcherGrpcStream run newWatchClient serveSubstream server端的代 ...

  9. java面向对象(下)-抽象类

    抽象类和抽象方法 抽象类和抽象方法必须使用abstract修饰符来定义,有抽象方法的类只能被定义成抽象类,抽象类里可以没有抽象方法 抽象类和抽象方法的规则如下 1.抽象类和抽象方法必须要用abstra ...

  10. Android系统编程入门系列之界面Activity响应丝滑的传统动画

    上篇文章介绍了应用程序内对用户操作响应的相关方法位置,简单的响应逻辑可以是从一个界面Activity跳转到另一个界面Activity,也可以是某些视图View的相对变化.然而不管是启动一个界面执行新界 ...