当前位置: 代码迷 >> 综合 >> geoserver发布tif 暨 通过高德api调用wmts服务 暨 epsg:4326转epsg:3857 暨 一些坑
  详细解决方案

geoserver发布tif 暨 通过高德api调用wmts服务 暨 epsg:4326转epsg:3857 暨 一些坑

热度:86   发布时间:2024-01-19 06:54:23.0

写在前面:因为不是专业,所以希望有大神不吝赐教。

用的工具有:tomcat-9.0.30; geoserver 2.11.2; Arc Map(ArcGis 10.4.1); Global Mapper 20 等必要编程环境

可能有用的网站:https://spatialreference.org/ ;

 https://docs.geoserver.org/stable/en/user/configuration/crshandling/coordtransforms.html

gdal: https://pan.baidu.com/s/1X9120CoHySWcUIV7FndaWQ

需求:通过高德api 访问一张坐标系为epsg:4326的tif图

因为tif图有三百多m,只能通过geoserver来曲线救国

高德1.4.5版本的api 已经支持了WMTS服务 https://lbs.amap.com/api/javascript-api/example/thirdlayer/wmts

第一步:部署tif图到geoserver

很顺利,添加工作区,添加数据存储,选择工作区,选择tif图数据,然后点击发布;这个网上教程很多。

然后因为高德说了,自己的api只支持epsg:3857,因此要自己额外加一个gridset,如下图查找epsg:3857, 添加18级level,level名改成高德要的那样,18级不够也可以再加

 然后回到之前发布的图层的Tile Cacheing ,如下保存即可,没什么大坑。

 你的wmts服务地址在欢迎界面里有写

 然后贴上高德代码即可,就是贴上栅格图会覆盖路网不知道怎么解决,倒是地名都会在上面

<!doctype html>
<html>
<head><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="initial-scale=1.0, user-scalable=no, width=device-width"><title>TileLayer.WMTS</title><style>html,body,#container {margin: 0;padding: 0;width: 100%;height: 100%;}</style>
</head>
<body>
<div id="container"></div>
<script src="http://webapi.amap.com/maps?v=1.4.5&key=你的高德key"></script>
<script>var map = new AMap.Map('container', {layers: [// 卫星new AMap.TileLayer.Satellite(),// 路网new AMap.TileLayer.RoadNet()],resizeEnable: true,zoom: 12,////center: [地图中心的经纬度]});var wms = new AMap.TileLayer.WMTS({url: '你的wmts服务地址',blend: false,tileSize: 256,params: {layer: '你的工作区:你的图层',style: '',Service: 'WMTS',Request: 'GetTile',Version: '1.0.0',Format: 'image/png',}});wms.setMap(map);</script>
</body>
</html>

结果发现epsg:4326的图即使发布成epsg:3857贴到高德地图上还是epsg:4326的坐标

第二步:把tif图 epsg:4326转成epsg:3857

我这门外汉被这一步坑惨了

安装ArcMap,添加数据,工具箱-》数据管理-》投影 , 发现只能转元素,不知是啥

工具箱-》数据管理-》栅格-》投影栅格 这个好像可以转tif图,投影栅格选择源坐标系为图层,目的坐标系为投影坐标系:Mercator(Auxiliary Sphere), 把导出的位置改成文件夹而不是默认的地理数据库,就可以把选择格式为tif了。ArcMap可能会出bug,选择工具栏里的地理处理,把后台的勾去掉即可。

图导出了,但是发现geoserver添加数据时,识别不了这个,会报如下这种错误Could not list layers for this store, an error occurred retrieving them: Failed to create reader from file:...

搜了下是说TIFF的头文件有问题或者geoserver无法识别投影坐标系,下了gdal,gdal_translate -of GTiff -scale 输入文件 输出文件 没有用。我也试了下这个 gdal_translate -of GTiff -co tiled=yes -a_srs epsg:3857  input.tif output.tif  也没有用,那么答案应该是geoserver不识别这坐标系,我还试着Global Mapper 又转了一遍,也没用。

Global Mapper 转是先添加文件,再在工具栏里的tools->configuration->projection 在search for epsg里搜3857,然后就可以转了,但转后的图会缩水不知道在哪有压缩选项。

最后只能用下鸡贼的方法,使用ArcMap的地图校准,虽然GM也有,但我没找着。

ArcMap右键工具栏勾选地理配准,先去掉自动校正,然后点击在地图上添加控制点,右键x与y填写经纬度,填的经纬度当然是从高德地图上的啦。

可以从高德开发平台页面,开发者工具,坐标拾取器里找到。

控制点根据网上教程最好找马路交叉点。觉得控制点加的差不多了,再勾上自动校正。然后点更新地理配准把坐标改到原图上,校正是新生成一个图,我试了下geoserver也不识别,所以最好先复制一份。

因为手动校正有偏差,数据导出后会有一丝黑边,这黑边的颜色其实就是导出时的nodata。这就超出我的能力范围了,暂且可以凑合用。  黑边解决了参考这篇文章:https://blog.csdn.net/hayaqi0504/article/details/92793102

 

把校正好的图部署到geoserver,就行了。

最后,希望在以上任意操作有更好解决方法的大神能留言,谢谢