在Swift中将WMS图层添加到此处地图

时间:2018-07-19 08:00:08

标签: swift here-api wms

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

有人在这里地图上拥有WMS图层的经验吗?到目前为止,我设法在MapKit和OpenLayers中使用WMS图层。但是客户也对基于HereMaps的方法感兴趣。

我的假设是,我需要从此处设置指向我的地理服务器的URL:

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

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

任何帮助都将不胜感激!

1 个答案:

答案 0 :(得分:1)

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

由于使用的是GeoServer,因此将其配置为将图层发布为WMTS / tile图层,并使用与您在Here Maps(最有可能是Spherical Mercator / EPSG:900913)中使用的图块集相匹配的图块集配置。那应该是或多或少的标准设置(我上次看)。

在这种情况下,从xyz创建URL很简单,就像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。如果您需要不同的坐标系,事情会变得更加复杂。

从某种意义上说,目标坐标系还必须“匹配”原始坐标系,以使生成的边界框不会“旋转”。