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都可以,只要你正确的设置切片方案的参数即可。
Openlayers系列(一)关于地图投影相关错误的解决方案的更多相关文章
- Linux 下Redis集群安装部署及使用详解(在线和离线两种安装+相关错误解决方案)
一.应用场景介绍 本文主要是介绍Redis集群在Linux环境下的安装讲解,其中主要包括在联网的Linux环境和脱机的Linux环境下是如何安装的.因为大多数时候,公司的生产环境是在内网环境下,无外网 ...
- OpenStack虚机相关错误
OpenStack配置起来还是挺麻烦的,特别是网络那块.虽然官方文档越来越清晰,但有时还是会出各种错.排错主要是看日志.看官方文档和google 以下就一些虚机相关常见的错误做一下总结(基于Iceho ...
- ASP.NET MVC+EF框架+EasyUI实现权限管理系列(15)-用户登录详细错误和权限数据库模型设计
原文:ASP.NET MVC+EF框架+EasyUI实现权限管理系列(15)-用户登录详细错误和权限数据库模型设计 ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇) ...
- 文件 "c:\Program Files\Microsoft SQL Server\MSSQL10.SQLEXPRESS\MSSQL\DATA\ttt.mdf" 已压缩,但未驻留在只读数据库或文件组中。必须将此文件解压缩。 CREATE DATABASE 失败。无法创建列出的某些文件名。请查看相关错误。 (.Net SqlClient Data Provider)
问题: 文件 "c:\Program Files\Microsoft SQL Server\MSSQL10.SQLEXPRESS\MSSQL\DATA\ttt.mdf" 已压缩,但 ...
- Atitit.故障排除系列---php 程序网站数据库错误排除流程
Atitit.故障排除系列---php 程序网站数据库错误排除流程 Php页面报告的错误不能定位到myusql的db配置上...字说是db conn err Mysql 接入错误...大概查看哈能不能 ...
- thinkphp5.0的验证码安装和相关错误
thinkphp5.0的验证码安装和相关错误 问题 只要是之前使用thinkphp5框架搭建网站的时候发现不管如何调用验证码都无法使用,按照官网要求,使用composer安装验证码出现报错Fatal ...
- Atitit.故障排除系列---php
计划网站数据库错误排除过程
Atitit.故障排除系列---php 计划网站数据库错误排除过程 Php页面报告的错误不能定位到myusql的db配置上...字说是db conn err Mysql 接入错误...大概查看哈能不能 ...
- 【Windows10 IoT开发系列】PowerShell的相关配置
原文:[Windows10 IoT开发系列]PowerShell的相关配置 可使用 Windows PowerShell 远程配置和管理任何 Windows 10 IoT 核心版设备.PowerShe ...
- 【FICO系列】SAP FICO 凭证错误:BKPFF$PRDCLN800在FI中达到的项目最大编号
公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[FICO系列]SAP FICO 凭证错误:BK ...
随机推荐
- css中margin为负数的深入研究
注:以下实验的元素均为块级元素,inline-block和inline本身对margin某些方向上都是无效的,所以这里不予讨论. margin-left或者margin-right为负数 当块元素wi ...
- 约定Jenkins构建脚本
对于Jenkins的使用,我感觉只用到其中一小部分功能,但也就是这一小部分功能,也推动了整个CI/CD的过程,Jenkins的使用方式有很多中,可能我用到的只是其中一种,但是已经满足我的需求,便不再贪 ...
- SpringCloud学习系列之四-----配置中心(Config)使用详解
前言 本篇主要介绍的是SpringCloud中的分布式配置中心(SpringCloud Config)的相关使用教程. SpringCloud Config Config 介绍 Spring Clou ...
- Caffe源码理解3:Layer基类与template method设计模式
目录 写在前面 template method设计模式 Layer 基类 Layer成员变量 构造与析构 SetUp成员函数 前向传播与反向传播 其他成员函数 参考 博客:blog.shinelee. ...
- js数组中的find(), findIndex(), filter(), forEach(), some(), every(), map(), reduce()方法的详解和应用实例
1. find()与findIndex() find()方法,用于找出第一个符合条件的数组成员.它的参数是一个回调函数,所有数组成员依次执行该回调函数,直到找出第一个返回值为true的成员,然后返回该 ...
- jqgrid three 树形结构
最近我们的表格中,需要更改数据的显示方式,就是jqgrid中以树形的方式显示.请先看图: 就是简单的这种从属方式.但是因为这个没有找到官方的文档(后来找到了,但是发现是翻译过来的,也不是很清楚),所以 ...
- js实现在当前页面搜索高亮显示字的方法
在html页面上,有时候会遇到一些检索高亮显示的问题,具体用js是实现的方式,代码展示. Jsp页面设置方式 <li class="pull-left" id="s ...
- ubuntu安装mysql没有让我设置密码
终端输入: sudo cat /etc/mysql/debian.cnf显示内容:# Automatically generated for Debian scripts. DO NOT TOUCH! ...
- Storm入门(十二)Twitter Storm: DRPC简介
作者: xumingming | 可以转载, 但必须以超链接形式标明文章原始出处和作者信息及版权声明网址: http://xumingming.sinaapp.com/756/twitter-stor ...
- 在WebStorm里配置watcher实现编辑less文件时自动生成.map和压缩后的.css文件
[文件(File)]-[设置(Settings)]-[工具(Tools)]-[File Watchers]-[+]-[Less]打开New Watcher配置界面. https://blog.csdn ...