MyException - 我的异常网
当前位置:我的异常网» GIS » Openlayers系列(一)关于map投影相关异常的解决方案

Openlayers系列(一)关于map投影相关异常的解决方案

www.MyException.Cn  网友分享于:2013-10-22  浏览:0次
Openlayers系列(一)关于地图投影相关错误的解决方案

背景

近期开发以MongoDB为基础的分布式地理数据管理平台系统,被要求做一个简单的demo给客户进行演示。于是笔者便打算向数据库中存储一部分瓦片数据,写一个简单的存取服务器,使用Openlayers客户端加载瓦片进行展示。本来是个挺简单的功能,可是谁曾想,“打了一辈子鹰,却被鹰啄瞎了眼”。在使用Openlayers客户端进行瓦片加载时,出现了加载的瓦片偏移、行列号不正确的问题。

问题描述

如图所示,地图出现了上下偏移的问题,并且,这些瓦片的实际行列号与当前Openlayers计算的行列号并不一致。

Arcgis Server切出的行列号分别是

上面一行瓦片是:104/50,105/50,106/50/107/50

下面一行瓦片是:104/49,105/49,106/49/107/49

Openlayers计算得到的行列号分别是

上面一行瓦片是:104/18,108/18,108/18/107/18

下面一行瓦片是:104/19,105/19,106/19/107/19

猜测及思路

看到行列号及瓦片的偏移,笔者的第一反应是切片方案存在问题。经过排查此次使用的ArcGIS Server采用的切片方案时Google切片方案(EPSG3857,web mercator投影坐标系)。而Openlayers默认采用的坐标系也是EPSG3857,正好吻合,按道理说应该毫无问题。可是既然出现了错误,那就要排查问题,修改错误。既然Arcgis Server的切片方案没问题,那就是Openlayers手动设置了不正确的坐标系。仔细观察果然发现,在Layer的source处将数据源的投影坐标设置为了EPSG4326。何其低级的错误,竟然花费了将近一个小时来排查。

解决方案

将Layer的source投影坐标系设置为3857即可。

 

补充说明

(一)出现上述错误的原因是Arcgis Server中发布的切片缓存使用了Google切片方案,该切片方案采用Web Mercator投影坐标系,以[-20037508,20037508]作为坐标原点,瓦片大小是256像素(具体的切片方案描述可以在ArcGIS Server Manager的相应服务中看到详细信息)。而本次出错的前端代码中将数据源的投影设置为EPSG:4326,与所发布服务的投影坐标系不匹配,导致Openlayers在计算行列号时无法计算出正确的结果,所以出现了加载错误。

Openlayers(2/3/4)默认采用EPSG:3857作为数据源的投影坐标系,该参数需要与后端的地图服务所采用的投影坐标系匹配才可正常加载地图,所以当我们采用Google的切片方案时(Web Mercator,也就是EPSG:3857),即使不设置Openlayers数据源的投影坐标系,也可正常加载。

Openlayers3的View中也有一个Projection参数,该参数为显示地图的坐标系,设置EPSG:4326或者EPSG:3857都可以,不影响数据的加载。唯一的不同就是,EPSG4326是WGS84地理坐标系,以经纬度为单位;EPSG3857是Web Mercator投影坐标系,以米为单位。如果将坐标系设置成4326,那么你是用openlayer从地图上获得的坐标数据都是经纬度坐标,向地图添加坐标点时,坐标点的数据也应该是经纬度坐标。如果不幸的你设置了4326坐标系,而手上的数据确是3857的投影坐标系数据,那么你有比较简便的方案解决这个问题:

1、 将View的Projection设置成epsg3857

2、 使用Openlayers提供的ol.proj.transform(coordinate, source, destination)方法,将3857坐标系的数据动态的转换成4326坐标系的数据。

(二)

地图服务的坐标系取决于切片方案里的设置,而非原tiff数据或者shp数据本身的坐标系。Google的切片方案采用的就是EPSG3857的投影,读者也可以自行定义切片方案,把坐标系设置为EPSG4326,或者GCJ2000都可以,只要你正确的设置切片方案的参数即可。

 

