文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处: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中地图放大缩小的设计和实现的更多相关文章

  1. (十五)WebGIS中平移功能的设计和实现

    文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/. 1.前言 这一章我们将详细讲解WebGIS工具栏中另一个基础工具——平 ...

  2. (十二) WebGIS中矢量图层的设计

    文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/. 1.前言 在前几章中我们已经了解了什么是矢量查询.屏幕坐标与地理坐标之 ...

  3. (十九)WebGIS中I查询的原理及设计(包含AGS、GeoServer、Supermap)

    文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/. 1.背景 我们在使用arcmap时,经常会用到被称为I查询的工具.具体 ...

  4. (十六)WebGIS中偏移补偿量引发的问题之探讨

    文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/. 1.背景 在上一章里讲解地图平移功能的实现时,我在最后提出了两个问题: ...

  5. SLAM十四讲中Sophus库安装

    Sophus截止目前有很多版本,其中大体分为两类,一种是用模板实现的方法,一种是用非模板类实现的,SLAM十四讲中使用的是非模板类库,clone Sophus: git clone http://gi ...

  6. (十八)WebGIS中清空功能和地图定位功能的设计以及实现

    文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/. 1.背景 当地图中增加了很多元素后,对不同的元素需要进行一定的控制,最 ...

  7. (十)WebGIS中地理坐标与屏幕坐标间的转换原理

    文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/. 1.前言 地图本身是拥有坐标的,一般可以大致分为平面坐标和经纬度坐标, ...

  8. (八)WebGIS中栅格图层的设计

    文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/. 1.    前言 我们在上一章里了解到WebGIS中栅格图层的本质—— ...

  9. 以项目谈WebGIS中Web制图的设计和实现

    文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/ 1.背景介绍 一般WebGIS项目中,前端展示数据的流程基本是先做数据入 ...

随机推荐

  1. MySQL主从复制技术的简单实现

    配置环境: 主从服务器操作系统均为 ubuntu15.10 主从服务器MySQL版本均为 MySQL5.6.31 主服务器IP:192.168.0.178 从服务器IP:192.168.0.145 主 ...

  2. 免费SVN服务器笔记

    前言: 笔者有个项目,需要类似公司一样进行源代码管理.鉴于很多团队一样,对资金资源限制,只能寻找免费的SVN服务器 于是在BD上搜索一大推资料,很多都是google的,但是GG经常无法正常访问,给项目 ...

  3. 关于c++的 vector 容器的使用及创建方法

    1.vector向量容器的使用,vector具有自动管理的功能,可以进行元素的查找删除 创建方法: (1)  vector<int > v; 创建了一个v的容器,没指定容量: (2)  v ...

  4. Spring Rabbitmq HelloWorld实例

    之前的博客和大家分享了Rabbitmq的基本框架,及其工作原理,网址为 < http://www.cnblogs.com/jun-ma/p/4840869.html >.今天呢,想和大家一 ...

  5. 剑指Offer面试题:34.翻转单词顺序VS左旋转字符串

    一.题目一:翻转单词顺序 1.1 题目说明 题目一:输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变.为简单起见,标点符号和普通字母一样处理.例如输入字符串"I am a st ...

  6. Net作业调度(五)—quartz.net动态添加job设计

    介绍 在实际项目使用中quartz.net中,都希望有一个管理界面可以动态添加job,而避免每次都要上线发布. 也看到有园子的同学问过.这里就介绍下实现动态添加job的几种方式, 也是二次开发的核心模 ...

  7. K-均值聚类算法

    K-均值聚类算法 聚类是一种无监督的学习算法,它将相似的数据归纳到同一簇中.K-均值是因为它可以按照k个不同的簇来分类,并且不同的簇中心采用簇中所含的均值计算而成. K-均值算法 算法思想 K-均值是 ...

  8. C#设计模式之桥接

    IronMan之桥接 前言 前面的几个篇幅都是在讲"部件"的生产已经简简单单的使用,以后可能要对"部件"进行升级,不是不对它本身升级,是其它方式的升级,可以让它 ...

  9. WCF服务的异常消息

    原创地址:http://www.cnblogs.com/jfzhu/p/4055024.html 转载请注明出处 WCF Service发生异常的时候,客户端一般只能看见这样一个错误:“The ser ...

  10. 《Entity Framework 6 Recipes》中文翻译系列 (38) ------ 第七章 使用对象服务之动态创建连接字符串和从数据库读取模型

    翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 第七章 使用对象服务 本章篇幅适中,对真实应用中的常见问题提供了切实可行的解决方案. ...