我不知道 Swift、MapKit 和 Here Maps,所以我最有资格给出答案。 :)
就在这里。
由于您使用的是 GeoServer,请将其配置为将您的图层发布为 WMTS/切片图层,并使用与您在 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。如果您需要不同的坐标系,事情会变得复杂得多。
此外,您的目标坐标系必须“匹配”原始坐标系,即生成的边界框不会“旋转”。