# 如果没有二次开发包怎么办?

做 GIS 开发的基本不外乎只用二次开发包,诸如神马百度地图 API,高德地图 API,天地图 API,ArcGIS API,OpenLayers API,这些 API 大大简化了我们的开发,就像为什么从技术上我们既可以用 C 开发 web 项目也可以用 Java 开发 Web 项目,但是实际生产环境中极少有人用 c 来开发 web 项目。

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

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

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

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

# 地图比例尺中的 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 代表每英寸的像素数),跟地图的单位也有关系

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

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

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

这里的 L06 表示的是瓦片所在地图的级别,R00001179d 表示的瓦片的行号,C0000a24e 为瓦片的列号。

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

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

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

dpi 是指每英寸的像素,也就是扫描精度。国际上都是计算一平方英寸面积内像素的多少。但随着数字输入,输出设备快速发展,大多数的人也将数字影像的解析度用 DPI 表示,(但较为严谨的人可能注意到,印刷时计算的网点(Dot)和电脑显示器的显示像素(Pixel)并非相同,所以较专业的人士,会用 PPI(Pixel Per Inch) 表示数字影像的解析度,以区分二者) -- 百度百科

在计算瓦片的行列号之前,我们需要得到图上一像素代表实际距离多少米。现在假设地图的坐标单位是米,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 米。

公式如下: var pixelDistance = map.getScale() /(OpenLayers.DOTS_PER_INCH * OpenLayers.INCHES_PER_UNIT.m);

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

# 平面坐标系中的比例尺

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

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

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

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

即:resolution*96/inch2centimeter

# 英寸转厘米所引发的问题

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

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

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

# 总结

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

java中比例尺,地图比例尺换算原理相关推荐

  1. webGIS学习(二)探究本质,WebGIS前端地图显示之地图比例尺换算原理 发布于 3 年前 作者 lzxue 7473 次浏览 来自 技术 1.没有豆浆机怎么办? 喝豆浆是我们早晨中基本

    1.没有豆浆机怎么办? 喝豆浆是我们早晨中基本必备的一环,油条豆浆,其乐融融.如果我问大家豆浆是怎么来的,五谷不分的人会说是用钱买的,了解有黄豆这会事的人会说是用豆浆机把黄豆磨出来的.如果我们再倒退十 ...

  2. 一文带你理解Java中Lock的实现原理

    转载自   一文带你理解Java中Lock的实现原理 当多个线程需要访问某个公共资源的时候,我们知道需要通过加锁来保证资源的访问不会出问题.java提供了两种方式来加锁,一种是关键字:synchron ...

  3. Java中HashMap底层实现原理

    Java面试绕不开的问题: Java中HashMap底层实现原理(JDK1.8)源码分析 这几天学习了HashMap的底层实现,但是发现好几个版本的,代码不一,而且看了Android包的HashMap ...

  4. java中的账户冻结原理_java可重入锁(ReentrantLock)的实现原理

    前言 相信学过java的人都知道 synchronized 这个关键词,也知道它用于控制多线程对并发资源的安全访问,兴许,你还用过Lock相关的功能,但你可能从来没有想过java中的锁底层的机制是怎么 ...

  5. Java中的垃圾回收原理

    用户程序(mutator)会修改还堆区中的对象集合,从存储管理器处获取空间,创建对象,还可一引入和消除对已有对象的引用. 当mutator不能"达到"某些对象的时候,这些对象就成了 ...

  6. java中Arrays.sort()实现原理

    2019独角兽企业重金招聘Python工程师标准>>> 先在网上找到一些说法: java中Arrays.sort使用了两种排序方法,快速排序和优化的合并排序. 快速排序主要是对哪些基 ...

  7. java迭代器的原理_小学生之Java中迭代器实现的原理

    一. 引言 迭代这个名词对于熟悉Java的人来说绝对不陌生.我们常常使用JDK提供的迭代接口进行java collection的遍历: Iterator it = list.iterator(); w ...

  8. 【Java】图解 Java 中的数据结构及原理

    原文:http://www.javastack.cn/article/2018/data-structure-and-the-principle-diagram/ 最近在整理数据结构方面的知识, 系统 ...

  9. 图解 Java 中的数据结构及原理,傻瓜也能看懂!

    最近在整理数据结构方面的知识, 系统化看了下Java中常用数据结构, 突发奇想用动画来绘制数据流转过程. 主要基于jdk8, 可能会有些特性与jdk7之前不相同, 例如LinkedList Linke ...

  10. 图解java_图解 Java 中的数据结构及原理!

    作者:大道方圆 cnblogs.com/xdecode/p/9321848.html 最近在整理数据结构方面的知识, 系统化看了下Java中常用数据结构, 突发奇想用动画来绘制数据流转过程. 主要基于 ...

最新文章

  1. python 入门笔记
  2. uart口图片_认识UART接口
  3. C语言goto语句的使用
  4. 【指标统计】删除失败遥控
  5. aidl生成java文件_Android AIDL自动生成Java文件测试
  6. ubuntu18 安装 chrome
  7. html基础--列表标签03,03HTML基础--列表标签
  8. USTC English Club Note20171014
  9. 基于gRPC服务发现与服务治理的方案
  10. IDA——动态调试Linux上的ELF文件(整合他人博客)
  11. 遇到的几个开机启动故障
  12. 【Linux】性能优化-linux命令nicstat 网络性能监控
  13. php solr 全文检索,全文检索可视化动态管理(二)--solr二次开发和solrj扩展
  14. Spark中sortByKey和sortBy对(key,value)数据分别 根据key和value排序
  15. vue 项目 创建表格
  16. 苹果App Store应用程序的下载链接地址
  17. JavaFX报错: Exception in thread WindowsNativeRunloopThread java.lang.NoSuchMethodError
  18. C++中string字符串查找某一子字符串所有出现过的位置,并计数
  19. Golang开发的CMS内容发布系统
  20. 用matlab画出时域波形,用Matlab画出信号的时域波形与频谱,观察它们的关系。.ppt...

热门文章

  1. 免费pdf转换成jpg图片方法
  2. java 去除图片背景_java如何去除图片中的白色背景
  3. 【电子商务突围物流瓶颈】南风窗商业杂志采访我的观点
  4. 个人收集的IT技术网站集合,涉及web前后端,大数据,UI设计等。
  5. com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Client does not support authen
  6. 【解决】 io.lettuce.core.RedisCommandExecutionException: ERR wrong number of arguments for 'set' command
  7. 你是如何转行的?转行容易吗?
  8. 数据库中的基本数据结构
  9. [wpa_supplicant]基于ubuntu的wpa_supplicant工具的安装与使用
  10. postman实现接口请求