前言:我吐了,OpenLayers的巨坑之一——鹰眼图OverviewMap创建之必备注意事项。

许久没有更新博客的我,在今天饱受折磨之后一定要分享一下(这么过分一定要说出来.jpg)


相信大家如果使用到openlayers显示web地图,都可能会想要实现一个缩略图(鹰眼图)的效果。关于这部分的内容的基础我就不赘述了,参考下面两篇文章以及官方API文档就够了。

openlayers官网示例

openlayers API之地图鹰眼OverviewMap

openlayers官方API文档——OverviewMap

照着这些例子做出来鹰眼图之后,却使得地图开始不断闪烁,人都给闪懵了(我把这个gif缩小了,保护大家的眼睛—_—)。

那么问题出在哪里呢?不难看到,我们的主图闪烁,其实是缩略图和主图之间在不断交替显示地图内容。

我测试之后,发现问题原来出在osm图层身上,只要在缩略图(overviewmap)和主图(map)中使用了同一个OSM的layer,闪烁就会发生,在主地图和缩略图间交替闪烁。

仔细想想,我们可以在官网api文档中找到这个问题的答案,官方对于overviewmap是这么描述的:

创建一个新的控件,其中一个地图作为另外一个已定义地图的缩略图

缩略图的原理就是利用两个地图相关联,那么我们使用的ol.Map和ol.control.OverviewMap本质上都是map。但是,这俩地图的缩放程度不同,osm又是一个综合的数据图层,如果使用了相同的OSM图层(图层的内存引用相同),就不能满足两幅地图上的相同osm图层(但要求的缩放比例尺不同)同时显示,这就是问题的根源。

那么我们的解决方案就是:避免使用那些在ol.Map的Layers中使用过的图层对象。重新new一个ol.layer的osm对象,添加到我们的ol.control.OverviewMap对象中即可(当然,为了避免代码重复,可以将生成这些重复layer对象的工作封装到函数里面)

但其实,不只是OSM图层会受到影响,根据我的判断,矢量图层ol.layer.Vector和图片图层ol.layer.Image也会受到一定程度的影响。

  1. ol.layer.Vector可能会因为缩放或平移而导致显示问题。如果没有缩略图,只会在极小比例尺突然放大到较大比例尺,网络未能及时加载资源的的情况下出现这种情况。但如果缩略图使用了同源矢量图层,导致主图比例尺大时,缩略图仍然处在小比例尺,两幅图显示会出现混乱问题--矢量线段被错误简化了,从而影响主图的观感)

    这个问题在平移时尤为明显,简直无法忍受。下面两幅图说明了这个问题:


  2. 图片图层ol.layer.Image的问题则是不断闪烁,平移时主图上的图片消失。闪烁问题似乎与OSM的如出一辙,但原因是否一样就不得而知了。

  3. 对地图瓦片ol.layer.Tile(指ol.source.TileWMS)似乎影响不大,但为了避免以后不必要的问题,这里还是建议不要在缩略图(以及其他map中)使用相同图层

当然,如果new一些数据源相同(例如相同url的WMS瓦片)的图层作为缩略图的图层,也就不会存在上述问题了。

因此可以总结一下,这个问题(地图闪烁,矢量图显示异常等)的核心就是“与相同图层有关,与相同数据源无关”>。



最后还得补充一句,由于OverviewMap实现时相当于创建了一个新的map,那么这个map中的view,source等参数是必不可少的,必须要进行相关设置。同时还要注意,主图和缩略图之间的空间参考系SRS必须一致。

