前言:我吐了,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. 22.1.22 并查集和KMP算法

    22.1.22 并查集和KMP算法 1.并查集结构 1)实现: 并查集有多种实现方式,例如向上指的图的方式,数组的方式等等.其根本思想就在于准确记录某个节点的根节点,这个这种记录就能够很快的实现并查集 ...

  2. BUU findkey

    定位关键函数 跟入flag找到问题位置 两行一样的代码,nop掉第二行,按p生成函数 代码审计 int __userpurge sub_4018C4@<eax>(int a1@<eb ...

  3. nacos底层原理

    Nacos   为什么选择NacosNacos 致力于帮助您发现.配置和管理微服务.Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现.服务配置.服务元数据及流量管理. Nacos 帮 ...

  4. jedis 和 redisson 有哪些区别?

    Jedis 和 Redisson 都是Java中对Redis操作的封装.Jedis 只是简单的封装了 Redis 的API库,可以看作是Redis客户端,它的方法和Redis 的命令很类似.Redis ...

  5. Effective Java —— 避免创建不必要的对象

    本文参考 本篇文章参考自<Effective Java>第三版第六条"Avoid creating unnecessary objects" avoid creatin ...

  6. Python - random库介绍

  7. ubuntu+ROS安装turtulebot3

    0 简介 Turtlebot是一种室内移动机器人,搭载激光传感器,使机器有精确的距离感知能力.通过搭建仿真环境,可以在没有硬件支持的情况下进行仿真和编程,并熟悉ros系统.环境使Ubuntu16.04 ...

  8. poj_1852_Ants(复杂问题简单化)

    原题传送门 描述 一群蚂蚁走在长度为l cm的水平细杆上,以1cm/s的匀速.当一只行走的蚂蚁到达杆的一端,它就会掉下去.当两只蚂蚁相遇,它们会掉头像反方向走去.我们知道一只蚂蚁在杆上的初始位置,然而 ...

  9. 阐述在Yii2上实现跳转提示页

    序言 为了让用户有更加良好的体验,在操作成功或者失败后,来个提示并跳转页面,我就在Yii2上实现了这一个效果.在写这个跳转提示页的时候,找资料我发现网上关于这方面的中文资料真的很少,大家也都共享下吧! ...

  10. H5活动全屏滚动页面在安卓智能电视TV调试

    前段时间公司做一个线上活动,在电视上商品促销.产品的要求是每个商品介绍刚好满一屏,按下遥控器向下键可以整屏切换.这种功能如果实在PC端,实现起来非常容易,引用jQuery插件就能实现.但是在安卓智能电 ...