文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/。

1.前言

这一章我们将详细讲解WebGIS工具栏中另一个基础工具——平移工具(Pan)。在介绍命令模式时,我们已经知道了此工具为Tool型的。

这个工具主要有如下两个功能:

A.当切换到此工具上时,按下鼠标不放,移动鼠标时可以拖动地图。

B.当切换到此工具上时,点击鼠标(鼠标不做平移),可以使地图平移,以点击处为中心。

2.设计

2.1 原理

我们已经知道,WebGIS中图层的本质是Canvas。平移效果的实现,其实质就是改变各Canvas的左上角坐标。

这里我给出示意图:

2.2提一个问题

当我把栅格图层所对应的canvas也平移后(事实上,所有的栅格canvas都是一个母容器(mapCanvas)中的child,平移是直接操作mapCanvas),此时我们再将屏幕地理范围内的瓦片请求回来时,贴到已经平移后的canvas上,会不会出现瓦片显示错乱呢?

答案是:不会的。下面,我大致讲一下原因。

在我们做平移时,我们不是简单的只对canvas的原点做了平移,我们同时还会更具平移大小换算出真实的地理平移,然后对实际的屏幕地理范围进行相应的改变。这样便会导致一个这样的结果:加入栅格图层的canvas原点是A,平移后变成了A1,而平移后重新请求的瓦片,其每个瓦片的原点所对应的便是A1,而不再是A。这样,我们便解决了平移栅格图层后,重新请求瓦片而导致的瓦片错乱问题。

2.3 平移公式

mapCanvas.y=mapCanvas.y+moveY;

mapCanvas.x=mapCanvas.x+moveX;

screenGeoBounds.bottom=screenGeoBounds.bottom+(sliceLevelLength/tileSize)*(moveY);

screenGeoBounds.top=screenGeoBounds.top+(sliceLevelLength/tileSize)*(moveY);

screenGeoBounds.left=screenGeoBounds.left-(sliceLevelLength/tileSize)*(moveX);

screenGeoBounds.right=screenGeoBounds.right-(sliceLevelLength/tileSize)*(moveX);

其中,mapCanvas表示(栅格或矢量)图层,screenGeoBounds表示屏幕地理范围,slieceLevelLength表示地图当前级别中一个瓦片所代表的实际地理长度,tileSize表示的是一张瓦片的屏幕像素。

3.实现

3.1 拖拽平移的实现

A.当鼠标触发mouseDown事件时,给全局变量flag赋值true,表示鼠标已经点下,记录下startPoint。

B.当鼠标触发mouseMove事件时,判断flag是否为true,如果是,调用平移公式,使图层出现移动,算出屏幕像素的移动mouseX和mouseY。

这里还可以继续扩展,如果有其他图层或者功能需要监听到地图平移时间,可以抛出一个地图平移事件,抛出的参数可以设置为此时鼠标所在的地理坐标(通过鼠标的屏幕坐标转换而得),以及鼠标平移的地理长度(通过mouseX和mouseY转换而得)。屏幕坐标与地理坐标的转换可以参考这个系列的第十章。

C.当鼠标触发mouseUp事件时,判断屏幕地理范围加上移动的地理长度后,是否在整个瓦片请求的容差范围内,如果在的话不用触发瓦片请求;如果不在的话,则需触发瓦片请求。请求参数即为目前的屏幕地理范围加上容差范围。

3.2 点击平移的实现

A.当鼠标触发mouseDown事件时,给全局变量isClick赋值true,其他操作同上。

B.当鼠标触发mouseMove事件时,则将此isClick参数赋值false。

C.当鼠标触发mouseClick事件时,判断isClick是否为true,如果是true,则将地图平移到以startPoint为中心的地方。

4. 提两个问题

A.在地图平移后,矢量图层的canvas的XY都发生了变化,此时根据地理坐标转换为屏幕坐标公式得出的屏幕坐标,在canvas上能将要素正确显示吗?

B.矢量图层canvas的原点坐标XY有需要还原成初始的(0,0)的时候吗?

5.总结

对于第四节中的两个问题,我给出的答案分别是:不能和需要。解答这两个问题,我们必须将之前给出的地理坐标与屏幕坐标互转换公式和今天我们讲到的平移公式合起来看,才能做很好的回答。这个内容我们将在下一章专门进行讲解。欢迎大家持续关注。

-----欢迎转载,但保留版权,请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/

如果您觉得本文确实帮助了您,可以微信扫一扫,进行小额的打赏和鼓励,谢谢 ^_^

                                       

