从底层谈WebGIS 原理设计与实现(二):探究本质,WebGIS前端地图显示之地图比例尺换算原理

作者:naaoveGI…    文章来源:http://www.cnblogs.com/naaoveGIS/    点击数:2453    更新时间:2014-9-12
摘要:前面我不厌其烦的给大家说了很多本节的题外话,现在言归正传,我们开始这个系列中的第一个问题,地图比例尺换算原理。想要从底层实现瓦片的显示,我们首先必须了解瓦片本身。我们用arcgis切完图后,打开发布的服务或者打开config.xml配置文件,可以看到所切之图的相关配置。

1.没有豆浆机怎么办?

喝豆浆是我们早晨中基本必备的一环,油条豆浆,其乐融融。如果我问大家豆浆是怎么来的,五谷不分的人会说是用钱买的,了解有黄豆这会事的人会说是用豆浆机把黄豆磨出来的。如果我们再倒退十几年,我相信见到过挑着担子卖豆浆的人就会给出一个更详细的答案了,先用水侵泡黄豆一夜,然后在器皿中充分捣碎,再用中火一直煮,并且要不断搅拌,直至浮沫消失,豆浆才做成了。

听到这个答案,很多人就会惊讶了,这么麻烦啊,还是有豆浆机方便。现在我提出一个问题,如果停电了,如果豆浆机坏了,如果你没有钱去买豆浆机,你还能自己做出豆浆吗?难道你就只能去买别人的豆浆喝?

2.如果没有二次开发包,怎么办?

如果我把已经有的地图数据比作黄豆,我问大家一个问题,如果我们的项目由于经费问题,不提供正版的Runtime,也不提供AGS的地形图服务,那我们该如何让浏览器来显示地形图呢?当然,有的人会指出一整套开源的方案,比如我用Geoserver啊等等。

那如果我再问你,假如有一天我们碰到了一个奇怪的业主,它跟你说,我们只想地图在第级别显示,我们只想地图显示某一区域,我们的要素太多太多了,我们希望能在地图拖动的时候动态的将可视范围内的要素加载上来,等等等等问题。如果你是一个只知道用豆浆机的人,你该如何完成这些刁钻的问题?

二次开发做到一定程度的人,也不会只局限在,C/S时加载MXD出个地图,B/S时写入一个地形图服务URL出个图的。他同样也必须了解,到底是如何将服务端一个一个瓦片变成浏览器里看到的一张完整的地图的。

这里我将连续花上几个篇幅来一一回答这个问题。

3.地图比例尺中的Scale和Resolution

前面我不厌其烦的给大家说了很多本节的题外话,现在言归正传,我们开始这个系列中的第一个问题,地图比例尺换算原理。想要从底层实现瓦片的显示,我们首先必须了解瓦片本身。

我们用arcgis切完图后,打开发布的服务或者打开config.xml配置文件,可以看到所切之图的相关配置。如图所示:

其中levels即为所切图的比例尺参数。每一层Level包含了一个resolution参数和一个scale参数。

Scale表示的是比例尺,即地图上的一厘米代表着实际上的多少厘米。例如地图上1厘米代表实地距离500千米,可写成:1 ∶ 50,000,000或写成:1/50,000,000。

Resolution表示的是分辨率。Resolution 的实际含义代表当前地图范围内,1像素代表多少地图单位(X地图单位/像素),地图单位取决于数据本身的空间参考。可见Resolution跟 dpi有关系(dpi代表每英寸的像素数),跟地图的单位也有关系。

4.行列号——瓦片存放地址的标识

在这里给大家再介绍一个GIS里的术语——行列号。我么可以这么想象,把一张矩形的地图,按照一定的规律(按照切图原点,切图范围,瓦片大小),分成了很多个大小相同的矩形,那么这个矩形所在位置,我么基本上是可以用Row和Col来表示出来。当然,如果我们了解影像金字塔这个概念,那么前面还要加上一个Level(影像级别),说通俗点就是你目前切割的这个矩形是属于整个影像中的哪一层的。

这里,我们先看看切完地图后,瓦片的存放路径,我以离散型瓦片(Exploded)为例:

