openlayers API实现鹰眼图OverviewMap时地图不断闪烁等问题的解决思路
前言:我吐了,OpenLayers的巨坑之一——鹰眼图OverviewMap创建之必备注意事项。
许久没有更新博客的我,在今天饱受折磨之后一定要分享一下(这么过分一定要说出来.jpg)
相信大家如果使用到openlayers显示web地图,都可能会想要实现一个缩略图(鹰眼图)的效果。关于这部分的内容的基础我就不赘述了,参考下面两篇文章以及官方API文档就够了。
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也会受到一定程度的影响。
ol.layer.Vector可能会因为缩放或平移而导致显示问题。如果没有缩略图,只会在极小比例尺突然放大到较大比例尺,网络未能及时加载资源的的情况下出现这种情况。但如果缩略图使用了同源矢量图层,导致主图比例尺大时,缩略图仍然处在小比例尺,两幅图显示会出现混乱问题--矢量线段被错误简化了,从而影响主图的观感)
这个问题在平移时尤为明显,简直无法忍受。下面两幅图说明了这个问题:

图片图层ol.layer.Image的问题则是不断闪烁,平移时主图上的图片消失。闪烁问题似乎与OSM的如出一辙,但原因是否一样就不得而知了。
对地图瓦片ol.layer.Tile(指ol.source.TileWMS)似乎影响不大,但为了避免以后不必要的问题,这里还是建议不要在缩略图(以及其他map中)使用相同图层
当然,如果new一些数据源相同(例如相同url的WMS瓦片)的图层作为缩略图的图层,也就不会存在上述问题了。
因此可以总结一下,这个问题(地图闪烁,矢量图显示异常等)的核心就是“与相同图层有关,与相同数据源无关”>。

最后还得补充一句,由于OverviewMap实现时相当于创建了一个新的map,那么这个map中的view,source等参数是必不可少的,必须要进行相关设置。同时还要注意,主图和缩略图之间的空间参考系SRS必须一致。
openlayers API实现鹰眼图OverviewMap时地图不断闪烁等问题的解决思路的更多相关文章
- java spring 等启动项目时的异常 或 程序异常的解决思路
今天搭建ssm项目的时候,因为pagehelper的一个jar包没有导入idea的web项目下的lib目录中,异常报错找不到pagehelper,这个问题在出异常的时候疯狂crash,让人心情十分不舒 ...
- CMake编译OpenCV4.0时opencv_ffmpeg.dll等下载失败的解决思路总结
一.Configure会报一些红色的警告信息,比如: 1 CMake Warning at cmake/OpenCVDownload.cmake:193 (message): 2 FFMPEG: Do ...
- PIE SDK地图鹰眼图
鹰眼图,是GIS的一个基本功能,在鹰眼图上可以像从空中俯视一样查看地图框中所显示的地图在整个图中的位置,是对全局地图的一种概述表达,能够起到很好的空间提示和导航的作用.网上有很多Arcengine 二 ...
- 【百度地图API】当地址解析失败时,如何调用search方法查找地址
原文:[百度地图API]当地址解析失败时,如何调用search方法查找地址 有个朋友问我,当地址解析失败时,应该如何处理呢?比如,他想搜索“南宁市青秀区”. --------------------- ...
- ArcGIS API for JavaScript开发初探——基本地图组件使用
1.前言 在上一篇我们已经我们已经讲述了第一个地图应用程序的HelloMap的创建过程,这一篇我们来讲述基本地图组件:Home Button.比例尺.鹰眼图的使用方法. 2.基本地图组件 在ArcGI ...
- OpenLayers API整理
整理的Openlayers 的知识笔记,随着运用不断加深理解,也会不断更新. 本文链接:Openlayers API整理 作者:狐狸家的鱼 GitHub:八至 一.创建地图 1.地图Map 创建地图底 ...
- 如何利用【百度地图API】,制作房产酒店地图?(下)——结合自己的数据库
原文:如何利用[百度地图API],制作房产酒店地图?(下)--结合自己的数据库 摘要:应广大API爱好者要求,写了一篇利用自己数据库标点的文章…… -------------------------- ...
- 【百度地图API】如何制作孪生姐妹地图?
原文:[百度地图API]如何制作孪生姐妹地图? 任务描述: 我想要两张一模一样的地图!我想要双子地图!我想要孪生姐妹地图! 好好好,统统满足大家! 在这里我不需要使用百度地图API提供的地图缩略图控件 ...
- ArcGIS API for Silverlight 加载google地图
原文:ArcGIS API for Silverlight 加载google地图 using System; using System.Net; using System.Windows; using ...
随机推荐
- C/C++ 文件读写
•前言 第一次接触文件读写是在大一的C语言教材中,当时哼哧吧唧的学的贼费劲,虽然最后也学会了,但好像没怎么用过. 在后来,就是在OJ上刷题的时候,编写的代码有时候连样例都不能通过: 这个时候就需要各种 ...
- MySQL JDBC常用知识,封装工具类,时区问题配置,SQL注入问题
JDBC JDBC介绍 Sun公司为了简化开发人员的(对数据库的统一)操作,提供了(Java操作数据库的)规范,俗称JDBC,这些规范的由具体由具体的厂商去做 对于开发人员来说,我们只需要掌握JDBC ...
- Java代码查错部分?
1. abstract class Name { private String name; public abstract boolean isStupidName(String name) {} } ...
- Oracle数据常用的备份与恢复?
Oracle的备份与恢复有三种标准的模式,大致分为两大类,备份恢复(物理上的)以及导入导出(逻辑上的),而备份恢复又可以根据数据库的工作模式分为非归档模式(Nonarchivelog-style)和归 ...
- awk 详解?
awk '{pattern + action}' {filenames} #cat /etc/passwd |awk -F ':' '{print 1"\t"7}' //-F 的意 ...
- 重载(Overload)和重写(Override)的区别。重载的 方法能否根据返回类型进行区分?
方法的重载和重写都是实现多态的方式,区别在于前者实现的是编译时的多态性,而后者实现的是运行时的多态性.重载发生在一个类中,同名的方法如果有不同的参数列表(参数类型不同.参数个数不同或者二者都不同)则视 ...
- Java 中 LinkedHashMap 和 PriorityQueue 的区别是 什么?
PriorityQueue 保证最高或者最低优先级的的元素总是在队列头部,但是 LinkedHashMap 维持的顺序是元素插入的顺序.当遍历一个 PriorityQueue 时,没有任何顺序保证,但 ...
- SVN回滚步骤
- Java/C++实现访问者模式---购物车
在我们课堂上的"购物车"的例子中,增加一个新的访问者:打包员,负责对购物车中货物装包. 类图: Java代码: public interface Product { void ac ...
- 【每日日报】第三十八天---java与时间相关
1 今天看了网上的课程 学习了java的关于时间的代码 获取时间 import java.util.Date; public class DateDemo { public static void m ...