swift - 在 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 转换为边界框?
非常感谢任何帮助!
解决方案
我不知道 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。如果您需要不同的坐标系,事情会变得更加复杂。
此外,您的目标坐标系必须“匹配”原始坐标系,即生成的边界框不会“旋转”。
推荐阅读
- javascript - react native 中的嵌套列表组件
- excel - 如何在excel中将同一组中的表格中的损益组合在一起?
- javascript - TypeError:无法读取我的 api 中未定义的属性“地址”
- python - 如何从给定的索引数组中弹出列表中的元素?
- python - 如何在 bigquery 中插入一行 DATE 类型的列
- ruby - 测试 ruby 模块类方法不起作用
- python - 在 Python 中从网页中检索信息?
- flutter - 如何使用可扩展的颤振?
- mysql - Loopback 3 pure SQL query with params not working with 问号(有解决方案)
- javascript - 尝试使用 Fetch() 检索 JSON API 数据并包含在 HTML 文档中