(十四)WebGIS中地图放大缩小的设计和实现
文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/。
1.背景
在上一章中,我们给出了整个工具栏设计的核心,使用命令模式,并设计了具体工具类所继承的基类——Command类。从这一章开始我们便正式进入了具体工具类的设计和实现。
放大和缩小工具是最基础的工具之一,其操作分为三种:
a.点击地图,进行放大缩小
b.拉框,进行放大缩小
c.滚轮调控放大缩小
针对这三种操作方式,我们进行了不同的代码逻辑设计。
2.分析
a.滚轮调控地图放大缩小是一个固定的操作,即使切换到其他操作上时,此操作也应该同样生效。所以,将此功能应该放入到基类Command类中。
b.点击地图时,应该根据工具选择,进行以点击点为中心,将地图放大一个级别或者缩小一个级别。
c.拉框进行地图放大时,根据拉框的大小进行对应的地图级别的放大和缩小。
但是,这里涉及到一个问题,地图的级别是固定的,如果单纯的将四角坐标变成拉框大小,则此时很可能并没有对应此四角坐标的级别。同时,四角坐标不一定一定要设计成拉框的真实大小,有很多系统,其真实的四角坐标是拉框大小再乘以一个固定参数而得,比如1.5倍。
d.拉框进行地图缩小时,有两种思路去实现。一种相对复杂,一种相对简单。同样在下面我们会具体解说。
3.地图放大和缩小的原理
要了解滴入放大和缩小的原理,我们必须对栅格地图中瓦片的获得以及拼接显示有基本的理解,大家可以回看我在此系列中的第二章到第六章。
这里,我对放大和缩小的核心原理做大致的讲解。
3.1流程图
以下是整个操作实现的流程图:
3.2具体解说
操作分为拉框和点击,根据两种操作可以获得两种参数。针对拉框获得的参数只包括屏幕的地理四角坐标,针对点击获得的参数则包括了屏幕的地理四角坐标以及要显示的级别的。
根据参数的不同,瓦片的请求同样也分为两种请求方式。
针对只有屏幕地理四角坐标的参数,瓦片请求时,会首先算出与此屏幕四角坐标最温和的地图级别是多少,然后从新算出此时的屏幕地理四角坐标以及相关的瓦片的真实范围。
针对屏幕地理四角坐标和显示级别都有的参数,瓦片请求时,会从新算出在此显示级别下,屏幕的地理四角坐标应该是多少,中心点是参数中屏幕四角坐标的中心点。
4.放大功能的设计
在上面我们提到了放大功能设计的两种方式,点击和拉框。
a.点击操作时,以点击点为中心点,给出一个基于此中心点的范围(可以默认加减一个参数即可),然后获得此时的地图级别,如果地图不是最小级别(0),则将此Level减1,便是需要显示的地图级别(注:这里级别越小,比例尺越小,即放大)。
b.拉框操作时,用拉框范围,或者该范围乘以的基数为请求参数中的屏幕地理四角坐标,请求瓦片。
5.缩小功能的设计
a.点击操作时,与放大操作没有本质区别,只是需要将获得的此时地图级别加1即可。
b.拉框操作时,如上面提到过的问题。这里有两种方式来解决,一种相对难一些,一种相对简单一些。难一点的,需要我们首先得出此时的拉框范围与此时屏幕范围的比值recPercent,然后有两种处理方式:一般的是用此时屏幕范围除以recPercent得到需要的屏幕地理范围;复杂的是用此recPercent做相关的变化然后乘以屏幕地理范围。两种方法本质是一样的。简单的方法,就是把缩小功能的拉框操作设计的与点击时的操作一样即可。
6.优化工作
在拉框时,能够将拉框的矩形画出,会使效果美化很多。这里只需要监听几种mouse事件,做出相关逻辑控制即可实现。
7.深入探讨
在我们重新申请了地图瓦片,改变了屏幕地理四角坐标后,其实是进行了一次地图的刷新的功能。这里,我们需要在完成地图放大和缩小后,抛出一个地图的Zoom事件,这样地图上的矢量图层监听到该事件后,才能做出相关的重绘操作。否则矢量图层将与目前的栅格图层出现叠加错误。
8.总结
在这一章我们讲解了地图放大和缩小功能的设计和实现,在下一章节中我们开始讨论地图的平移功能的设计和实现。平移功能涉及到我在前面章节中提到过的一个问题,即矢量图层中要素的偏移问题。我们也会专门花一个章节来讲解坐标的偏移问题。此问题的解决原理与之前提到的屏幕坐标和地理坐标转换原理相结合后,能够很好的解决矢量图层中要素图层的显示问题。欢迎大家持续关注。
-----欢迎转载,但保留版权,请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/
如果您觉得本文确实帮助了您,可以微信扫一扫,进行小额的打赏和鼓励,谢谢 ^_^
(十四)WebGIS中地图放大缩小的设计和实现的更多相关文章
- (十五)WebGIS中平移功能的设计和实现
文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/. 1.前言 这一章我们将详细讲解WebGIS工具栏中另一个基础工具——平 ...
- (十二) WebGIS中矢量图层的设计
文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/. 1.前言 在前几章中我们已经了解了什么是矢量查询.屏幕坐标与地理坐标之 ...
- (十九)WebGIS中I查询的原理及设计(包含AGS、GeoServer、Supermap)
文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/. 1.背景 我们在使用arcmap时,经常会用到被称为I查询的工具.具体 ...
- (十六)WebGIS中偏移补偿量引发的问题之探讨
文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/. 1.背景 在上一章里讲解地图平移功能的实现时,我在最后提出了两个问题: ...
- SLAM十四讲中Sophus库安装
Sophus截止目前有很多版本,其中大体分为两类,一种是用模板实现的方法,一种是用非模板类实现的,SLAM十四讲中使用的是非模板类库,clone Sophus: git clone http://gi ...
- (十八)WebGIS中清空功能和地图定位功能的设计以及实现
文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/. 1.背景 当地图中增加了很多元素后,对不同的元素需要进行一定的控制,最 ...
- (十)WebGIS中地理坐标与屏幕坐标间的转换原理
文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/. 1.前言 地图本身是拥有坐标的,一般可以大致分为平面坐标和经纬度坐标, ...
- (八)WebGIS中栅格图层的设计
文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/. 1. 前言 我们在上一章里了解到WebGIS中栅格图层的本质—— ...
- 以项目谈WebGIS中Web制图的设计和实现
文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/ 1.背景介绍 一般WebGIS项目中,前端展示数据的流程基本是先做数据入 ...
随机推荐
- Reversing Linked List
原题连接:https://www.patest.cn/contests/pat-a-practise/1074 题目: Given a constant K and a singly linked l ...
- CF2.BC
B. Arpa's obvious problem and Mehrdad's terrible solution time limit per test 1 second memory limit ...
- HTML5、canvas颜色拾取器
效果图: 代码: <!doctype html> <html lang="en"> <head> <meta charset=" ...
- js判断地址转向
<script type="text/javascript"> if (navigator.userAgent.search(/iphone|ipod|ipad|And ...
- SQL Server 事件通知(Event notifications)
一.本文所涉及的内容(Contents) 本文所涉及的内容(Contents) 背景(Contexts) 基础知识(Rudimentary Knowledge) 事件通知监控DDL(NotifyQue ...
- 最流行的编程语言 JavaScript 能做什么?
此文转载oschina文章 首先很遗憾的一点是,“PHP虽然是最好的语言”,但是它不是最流行的语言. 同时对不起的还有刚刚在4月TIOBE编程语言排行榜上上榜的各个语言: 你们都很棒,但是你们都担当不 ...
- Jenkins常用插件说明(持续更新)
本文主要记录在学习以及使用Jenkins过程中常用的对我们有帮助的插件,同时本文将会持续进行更新.如果大家发现有其他野很好用的插件,也欢迎参照下面的格式,在评论中进行回复反馈. 一.通用插件 1.Em ...
- alias指令:设置命令别名
alias: usage: alias [-p] [name[=value] ... ] 1. 语法 alias [参数][命令别名]=[原命令名称] 2. 功能介绍 该指令主要用于为原命令 ...
- IoC在ASP.NET Web API中的应用
控制反转(Inversion of Control,IoC),简单地说,就是应用本身不负责依赖对象的创建和维护,而交给一个外部容器来负责.这样控制权就由应用转移到了外部IoC容器,控制权就实现了所谓的 ...
- 可扩容分布式session方案
分布式session有以下几种方案: 1. 基于nfs(net filesystem)的session共享 将共享服务器目录mount各服务器的本地session目录,session读写受共享服务器i ...