everybody,good night.

(十五)WebGIS中平移功能的设计和实现相关推荐

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

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

  2. 二十五.SLAM中Mapping和Localization区别和思考

    专栏系列文章如下: 一:Tixiao Shan最新力作LVI-SAM(Lio-SAM+Vins-Mono),基于视觉-激光-惯导里程计的SLAM框架,环境搭建和跑通过程_goldqiu的博客-CSDN ...

  3. 实验五、计数器逻辑功能和设计

    6.实验内容及步骤 (1)测试74HC161的逻辑功能,根据测试结果总结并描述其逻辑功能,表格自行完善. 表2.5.1  74HC161的功能表 (2)测试74HC390的逻辑功能,根据测试结果总结并 ...

  4. 现场签约及达成合作意向金额6.8亿多元 山东104家企业闪耀第十五届“中博会”

    10月10日至13日,第十五届中国国际中小企业博览会(以下简称中博会)在广州保利世贸博览馆举行.山东省共组织104家中小企业整体特装,分110个展位参展.参展企业现场签订合同及达成合作意向金额6.8亿 ...

  5. “GIS讲堂”第十课—WEBGIS中的地图图例

    概述: 本节课程讲述了WEBGIS中的地图图例的实现. 课程主题: 地图图例的实现 课程内容: 1.地图图例的概念 图例是集中于地图一角或一侧的地图上各种符号和颜色所代表内容与指标的说明,有助于更好的 ...

  6. CISSP的成长之路(十五):系统架构和设计之安全标准

    在实践中采购一个信息技术产品之前,我们一般都会先了解目标产品的安全程度.但如果由不同需求的人员来对产品进行评估,如果没有统一的标准,结果也是千差万别--这样就产生对统一标准的需求,因此世界上的许多国家 ...

  7. [unreal4入门系列之十五] UE4中的动态数组:TArray容器

    为什么使用UE4提供的容器类? 如果你用过C++的STL库,你就知道STL提供了各种各样的容器/数据结构,使得你对处理很多数据的时候非常快捷高效.UE4同样也提供了类似的库,库里面的类型是以T开头的, ...

  8. WPF入门教程系列十五——WPF中的数据绑定(一)

    使用Windows Presentation Foundation (WPF) 可以很方便的设计出强大的用户界面,同时 WPF提供了数据绑定功能.WPF的数据绑定跟Winform与ASP.NET中的数 ...

  9. Lumerical官方案例、FDTD时域有限差分法仿真学习(十五)——y分支的逆向设计(Inverse design of y-branch)

    来自 https://support.lumerical.com/hc/en-us/articles/360042305274 使用内置参数优化 (parametric optimization ,P ...

最新文章

  1. 用 gdb 调试 GCC 程序
  2. 关于JS 事件冒泡和onclick,click,on()事件触发顺序
  3. EMC升级Celerra 支持闪存及重复数据删除
  4. MySQL 重要函数实例
  5. hdu 2098 分拆素数和(一个偶数拆分成两个不同素数和 拆法数量)
  6. Star sky CodeForces - 835C
  7. 第九十一期:架构设计常用到的10种设计模式,你都知道吗?
  8. oracle 11g安装时设密码 database control,安装oracle 11g 保护Database Control时出错,Database Control已在非安全模式下启动...
  9. asp.net权限控制配置web.config
  10. 2个表 遍历 组合_分享一个python脚本--数字随机组合有多少
  11. android item 点击 获取position,Android ListView 子控件onClick正确获取position的方法
  12. 聊天室显示在线人数和已上线人数
  13. 了解一下Redis队列【缓兵之计-延时队列】
  14. python+selenium环境配置(windows7环境)
  15. 基于asp.net面向小商户的轻量级仓储管理系统
  16. go.js 删除节点
  17. 13种MongoDB的GUI简介
  18. Python基础教程目录
  19. 开机显示输入最佳预设值_电脑显示输入最佳预设值并重新开机是什么意思
  20. Unity-拓展篇-pr序列帧转透明视频

热门文章

  1. gcc 编译错误:undefined reference to 'sqrt'
  2. 宣布降低Windows Azure Storage的定价
  3. matplotlib - ax.bar()ax.pie()
  4. php glob() 列出目录及文件
  5. Tensorflow学习教程------tensorboard网络运行和可视化
  6. 数据结构——双向链表的实现
  7. Mac OS X中配置Apache
  8. ACM 博弈 只是总结 ( ZZ自奋斗哥 )
  9. ubuntu常见问题总结
  10. reporting services订阅