这里的L06表示的是瓦片所在地图的级别,R00001179d表示的瓦片的行号,C0000a24e为瓦片的列号。这些数字是怎么算出来的,容我留着在后面的几章给大家一一来讲解。

不过这里我可以负责任的告诉大家,如果想知道行列号怎么换算,那么下面这个问题你必须知道答案。

屏幕上1像素代表实际距离是多少?

5.屏幕上1像素代表的实际距离是多少?

在计算瓦片的行列号之前,我们需要得到图上一像素代表实际距离多少米。现在假设地图的坐标单位是米,dpi为96 ;
    1英寸=2.54厘米; 
    1英寸=96像素; 
    最终换算的单位是米; 
    如果当前地图比例尺为1:125000000,则代表图上1米等于实地125000000米; 
    米和像素间的换算公式: 
    1英寸=0.0254米=96像素 
    1像素=0.0254/96 米 
    则根据1:125000000比例尺,图上1像素代表实地距离是 125000000*0.0254/96 = 33072.9166666667米。

6.平面坐标系和经纬度坐标系中的比例尺

6.1平面坐标系中的比例尺

当数据库为平面坐标系统时,此时系统中所需的比例尺应该从scale中取得。因为原scale中表示的实际单位是厘米,而我们系统中需要的单位是米,所以在填写地图比例尺时,会将scale除以一百后再填写。更具第二节中描写,我们可以在系统中换算出1像素代表了多少米。

6.2经纬度坐标系中的比例尺

当数据库为经纬度坐标系统时,此时系统中所需的比例尺应该从resolution中取得。此时的resolution直接代表了地图上一像素等于实际中的多少度。

但是,因为代码中已经有了一个如第二节中所描述的一个转换算法,所以此时在填写数据库中比例尺时,需要将此算法逆向换算后再填入。

即:resolution*96/inch2centimeter

7.英寸转厘米所引发的问题

英寸转厘米的国际参数是:2.5399998,当利用天地图或者其他第三方非AGS切图的地图时,都可使用这个参数值。

但是,当用AGS所切之图时,此参数变成了:2.54000508001016。这可能是AGS自己内部定义的一个转换参数。

根据参数的不同,当我们换算经纬度坐标系下的比例尺时,要根据不同的参数来进行转换。当是AGS地图时,则为:resolution*96/2.54000508001016。

8.总结

在了解屏幕上1像素代表实际距离多少是怎么算出来之后,我们可以进入下一章节了——根据地理范围换算出瓦片行列号的原理。

敬请大家持续关注,我将争取每一到两周做一次更新,如果工作繁忙,可能更新时间还会延后。这一系列我将大致写出20到25篇文章,其中涉及到原理,设计,实现方面的知识,其中可能有很多不对的地方,原谅我是一个在GIS领域只走了小小的一步的新人,原谅我资质的愚笨,容我冒昧的总结前人的成果,结合我的所思所想,和大家一起分享。

