失踪人口回归。
这次给大家介绍的是在openlayer中对在线瓦片地图进行平移。可以解决将高德/百度瓦片地图的偏移问题。
适用的场景:当某个在线瓦片地图的坐标系与我们需要的底图坐标系不同,我们很难对每一幅瓦片都使用特定的算法进行坐标修正再进行显示。比较方便的一种方法是对地图的所有瓦片进行平移,(然后在心里认为坐标已经纠正了)。
由于地球是个球体,地理学家为了方便的将球体上的地物在平面中展示,提出了各种投影坐标系,也就是由xy组成的平面坐标系,对我们中国的用户来说,看的比较多的就是类似于[12605635.286907528,3301707.372582343]的形式。而很多时候,尽管我们认为我们被告知现在使用的是地理坐标系,(比如说天地图使用的是CGCS2000坐标系,这是一种地理坐标系,也就是我们看的很多的经纬度,类似于[113.65465,25.64351]),但是为了能在平面中进行展示,也对地理坐标系进行了一定的转换(也就是投影)后显示,如下图。

将曲面转换为平面,不可避免的会产生形变,例如在这张图中南极洲的面积似乎就大于非洲,而不同的坐标系产生的形变往往也是不同的。所幸,当研究区域很小时,我们可以忽略由于投影或者其他参数的影响,认为两种坐标系下的结果都几乎没有形变
那么不同坐标系的转换问题就可以简化到只需要平移操作(当然,这并不标准,但往往够用)。
那么在疏通了上述逻辑后,下面就开始介绍怎么在openlayer中对瓦片地图进行平移。关于瓦片地图的原理,怪叔叔做了十分精彩的讲解。
这篇文章介绍的瓦片形式包括两种,分别是XYZ和TileArcGISRest,两种类型的平移方式也有一定区别。下面以两种实际需求来介绍

第一个需求是在天地图上叠加高德地图的路网实况图

高德的路网实况图是XYZ的形式:

    let projection1 = get("EPSG:3857");let projectionExtent = projection1.getExtent()let startResolution = getWidth(projectionExtent) / 256;let resolutions = new Array(22);for (let i = 0, ii = resolutions.length; i < ii; ++i) {resolutions[i] = startResolution / Math.pow(2, i);}let TopLeft=getTopLeft(projectionExtent)//var pianyi=[-655.17+80,410.55-40]let offset=[-655.17,410.55]// 针对高德转天地图的偏移量。并不是都是这个值let  tilegrid_roads  = new TileGrid({origin:[TopLeft[0]+offset[0],TopLeft[1]+offset[1]],          // 更改起点resolutions: resolutions,                                // 设置分辨率})let nowDate = new Date();let year = nowDate.getFullYear();let month = nowDate.getMonth() + 1;let today = nowDate.getDate();let hours = nowDate.getHours();let minutes = nowDate.getMinutes();let seconds = nowDate.getSeconds();if (month >= 1 && month<= 9) {month = "0" + month;}if (today >= 1 && today <= 9) {today = "0" + today;}let currentdate = year + "-" + month + "-" + today + " " + hours + ":" + minutes + ":" + seconds;let longTime = new Date(currentdate.replace(new RegExp("-", "gm"), "/")).getTime();return new TileLayer({title: '交通实况图',visible: true,source: new XYZ({tilePixelRatio: 1,tileGrid: tilegrid_roads,tileUrlFunction: function(tileCoord){let z = tileCoord[0]let x = tileCoord[1]let y = tileCoord[2]// y=-y-1 在js文件中可能要进行这步转换,在vue中反而不用。return 'http://tm.amap.com/trafficengine/mapabc/traffictile?v=1.0&;t=1&x=' + x + '&y=' + y + '&z=' + z + '&&t=longTime'}}),});

上述代码的关键是tileGrid的设置,TopLeft表示地图起点,我在上面的代码中设置了偏移量,那么瓦片就会整体偏移。

第二个需求是在天地图上叠加一个地方坐标系的地图

