我正在尝试在此处地图中添加WMS图层,但是在他们的文档中找不到这样做的起点...在这里我也没有找到任何与此相关的内容。
有人在这里地图上拥有WMS图层的经验吗?到目前为止,我设法在MapKit和OpenLayers中使用WMS图层。但是客户也对基于HereMaps的方法感兴趣。
我的假设是,我需要从此处设置指向我的地理服务器的URL:
func mapTileLayer(_ mapTileLayer: NMAMapTileLayer, urlForTileAtX x: UInt, y: UInt, zoomLevel: UInt) -> String
但是如何将x y转换为边界框?
任何帮助都将不胜感激!
答案 0 :(得分:1)
我不了解Swift,MapKit和Here Maps,所以我最有资格给出答案。 :)
在这里。
由于使用的是GeoServer,因此将其配置为将图层发布为WMTS / tile图层,并使用与您在Here Maps(最有可能是Spherical Mercator / EPSG:900913)中使用的图块集相匹配的图块集配置。那应该是或多或少的标准设置(我上次看)。
在这种情况下,从x
,y
和z
创建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。如果您需要不同的坐标系,事情会变得更加复杂。
从某种意义上说,目标坐标系还必须“匹配”原始坐标系,以使生成的边界框不会“旋转”。