openlayers API实现鹰眼图OverviewMap时地图不断闪烁等问题的解决思路的更多相关文章

  1. java spring 等启动项目时的异常 或 程序异常的解决思路

    今天搭建ssm项目的时候,因为pagehelper的一个jar包没有导入idea的web项目下的lib目录中,异常报错找不到pagehelper,这个问题在出异常的时候疯狂crash,让人心情十分不舒 ...

  2. CMake编译OpenCV4.0时opencv_ffmpeg.dll等下载失败的解决思路总结

    一.Configure会报一些红色的警告信息,比如: 1 CMake Warning at cmake/OpenCVDownload.cmake:193 (message): 2 FFMPEG: Do ...

  3. PIE SDK地图鹰眼图

    鹰眼图,是GIS的一个基本功能,在鹰眼图上可以像从空中俯视一样查看地图框中所显示的地图在整个图中的位置,是对全局地图的一种概述表达,能够起到很好的空间提示和导航的作用.网上有很多Arcengine 二 ...

  4. 【百度地图API】当地址解析失败时,如何调用search方法查找地址

    原文:[百度地图API]当地址解析失败时,如何调用search方法查找地址 有个朋友问我,当地址解析失败时,应该如何处理呢?比如,他想搜索“南宁市青秀区”. --------------------- ...

  5. ArcGIS API for JavaScript开发初探——基本地图组件使用

    1.前言 在上一篇我们已经我们已经讲述了第一个地图应用程序的HelloMap的创建过程,这一篇我们来讲述基本地图组件:Home Button.比例尺.鹰眼图的使用方法. 2.基本地图组件 在ArcGI ...

  6. OpenLayers API整理

    整理的Openlayers 的知识笔记,随着运用不断加深理解,也会不断更新. 本文链接:Openlayers API整理 作者:狐狸家的鱼 GitHub:八至 一.创建地图 1.地图Map 创建地图底 ...

  7. 如何利用【百度地图API】,制作房产酒店地图?(下)——结合自己的数据库

    原文:如何利用[百度地图API],制作房产酒店地图?(下)--结合自己的数据库 摘要:应广大API爱好者要求,写了一篇利用自己数据库标点的文章…… -------------------------- ...

  8. 【百度地图API】如何制作孪生姐妹地图?

    原文:[百度地图API]如何制作孪生姐妹地图? 任务描述: 我想要两张一模一样的地图!我想要双子地图!我想要孪生姐妹地图! 好好好,统统满足大家! 在这里我不需要使用百度地图API提供的地图缩略图控件 ...

  9. ArcGIS API for Silverlight 加载google地图

    原文:ArcGIS API for Silverlight 加载google地图 using System; using System.Net; using System.Windows; using ...

随机推荐

  1. Visual Studio 2022 预览版下载来了(x64位)

    Visual Studio 2022 预览版下载:https://visualstudio.microsoft.com/zh-hans/vs/preview/vs2022/

  2. redis实战课题

    redis实战课题 本课题主要围绕用户登录时,直接到redis中查找用户的登录信息,密码验证.重置密码.查询所有用户.显示登录次数最多的前3位,最后通过(C# SQL)持久化到SQL Server 数 ...

  3. 三面面试官:运行 npm run xxx 的时候发生了什么?

    事情是这样的,直接开讲 面试官:npm run xxx的时候,发生了什么?讲的越详细越好. 我(心想,简单啊): 首先,DNS 解析,将域名解析成 IP 地址,然后 TCP 连接,TCP 三次握手.. ...

  4. 什么是BGP

    BGP概述 边界网关协议(BGP)是运行于TCP协议上的一种自治系统的路由协议. 是一种外部路由协议. AS概述 自治系统(AS),指的是同一个使用相同策略的设备的集合. 每个AS有自己位移的编号,不 ...

  5. synchronized和 synchronized 了解偏向锁、轻量级锁、重量级锁的概念以及升级机制、以及和ReentrantLock的区别。

    并发 synchronized 了解偏向锁.轻量级锁.重量级锁的概念以及升级机制.以及和ReentrantLock的区别.       https://www.cnblogs.com/deltadeb ...

  6. SpringAOP--代理

    前言 在Spring或者SpringBoot中,可以通过@Aspect注解和切点表达式等配置切面,实现对某一功能的织入.然而其内部到底是如何实现的呢? 实际上,Spring在启动时为切点方法所在类生成 ...

  7. Elasticsearch 在部署时,对 Linux 的设置有哪些优化方法?

    1.64 GB 内存的机器是非常理想的, 但是 32 GB 和 16 GB 机器也是很常见的.少于 8 GB 会适得其反. 2.如果你要在更快的 CPUs 和更多的核心之间选择,选择更多的核心更好.多 ...

  8. 利用 ps 怎么显示所有的进程? 怎么利用 ps 查看指定进 程的信息?

    ps -ef (system v 输出) ps -aux bsd 格式输出 ps -ef | grep pid

  9. scrapy 如何链接有密码的redis scrapy-redis 设置redis 密码 scrapy-redis如何为redis配置密码

    # 使用scrapy_redis的调度器SCHEDULER = "scrapy_redis.scheduler.Scheduler"# 使用scrapy_redis的去重机制DUP ...

  10. ES6-11学习笔记--模块化

    模块化规范有: CommonJS:Node.js AMD:require.js CMD:sea.js ES6:Module     ES6模块化使用: 关键词:export.import.as.exp ...