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

1.前言

地图本身是拥有坐标的,一般可以大致分为平面坐标和经纬度坐标,在这里我们统称为地理坐标,比如北京,(115.9°E ,39.6°N)和(506340,304400)均是其地理坐标,只是表示形式不同而已。
我们在上一章讲解了矢量图层中数据的来源,最后提出了一个还未解决的问题,即当我们获得了矢量数据后,如何在屏幕中将这些数据里的地理(Geometry)坐标转换为屏幕坐标,从而在屏幕端Canvas里的各个UIComponent(要素)中绘制出来?
这一章我们将对此转换做出讲解。

2.转换前提

实现屏幕坐标能与地理坐标进行转换的前提是:
1).知道屏幕的最左上角所对应的真实的地理坐标(screenGeoBounds.left, screenGeoBounds.top)。
2).知道此时的地图所在级别上每个瓦片所对应的实际地理长度(sliceLevelLength)。
3).知道瓦片的大小,即一个瓦片所拥有的屏幕像素(tileSize)。

3.如何获得这些前提参数

3.1 tileSize参数的获取

由于此参数为固定参数,所以获取十分简单,与实际中的瓦片大小一致即可。

3.2 sliceLevelLength参数的获取

此参数需要经过一定的算法才能获得,具体算法和原理可以在第三章《通过地理范围获取瓦片行列号》中得到详细的讲解。我这里直接给出公式:
resolution=scale*inch2centimeter/dpi;
sliceLevelLength=tileSize*resolution;
英文代表如下意思:
inch2centimeter:英寸转里面的参数。
Dpi:一英寸所包含的像素。
Resolution:单位像素所代表的实际单位长度。

3.3 screenGeoBounds的获取

此参数的实际意思是屏幕坐标上(0,0)所对应的地理坐标(screenGeoBounds.left, screenGeoBounds.top)。而screenGeoBounds却同时是不确定,动态变化的一个参数值。因为随着地图的平移、放大、缩小操作,此screenGeoBounds均会发生变化。
参考第三章内容(我们整个系统中,第三章的内容均是重点),我们可以知道,每一次我们触发瓦片请求时,都会重新计算出此时的屏幕四角坐标所对应的实际地理坐标。
并且,在以后章节中跟大家探讨WebGIS功能,当讲解地图平移功能时,我们还能了解到,事实上每次地图平移事件发生时,我们的屏幕四角坐标也会加减相同的地理平移量。

4.转换公式

下面我将给出基于tileSize、sliceLevelLength、screenGeoBounds三个参数的地理坐标与屏幕坐标互相转换的公式。

4.1 屏幕坐标转换为地理坐标

geoXY.x = screenGeoBounds.left + screenX * sliceLevelLength / tileSize;
geoXY.y = screenGeoBounds.top - screenY * sliceLevelLength / tileSize;

4.2 地理坐标转换为屏幕坐标

screenXY.x = (geoX - screenGeoBounds.left)/(sliceLevelLength/ tileSize);
screenXY.y = (screenGeoBounds.top - geoY)/(sliceLevelLength/ tileSize);

4.3 公式的简单解说

两个转换公式均是首先算出在屏幕上的一个像素所对应的单位地理长度后,再根据转换需求进行需要的转换。所需要注意的是,在真实的地图上,Y代表的是纬度,其越往上纬度越大,而在屏幕上,Y越往上走反而越小。所以仔细观察两种转换公式中关于纬度和屏幕Y坐标的转换就能发现这一点。

5.WebGIS中基于坐标转换公式的用法

这两个转换公式很多时候是配合使用的。比如有这样一个需求:鼠标点击在地图上后需要查询出鼠标点击处的要素属性信息,并且将该查询到的要素在地图上画出来(其实此需求是一个I查询的需求)。
我们的实现方法是先将鼠标点击处的屏幕坐标转换为地理坐标,然后加上tolerance后拼成一个Geometry范围,从前端发出I查询的请求URL,通过地理服务器得到返回的矢量数据,再在前端将矢量数据中的地理坐标转换为屏幕坐标,根据此屏幕坐标在UIComponent里绘出要素,并将矢量数据中携带的Atrributes进行解析作为查询所得的属性数据。
以下为此过程的流程图:

6.总结

在此章中,我们知道了如何将得到的矢量数据里的地理坐标转换为屏幕坐标,接下来我们要做的事情是在UIComponent中基于得到的屏幕坐标,绘制出要素的shape。在了解了矢量数的据获得方式以及矢量数据的用法后,在后面的两章里我们终于可以进行要素的设计和矢量图层的设计了。欢迎大家持续关注。

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

上研时和几个同门在北京待过一年,吃住工作学习都在一起,大家关系处的很好,所谓上过战场扛过枪的朋友。后来三个博士师兄都陆陆续续出了国。昨天,一个师兄跟我联系,说他又一篇SCI要发表了,由衷的为他感到高兴。想着当年我们两一心想组乐队,去中央音乐学院买教材,去大钟寺附近买吉他,晚上加班回去后还一起捣鼓捣鼓吉他的日子,真是太怀念。当然我也记得我们说过的豪言,他年我若为青帝,报与桃花一处开。不过我深知自己不是搞科研的料,所以后来没有如亲朋师长之愿继续读博,但是,亲爱的师兄,我从没停止过学习,希望能和异国他乡的你一样,每天进步一点点。祝你在那边一切都好。

时间: 2024-11-05 12:11:39

(十)WebGIS中地理坐标与屏幕坐标间的转换原理的相关文章