文章评论

旅行,写作,编程
旅行,写作,编程
初级 vs 高级开发者 哪个性价比更高?
初级 vs 高级开发者 哪个性价比更高?
“懒”出效率是程序员的美德
“懒”出效率是程序员的美德
程序猿的崛起——Growth Hacker
程序猿的崛起——Growth Hacker
 程序员的样子
程序员的样子
老程序员的下场
老程序员的下场
如何成为一名黑客
如何成为一名黑客
中美印日四国程序员比较
中美印日四国程序员比较
那些争议最大的编程观点
那些争议最大的编程观点
程序员都该阅读的书
程序员都该阅读的书
聊聊HTTPS和SSL/TLS协议
聊聊HTTPS和SSL/TLS协议
当下全球最炙手可热的八位少年创业者
当下全球最炙手可热的八位少年创业者
漫画:程序员的工作
漫画:程序员的工作
鲜为人知的编程真相
鲜为人知的编程真相
那些性感的让人尖叫的程序员
那些性感的让人尖叫的程序员
总结2014中国互联网十大段子
总结2014中国互联网十大段子
为啥Android手机总会越用越慢?
为啥Android手机总会越用越慢?
程序员最害怕的5件事 你中招了吗?
程序员最害怕的5件事 你中招了吗?
Java 与 .NET 的平台发展之争
Java 与 .NET 的平台发展之争
Web开发人员为什么越来越懒了?
Web开发人员为什么越来越懒了?
要嫁就嫁程序猿—钱多话少死的早
要嫁就嫁程序猿—钱多话少死的早
亲爱的项目经理,我恨你
亲爱的项目经理,我恨你
看13位CEO、创始人和高管如何提高工作效率
看13位CEO、创始人和高管如何提高工作效率
程序员的鄙视链
程序员的鄙视链
老美怎么看待阿里赴美上市
老美怎么看待阿里赴美上市
5款最佳正则表达式编辑调试器
5款最佳正则表达式编辑调试器
不懂技术不要对懂技术的人说这很容易实现
不懂技术不要对懂技术的人说这很容易实现
我跳槽是因为他们的显示器更大
我跳槽是因为他们的显示器更大
如何区分一个程序员是“老手“还是“新手“?
如何区分一个程序员是“老手“还是“新手“?
程序员和编码员之间的区别
程序员和编码员之间的区别
写给自己也写给你 自己到底该何去何从
写给自己也写给你 自己到底该何去何从
代码女神横空出世
代码女神横空出世
编程语言是女人
编程语言是女人
为什么程序员都是夜猫子
为什么程序员都是夜猫子
2013年中国软件开发者薪资调查报告
2013年中国软件开发者薪资调查报告
做程序猿的老婆应该注意的一些事情
做程序猿的老婆应该注意的一些事情
2013年美国开发者薪资调查报告
2013年美国开发者薪资调查报告
程序员眼里IE浏览器是什么样的
程序员眼里IE浏览器是什么样的
Java程序员必看电影
Java程序员必看电影
团队中“技术大拿”并非越多越好
团队中“技术大拿”并非越多越好
我是如何打败拖延症的
我是如何打败拖延症的
“肮脏的”IT工作排行榜
“肮脏的”IT工作排行榜
Google伦敦新总部 犹如星级庄园
Google伦敦新总部 犹如星级庄园
程序员应该关注的一些事儿
程序员应该关注的一些事儿
10个调试和排错的小建议
10个调试和排错的小建议
Web开发者需具备的8个好习惯
Web开发者需具备的8个好习惯
我的丈夫是个程序员
我的丈夫是个程序员
程序员必看的十大电影
程序员必看的十大电影
程序员的一天:一寸光阴一寸金
程序员的一天:一寸光阴一寸金
软件开发程序错误异常ExceptionCopyright © 2009-2015 MyException 版权所有