高德地图 sdk 加载 geoserver 发布的瓦片地图服务

前言

最近,碰到了需求,想要在高德 sdk 中使用在 geoserver 里面发布的瓦片地图。

还好经过一番研究,在其官方文档中发现,从新版本(v1.4.3开始)的高德 sdk 开始,已经支持加载第三方 wms/wmts 服务了。

image.png

为了测试一下是否能用,我们先将官方的示例拷贝过来试一试。

wms 服务

先试试 wms 服务加载:

var wms = new AMap.TileLayer.WMS({
  url: "https://ahocevar.com/geoserver/wms",
  blend: false,
  tileSize: 512,
  params: {
    LAYERS: "topp:states",
    VERSION: "1.3.0",
  },
});
wms.setMap(map);

运行起来,你会发现,成功加载了 topp:states 这张矢量地图:


image.png

wmts 服务

再试试官方示例的 wmts 服务加载:

var wms = new AMap.TileLayer.WMTS({
  url:"https://services.arcgisonline.com/arcgis/rest/services/Demographics/USA_Population_Density/MapServer/WMTS/",
  blend: false,
  tileSize: 256,
  params: { Layer: "0", Version: "1.0.0", Format: "image/png" },
});
wms.setMap(map);

你会发现,也可以成功加载:


image.png

但是仔细研究这个示例,你会发现,官方提供的 wmts 服务是加载的 arcgis 提供的瓦片服务。

gwc 方式

我们知道,geoserver 仅提供 gwc 方式来访问 wmts 服务,并且使用 gwc 方式,还能提高瓦片的访问速率。

所以接下来我们研究一下,是否可以在高德 sdk 中,采用 geoserver 提供的 gwc 方式访问 wms 和 wmts 服务。

首先,研究一下 wms 方式,改一下之前的代码:

var wms = new AMap.TileLayer.WMS({
  url: "https://ahocevar.com/geoserver/gwc/service/wms",    // 改为 gwc 方式
  blend: false,
  tileSize: 512,
  params: {
    LAYERS: "topp:states",
    VERSION: "1.3.0",
  },
});

再次运行,发现并没有成功加载图层,打开控制台,看一下相关请求,可以发现会返回如下错误:

image.png

经过一番排查,发现参数里缺少了一个参数 SRS: "EPSG:3857" ,添加上以后,再次尝试:

var wms = new AMap.TileLayer.WMS({
  url: "https://ahocevar.com/geoserver/gwc/service/wms",
  blend: false,
  tileSize: 512,
  params: {
    LAYERS: "topp:states",
    VERSION: "1.3.0",
    SRS: "EPSG:3857",
  },
});
wms.setMap(map);

发现还是有问题:

image.png

瓦片大小对应不上,更改以后,再次尝试:

var wms = new AMap.TileLayer.WMS({
  url: "https://ahocevar.com/geoserver/gwc/service/wms",
  blend: false,
  tileSize: 256,
  params: {
    LAYERS: "topp:states",
    VERSION: "1.3.0",
    SRS: "EPSG:3857",
  },
});
wms.setMap(map);

发现可以成功加载。

image.png

那 wmts 的方式呢?

调整代码如下:

var wms = new AMap.TileLayer.WMTS({
  url: "https://ahocevar.com/geoserver/gwc/service/wmts",
  blend: false,
  tileSize: 256,
  params: { Layer: "topp:states", Version: "1.0.0", Format: "image/png" },
});
wms.setMap(map);

再次运行,发现不能正确获取到瓦片,提示如下错误:


image.png

发现提示请求的参数不正确,但是高德 sdk 官方文档里明确说了,不要添加 tilematrixset 等参数:

image.png

因此可以得出结论,对于 geoserver 的 gwc 方式,高德 sdk 仅支持 wms 服务,不支持 wmts 服务。

结论

如果想要在高德地图中加载 geoserver 发布的瓦片地图服务,得用 wms 的方式,使用方式如下:

var wms = new AMap.TileLayer.WMS({
  url: "https://ahocevar.com/geoserver/wms",
  blend: false,
  tileSize: 512,
  params: {
    LAYERS: "topp:states",
    VERSION: "1.3.0",
  },
});
wms.setMap(map);

或者 gwc 方式:

var wms = new AMap.TileLayer.WMS({
  url: "https://ahocevar.com/geoserver/gwc/service/wms",
  blend: false,
  tileSize: 256,
  params: {
    LAYERS: "topp:states",
    VERSION: "1.3.0",
    SRS: "EPSG:3857",
  },
});
wms.setMap(map);

如果要用 wmts 服务,得用 arcgis 发布的瓦片服务。由于博主也没用过,这里就不过多的涉及了。

如果你非要在高德 sdk 中使用 geoserver 提供的 wmts 服务,也不是没有方法。

你必须得修改 AMap.TileLayer.WMTS 这个类的源码才行,但是由于高德 sdk 并不开源,因此修改起来非常的困难,一般情况下建议直接放弃即可。

其实在高德 sdk 中加载第三方瓦片服务,还存在一个问题,因为高德地图用的是火星坐标系,因此与根据通用的 wgs84 坐标系生成的地图比,会存在偏差。

image.png

比如,下面,是我在高德 sdk 中叠加的我在 geoserver 中发布的影像图,我发布的影像图是未经过加密的,坐标系未 ESPG4326。


image.png

可以看到,当我选取了江苏常州的奥林匹克体育中心这一块,就会发现瓦片地图中奥林匹克体育中心的位置,与高德地图中的位置偏差了很多。

因此想要同时在高德底图上,叠加标准的第三方瓦片图,看起来并不现实。

虽然高德 sdk 提供了坐标转换的接口,但是我们想要实现纠偏,同样得改源码才能实现。

image.png

但是还是同样的问题,高德 sdk 并不开源,想要改源码,着实太困难,并且,对应的接口,也没有提供实现纠偏的参数或者方法。

其实还有一种方式,就是我们发布一张,火星坐标系的影像图。但是这更不可能,因为火星坐标系,由于保密需要,其设置偏移的时候,并不是采用一种公开的算法,而是随机加入偏移,想要保持与高德地图一致,得把我们的图发给高德 sdk 官方的人处理才行。

因此,总结一下,在高德地图 sdk 中加载 geoserver 发布的第三方影像图,确实能加载成功,但是目前不建议使用,除非接下来官方提供了标准地图纠偏相关的方案。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,088评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,715评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,361评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,099评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 60,987评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,063评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,486评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,175评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,440评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,518评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,305评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,190评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,550评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,880评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,152评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,451评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,637评论 2 335

推荐阅读更多精彩内容