学完IT十八掌第1天java进制转换原理和补码存储方式

学习目标: java关键字.运算符.移位运算原理.条件判断.分支语句.分支条件循环.函数 学习方法: 视频学习.动手实验写作业 学习内容: java语法关键字: class    //类 interface //接口 byte      //字节   bit:位 short     //短整型  2个字节 int       //整型    4个字节 long      //长整型  8个字节 float     //浮点型  4个字节 double    //双精度浮点  8个字节 char 

(十一)WebGIS中要素(Feature)的设计

1.前言 在GIS中元素一般分为点元素,线元素,面元素以及symbol元素(特殊的点元素)等.与此对应,图层可以分为点图层,线图层,面图层以及标注图层等.从第9章到第10章,我给大家讲解了什么是矢量数据.矢量数据的来源.矢量数据的构造.以及矢量数据中的地理坐标与屏幕坐标之间的转换.在了解了这些概念和算法以及流程后,这一章我们将开始讲解设计出一个矢量图层前的最后一步,设计WebGIS中的要素(Feature). 2.要素设计的思路 2.1 需求 要素应该具有如下功能: (1)能够绘制出矢量数据的S

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

1.前言 在前几章中我们已经了解了什么是矢量查询.屏幕坐标与地理坐标之前的转换以及要素的设计,有了这些知识,这一章里我们终于可以进行矢量图层的设计了. 在Catalog里创建一个FeatureClass时,我们能够选择是创建点图层或者线图层或者面图层等.所谓点图层,即该图层中的要素只能是点,其他几个图层顾名思义,也是如此.那么在WebGIS中,我们同样也可以按照ArcGIS里的这个设计思路来设计我们的矢量图层,虽然这个方法是肯定可行的,但是在实际的业务需求中,如果按照这种点图层等来严格控制的话,

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

1.背景 在上一章里讲解地图平移功能的实现时,我在最后提出了两个问题: A.在地图平移后,矢量图层的canvas的XY都发生了变化,此时根据地理坐标转换为屏幕坐标公式得出的屏幕坐标,在canvas上能将要素正确显示吗? B.矢量图层canvas的原点坐标XY有需要还原成初始的(0,0)的时候吗? 对这两个问题我给出的答案是:不能和需要. 在这一章里,我们将详细讲解得出这两个答案的原因. 2.何为偏移补偿量? 在地图平移时,我们做了两个操作:一个是对MapCanvas的原点坐标XY进行了变化,第二

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

1.前言 这一章我们将详细讲解WebGIS工具栏中另一个基础工具——平移工具(Pan).在介绍命令模式时,我们已经知道了此工具为Tool型的. 这个工具主要有如下两个功能: A.当切换到此工具上时,按下鼠标不放,移动鼠标时可以拖动地图. B.当切换到此工具上时,点击鼠标(鼠标不做平移),可以使地图平移,以点击处为中心. 2.设计 2.1 原理 我们已经知道,WebGIS中图层的本质是Canvas.平移效果的实现,其实质就是改变各Canvas的左上角坐标. 这里我给出示意图: 2.2提一个问题 当

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

1.背景 我们在使用arcmap时,经常会用到被称为I查询的工具.具体功能便是,当激活I查询功能后,鼠标点击到某个要素上时,界面上会弹出一个对话框用来显示该要素的各属性信息.该功能截图如下: 2.原理 在WebGIS中设计和实现该功能之前,我们有必要对该功能的原理做一个了解. 在OGC的WMS标准中规定了一个接口:GetFeatureInfo.该接口的功能描述便是:根据屏幕坐标.当前视图范围等参数,获得屏幕坐标某处要素的信息. 在OGC的WFS标准中也规定了一个接口:GetFeature.该接口

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

1.背景 当地图中增加了很多元素后,对不同的元素需要进行一定的控制,最简单的控制就是能对元素有选择的进行清空删除.在本节中,还将介绍WebGIS中另外一个常用功能,即地图定位功能.具体描述便是:当输入一个坐标点后,能够将地图缩放到该点处.下面我便就以上两个功能展开此章节的内容. 2.清空功能 2.1设计思路 根据功能点,我们可以将清空分为如下几个情形: a.清空某个或者指定个数元素 b.清空某类或多类元素 c.清空所有元素 在之前的矢量图层原理章节中,我已经就WebGIS中的矢量图层原理做了详细

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

1.背景 在上一章中,我们给出了整个工具栏设计的核心,使用命令模式,并设计了具体工具类所继承的基类——Command类.从这一章开始我们便正式进入了具体工具类的设计和实现. 放大和缩小工具是最基础的工具之一,其操作分为三种: a.点击地图,进行放大缩小 b.拉框,进行放大缩小 c.滚轮调控放大缩小 针对这三种操作方式,我们进行了不同的代码逻辑设计. 2.分析 a.滚轮调控地图放大缩小是一个固定的操作,即使切换到其他操作上时,此操作也应该同样生效.所以,将此功能应该放入到基类Command类中.

(九)WebGIS中的矢量查询(针对AGS和GeoServer)

1.前言 在第七章里我们知道了WebGIS中要素的本质是UIComponent,而矢量图层的本质是包含了n(n>=0)个UIComponent的Canvas.我们在UIComponent的graphics中,根据矢量数据画出矢量的形状(shape),并且将矢量数据的属性(attributes)赋予该UIComponent. 在接下来进行要素和矢量图层的设计前,我们有必要了解这四个问题 (1)矢量数据是什么? (2)矢量数据从何而来? (3)矢量数据如何组织的? (4)矢量数据得到后如何使用? 在