从底层谈WebGIS 原理设计与实现(二):探究本质,WebGIS前端地图显示之地图比例尺换算原理的更多相关文章

  1. (二)探究本质,WebGIS前端地图显示之地图比例尺换算原理

    文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/. 1.没有豆浆机怎么办? 喝豆浆是我们早晨中基本必备的一环,油条豆浆,其 ...

  2. 从底层谈,WebGIS 原理、设计、实现

    留待备用! http://www.cnblogs.com/naaoveGIS/category/600559.html 介绍与WebGIS相关的各种原理知识,以及基于原理知识上的程序设计和实现. (一 ...

  3. 从底层谈WebGIS 原理设计与实现(三):WebGIS前端地图显示之根据地理范围换算出瓦片行列号的原理(转载)

    从底层谈WebGIS 原理设计与实现(三):WebGIS前端地图显示之根据地理范围换算出瓦片行列号的原理 1.前言   在上一节中我们知道了屏幕上一像素等于实际中多少单位长度(米或经纬度)的换算方法, ...

  4. Atitit.字节数组转字符串 base64 base16 Quoted-printable 编码原理设计 attilax 总结

    Atitit.字节数组转字符串 base64 base16 Quoted-printable 编码原理设计 attilax 总结 1. Base64编码, 1 2. Base64实现转换原理1 3.  ...

  5. (三)WebGIS前端地图显示之根据地理范围换算出瓦片行列号的原理(核心)

    文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/. 1.前言 在上一节中我们知道了屏幕上一像素等于实际中多少单位长度(米或 ...

  6. WebGIS前端地图显示之根据地理范围换算出瓦片行列号的原理(核心)

    文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/. 1.前言 在上一节中我们知道了屏幕上一像素等于实际中多少单位长度(米或 ...

  7. 从底层谈WebGIS 原理设计与实现(六):WebGIS中地图瓦片在Canvas上的拼接显示原理

    从底层谈WebGIS 原理设计与实现(六):WebGIS中地图瓦片在Canvas上的拼接显示原理 作者:naaoveGI…    文章来源:naaoveGIS    点击数:1145    更新时间: ...

  8. 从底层谈WebGIS 原理设计与实现(五):WebGIS中通过行列号来换算出多种瓦片的URL 之在线地图

    从底层谈WebGIS 原理设计与实现(五):WebGIS中通过行列号来换算出多种瓦片的URL 之在线地图 作者:naaoveGI…    文章来源:naaoveGIS    点击数:2063    更 ...

  9. 从底层谈WebGIS 原理设计与实现(四):WebGIS中通过行列号来换算出多种瓦片的URL 之离线地图

    从底层谈WebGIS 原理设计与实现(四):WebGIS中通过行列号来换算出多种瓦片的URL 之离线地图 作者:naaoveGI…    文章来源:naaoveGIS    点击数:1759    更 ...

随机推荐

  1. summernote 如何设置为只读?

    从 summernote 的文档看到以下信息. disable, enable You can disable editor by API. $('#summernote').summernote(' ...

  2. 2019第1周日-MQ选型要点

    用消息中间件犹如小马过河,选择合适的才最重要,这需要贴合自身的业务需求,技术服务于业务.具体在选择上可从下面功能.性能.可靠性和可用性.运维管理.社区和生态.团队技术栈等维度来进行筛选. 具体技术选型 ...

  3. php比较全的友好时间显示

    分享一个php友好的比较完成的时间格式化函数,包括‘刚刚’,'几秒之前',‘几分钟前’,'几小时前',几天前,几周前,几个月前等.调用方式很简单,是从ThinkSNS 里面拿出来的. /** * 友好 ...

  4. 2013-8-6 ubuntu基本操作

    1,apt-get下载文件默认安装路径 apt-get 下载后,软件所在路径是什么?? /var/cache/apt/archives ubuntu 默认的PATH为 PATH=/home/brigh ...

  5. 解决在sass中使用calc不能包含变量的问题。

    今天写sass的时候,发现在sass中使用calc,如果calc中包含一个变量,不会产生效果,看代码: .app-inner { display: flex; height: calc(100% - ...

  6. 【转】C# 根据当前时间获取,本周,本月,本季度等时间段 .Net中Exception

    1 DateTime dt = DateTime.Now; //当前时间 2 3 DateTime startWeek = dt.AddDays(1 - Convert.ToInt32(dt.DayO ...

  7. 我的JdbcUtils类

    这是目录结构: 其中后面三个类都是第一个类的子类,第一个类是父类. JdbcUtils: package com.smt.db; import java.io.IOException; import ...

  8. bzoj3295 动态逆序对

    Description 对于序列A,它的逆序对数定义为满足i<j,且Ai>Aj的数对(i,j)的个数.给1到n的一个排列,按照某种顺序依次删除m个元素,你的任务是在每次删除一个元素之前统计 ...

  9. DevExpress 组件

    最近看到 伍华聪 的博客里, DevExpress 组件那个效果很好看,特别是 LookUpEdit GridLookUpEdit 这两个控件,完美改善了 WinForm 里的 ComboBox 今天 ...

  10. Linux常见英文报错中文翻译(菜鸟必知)

    Linux常见英文报错中文翻译(菜鸟必知) 1.command not found 命令没有找到 2.No such file or directory 没有这个文件或目录 3.Permission ...