我正在使用GoogleMaps磁贴和GMSSyncTileLayer类使用自定义地图构建应用。由于某些原因,图块无法按预期渲染。这里提供了一个独立于坐标的单个图块(出于测试目的)。磁贴为256 * 256(由MapTiler制作),在本示例中,我希望此磁贴被重复并填充空间。我尝试了不同的layer.tileSize = 1024产生最大的图块,分别缩小512和256。显然,我不明白这里发生了什么。使用瓷砖的正确方法是什么?
class MapTileLayer: GMSSyncTileLayer {
override func tileFor(x: UInt, y: UInt, zoom: UInt) -> UIImage? {
// Return one specific 256*256 Map tile
let pathToImage = "MapTilesFolder/14/9370/4516"
if let tile = UIImage(named: pathToImage) {
return tile
} else {
return kGMSTileLayerNoTile
}
}
}
import UIKit
import GoogleMaps
class DetailViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
let camera = GMSCameraPosition.camera(withLatitude: 62.545144, longitude: 25.905153, zoom: 16.0)
let mapView = GMSMapView.map(withFrame: self.view.frame, camera: camera)
mapView.mapType = GMSMapViewType.none
view = mapView
let layer = MapTileLayer()
layer.tileSize = 1024
layer.map = mapView
// Creates a marker in the center of the map.
let marker = GMSMarker()
marker.position = CLLocationCoordinate2D(latitude: 62.545144, longitude: 25.905153)
marker.title = "Marker"
marker.snippet = "Place"
marker.map = mapView
}
}
并且结果在设备和模拟器上都看起来像这样。如果使用tileSize较小的结果,则只会产生更多的较小的tile,但不会覆盖整个区域。
无法使Google Maps SDK正常运行并移至Apple MapKit。使MapKit根据此处的示例工作:Advanced MapKit Tutorial: Custom Tiles。我需要对该示例进行的唯一更改是更改行的顺序,如下所述(Xcode 11.4):
func setupTileRenderer() {
let overlay = AdventureMapOverlay()
overlay.canReplaceMapContent = true
mapView.add(overlay, level: .aboveLabels) // move this below next line
tileRenderer = MKTileOverlayRenderer(tileOverlay: overlay)
}
更改是,“ mapView.addOverlay”行必须位于“ tileRenderer”行之后。方法“ mapView.add”的名称也已更改为“ mapView.addOverlay”。现在可以正常工作了。我怀疑我与GoogleMaps SDK最初遇到的问题可能是因为我在“ Assets.xcassets”中将这些磁贴添加到了普通文件夹中,如上述示例所示。我没有进行测试,因为我完全移动了代码以使用MapKit而不是GoogleMaps。