这个地图是在arcgis发布的服务,它的后缀可能是MapServer或者ImageServer这种,格式为TileArcGISRest。

      return new TileLayer({title: '影像',visible: true,source: new TileArcGISRest({url:"xxx/MapServer",tileLoadFunction:function(imageTile, src) {let url="http://222.240.228.72:8060"+src.substring(6)imageTile.getImage().src =reset_url(url)}}),function reset_url(url){let a=url.split("BBOX=")[1].split("&BBOXSR")[0]let temp=a.split("%2C")let head=url.split("MapServer")[0]+"MapServer/export?F=image&FORMAT=PNG32&TRANSPARENT=true&SIZE=320%2C320&BBOX="let tail="&BBOXSR=3857&IMAGESR=3857&DPI=113"let result=head+(parseFloat(temp[0])+60)+"%2C"+(parseFloat(temp[1])-40)+"%2C"+(parseFloat(temp[2])+60)+"%2C"+(parseFloat(temp[3])-40)+tail//这里的60,40是我用到的偏移量return result}

尽管TileArcGISRest格式也有tileGrid这个属性,但是按照上小节的方法却并不能生效,这是因为TileArcGISRest返回的url可以看成是一个动态的,当起点发生变化后,url中的BBOX的值也随之改变,那相当于搞了个寂寞。
发现url中的这一特性之后,那我们就只需要更改url中的BBOX值(也就是其范围矩形的值)即可。

最后,设置的偏移量在不同地方往往是不同的,需要自己试出一个相对最佳的值。另外,在文章的开头也提到了,这并不是完美的解决办法,因此不能保证偏移后地址就完全正确了,只是不会那么离谱。

参考文献:
1.瓦片地图原理
https://blog.csdn.net/qq_35732147/article/details/95061747?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522162279053416780261959727%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=162279053416780261959727&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2blogfirst_rank_v2~rank_v29-3-95061747.nonecase&utm_term=%E7%93%A6%E7%89%87&spm=1018.2226.3001.4450

在openlayer中对瓦片地图进行平移相关推荐

  1. Tiled 瓦片地图

    glory原创,首发于泰然,转载请注明出处 https://github.com/chukong/cocos-docs/blob/master/manual/framework/native/v3/t ...

  2. Tiled瓦片地图的使用

    Tiled软件使用的注意事项: 1️⃣文件的导入.图层文件的导入不能有中文名字,最好是先把需要的资源文件导入到工程的Resource文件夹中,让后到这个文件夹中导入Tiled软件,进行瓦片地图的绘制. ...

  3. tmx瓦片地图文件内容的解析与地图自动生成

    想在游戏中使用瓦片地图,但发现手动拼地图确实很麻烦,于是就想能不能自动生成地图.打开一个我编辑好的地图: 保存之后会是一个.tmx格式的文件,用文本编辑器打开这个文件,你会发现这个文件是一个xml文件 ...

  4. 瓦片地图服务器搭建步骤

    目录 一.系统环境以及软件要求 gcc 升级到5.4以上,推荐升级至最新版 mapnik 安装 安装nodejs 安装node-mapnik 数据库: PostgreSQL 地图数据下载以及使用 启动 ...

  5. Leaflet中加载离线OSM瓦片地图(使用OfflineMapMaker切割下载离线png地图文件)

    场景 Leaflet快速入门与加载OSM显示地图: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/122290880 上面加载显示 ...

  6. Openlayers中加载Geoserver切割的EPSG:900913离线瓦片地图并显示

    场景 Openlayers下载与加载geoserver的wms服务显示地图: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/114 ...

  7. 无偏移谷歌瓦片地址_[转]OpenStreetMap/Google/百度/Bing瓦片地图服务(TMS)

    开源与成熟商业的瓦片地图服务(TMS  2  WMTS),都有如下共同的特性,基本成为了标准: (1) 坐标系:WGS84 (2) 投影:墨卡托投影(Marcator,正轴等角圆柱投影) ------ ...

  8. ios 高德地图加载瓦片地图_OpenLayers加载高德地图离线瓦片地图

    谷歌地球离线瓦片下载使用"迈高图-地图数据下载器"(以下简称:迈高图),演示数据以湖南省长沙市7~16级瓦片数据为例. 下载演示数据 迈高图选择谷歌地球为当前地图源,地图图层选择为 ...

  9. ios 高德地图加载瓦片地图_OpenLayers加载谷歌地球离线瓦片地图

    本文使用OpenLayers最新版本V5.3.0演示:如何使用OpenLayer加载谷歌地球离线瓦片地图.OpenLayers 5.3.0下载地址为:https://github.com/openla ...

最新文章

  1. 目标检测中的特征冲突与不对齐问题
  2. 请立即弃用 Notepad++,还有 5 款更牛逼的选择!
  3. 由验证下载服务器性能得到的启示
  4. python和php可以一起用吗_Apache同时支持PHP和Python的配置方法
  5. Avalonia Beta 1对WPF做了很多改进
  6. 苹果手机透明桌面_原来苹果手机辨别真假很容易!查看桌面1个图标,就能轻松分辨...
  7. 翁同龢后人向上海博物馆捐赠两件重要家藏
  8. IOS多线程任务(综述篇)
  9. ant design Cascader 实现联动省市区数据
  10. CocoaChina2013开发者大会演讲稿-主会场-陈昊芝
  11. SVN 安装与使用教程总结
  12. python 字符串 换行_Python基础教程——字符串
  13. java简单小程序 生日快乐,微信生日祝福小程序,要一个祝朋友生日快乐的VB小程序。...
  14. c语言课程设计--太空战机,基于Funcode平台的软件课程设计
  15. matlab编辑器背景颜色,matlab编辑器颜色风格设置
  16. php 图片裁剪后保存,php – 如何保存裁剪的图像
  17. 日更第1天:Linux常用命令之dnf用法
  18. Excel拆分单元格内容(把一个单元格的内容拆分到多列)
  19. python--快速启动Server
  20. 神经元网络技术有限公司,神经网络网站

热门文章

  1. 学好AI和PS就能成为设计师?抱歉,你还缺个Adobe国际认证证书!
  2. BIGEMAP APP行车(走路)轨迹记录
  3. 学习科学与技术——六顶思考帽(小组研讨)
  4. 算法 {哈密顿路径,哈密顿环}
  5. 自制 | 纯手工自制一个16位RISC架构CPU
  6. scm中mysql作用_SCM系统的作用有哪些
  7. 新手村 - 第三站,认识均线系统
  8. linux内核打印前有buildroot,[教程]使用buildroot完全自定义自己的embedded linux系统(nand)...
  9. 坚果云+svn实现异地非局域网个人代码版本管理
  10. WIN7主题下载http://bbs.windows7en.com/?fromuid=896008