文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处: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中矢量图层的设计

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

  2. (十四)WebGIS中地图放大缩小的设计和实现

    文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/. 1.背景 在上一章中,我们给出了整个工具栏设计的核心,使用命令模式,并 ...

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

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

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

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

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

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

  6. React Native(十五)——RN中的分享功能

    终于,终于,可以总结自己使用RN时的分享功能了-- 为什么呢?且听我慢慢道来吧: 从刚开始接触React Native(2017年9月中旬)就着手于分享功能,直到自己参与公司的rn项目开发中,再到现在 ...

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

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

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

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

  9. Expo大作战(十五)--expo中splash启动页的详细机制

    简要:本系列文章讲会对expo进行全面的介绍,本人从2017年6月份接触expo以来,对expo的研究断断续续,一路走来将近10个月,废话不多说,接下来你看到内容,讲全部来与官网 我猜去全部机翻+个人 ...

随机推荐

  1. xss其他标签下的js用法总结大全

    前段时间我遇到一个问题,就是说普通的平台获取cookie的语句为↓           Default <script src=js地址></script> 1 <scr ...

  2. 如何生成报告来枚举出整个sharepoint环境中的每个页面所使用的所有webpart

    背景 我的公司的SharePoint环境中购买了大量的第三方webpart,比如Quick Apps, Telerik RadEditor, Nintex Workflow等等..这样做的好处就是成本 ...

  3. ADO.NET Entity Framework CodeFirst 如何输出日志(EF 5.0)

    ADO.NET Entity Framework CodeFirst 如何输出日志(EF4.3) 用的EFProviderWrappers ,这个组件好久没有更新了,对于SQL执行日志的解决方案的需求 ...

  4. ENode框架Conference案例分析系列之 - Quick Start

    前言 前一篇文章介绍了Conference案例的架构设计,本篇文章开始介绍Conference案例的代码实现.由于代码比较多,一开始就全部介绍所有细节,估计很多人接受不了,也理解不了.所以,我先进行一 ...

  5. iOS开发系列--C语言之预处理

    概述 大家都知道一个C程序的运行包括编译和链接两个阶段,其实在编译之前预处理器首先要进行预处理操作,将处理完产生的一个新的源文件进行编译.由于预处理指令是在编译之前就进行了,因此很多时候它要比在程序运 ...

  6. Linux 自动同步服务器时间

    200 ? "200px" : this.width)!important;} --> 介绍 Linux服务器运行久时,系统时间就会存在一定的误差,本篇文章就来介绍怎样使服务 ...

  7. 表格搞定 Asp.net Web 状态管理

    最近在网上搜罗了 ASP.NET WEB 状态管理方面的一些内容,终于把这些内容整合总结了一下. 1. 希望自己通过整理,能够掌握一些,为自己投资. 2. 以便自己忘记,又要浪费时间搜罗. 3. 希望 ...

  8. ASP.NET MVC 5 - 视图

    在本节中,你要去修改HelloWorldController类,使用视图模板文件,在干净利索地封装的过程中:客户端浏览器生成HTML. 您将创建一个视图模板文件,其中使用了ASP.NET MVC 3所 ...

  9. [Linux]Linux下安装和配置solr/tomcat/IK分词器 详细实例一.

    在这里一下讲解着三个的安装和配置, 是因为solr需要使用tomcat和IK分词器, 这里会通过图文教程的形式来详解它们的安装和使用.注: 本文属于原创文章, 如若转载,请注明出处, 谢谢.关于设置I ...

  10. Android Fragment 使用技巧

    1. Fragment 使用时要有一个无参构造函数 如果没有无参构造函数,而是像按照普通类来使用,只创建有参构造函数,则会出现 android.support.v4.app.Fragment$Inst ...