首页 > 解决方案 > 在 Swift 中将 WMS 图层添加到此处的地图

问题描述

我正在尝试将 WMS 图层添加到 Here Maps,但我没有在他们的文档中找到任何这样做的起点......而且我在这里也没有找到与此相关的任何内容。

有没有人在 Here Map 中使用过 WMS 图层?到目前为止,我设法在 MapKit 和 OpenLayers 中使用 WMS 图层。但客户也对基于 HereMaps 的方法感兴趣。

我的假设是,我需要从这里设置到我的地理服务器的 URL:

func mapTileLayer(_ mapTileLayer: NMAMapTileLayer, urlForTileAtX x: UInt, y: UInt, zoomLevel: UInt) -> String

但是如何将 xy 转换为边界框?

非常感谢任何帮助!

标签: swifthere-apiwms

解决方案


我不知道 Swift、MapKit 和 Here Maps,所以我最有资格给出答案。:)
就在这里。

由于您使用的是 GeoServer,请将其配置为将您的图层发布为 WMTS/切片图层,并使用与您在 Here Maps 中使用的任何内容相匹配的切片集配置(很可能是 Spherical Mercator/EPSG:900913)。那应该或多或少是标准设置(我上次看的时候)。

x在这种情况下,从,y和,创建一个 URL 是很简单的z,将类似于http://some-base.url/mygeoserver/.../${z}/${x}/${y}.png- 类似的东西。

您还可以在较高的缩放级别上打开切片缓存和预渲染切片以获得更好的性能。

如果您由于某种原因不能或不想配置切片图层,我想知道原因。:)

在这种情况下,您仍然可以计算图块坐标的边界框。请参阅以下链接:

http://www.maptiler.org/google-maps-coordinates-tile-bounds-projection/ https://wiki.openstreetmap.org/wiki/Slippy_map_tilenames#Tile_bounding_box

引用OSM Wiki

func tileToLatLon(tileX : Int, tileY : Int, mapZoom: Int) -> (lat_deg : Double, lon_deg : Double) {
    let n : Double = pow(2.0, Double(mapZoom))
    let lon = (Double(tileX) / n) * 360.0 - 180.0
    let lat = atan( sinh (.pi - (Double(tileY) / n) * 2 * Double.pi)) * (180.0 / .pi)

    return (lat, lon)
}

这导致EPSG:4326。如果您需要不同的坐标系,事情会变得更加复杂。

此外,您的目标坐标系必须“匹配”原始坐标系,即生成的边界框不会“旋转”。


推荐阅读