MKMapView-显示可自定义网格线

问题描述 投票:-1回答:1

我希望这些线条在常规地图上可见,每个正方形代表1x1m。enter image description here

我调查了MKTileOverlay,但没有发现太多。是否可以在地图上显示网格线以及更改颜色?

ios swift mapkit mkmapview mktileoverlay
1个回答
1
投票

我为自己玩过的应用做了非常相似的事情。我的是在地图上放置彩色网格,以便在原位置周围每平方英里有15列和每行,因此您需要调整距离的计算,但相同的一般方法应该可行。该应用程序目前仅是一个原型,尚未进行优化(可以从viewDidLoad重构代码作为开始!),但是该代码应该足以使您入门。

var homeLocation: CLLocationCoordinate2D!
let metresPerMile = 1609.344
var degPerHorizEdge: Double!
var degPerVertEdge: Double!

override func viewDidLoad() {
   homeLocation = CLLocationCoordinate2D(latitude: 53.7011, longitude: -2.1071)
   let hd = CLLocation(latitude: homeLocation.latitude, longitude: homeLocation.longitude).distance(from: CLLocation(latitude: homeLocation.latitude + 1, longitude: homeLocation.longitude))
   let vd = CLLocation(latitude: homeLocation.latitude, longitude: homeLocation.longitude).distance(from: CLLocation(latitude: homeLocation.latitude, longitude: homeLocation.longitude + 1))
   let degPerHMile = 1 / (hd / metresPerMile)
   let degPerVMile = 1 / (vd / metresPerMile)
   degPerHorizEdge = degPerHMile / 15
   degPerVertEdge = degPerVMile / 15
   super.viewDidLoad()
   let gridController = GridController(for: gameID!)
   gridController.delegate = self
   let mapSize = CLLocationDistance(1.2 * metresPerMile)
   let region = MKCoordinateRegion(center: homeLocation, latitudinalMeters: mapSize, longitudinalMeters: mapSize)
   mapView.delegate = self
   mapView.showsUserLocation = true
   mapView.showsBuildings = true
   mapView.mapType = .standard
   mapView.setRegion(region, animated: true)
}          

override func viewDidAppear(_ animated: Bool) {
   super.viewDidAppear(animated)
   if let overlays = prepareOverlays() {
      mapView.addOverlays(overlays)
   }
}

func prepareOverlays() -> [MKPolygon]? {
   let topLeft = CLLocationCoordinate2D(latitude: homeLocation.latitude - 7.5 * degPerHorizEdge, longitude: homeLocation.longitude - degPerVertEdge * 7.5)
   var overlays = [MKPolygon]()
   var locations = [CLLocationCoordinate2D]()
      for y  in 0...14 {
         for x in 0...14 {
            locations.append(CLLocationCoordinate2D(latitude: topLeft.latitude + Double(x) * degPerHorizEdge, longitude: topLeft.longitude + Double(y) * degPerVertEdge))
         }
      }
   for coord in locations.enumerated() {
      let location = coord.element
      var corners = [location,    //has to be a var due to using pointer in next line
                CLLocationCoordinate2D(latitude: location.latitude + degPerHorizEdge, longitude: location.longitude),
                CLLocationCoordinate2D(latitude: location.latitude + degPerHorizEdge, longitude: location.longitude + degPerVertEdge),
                CLLocationCoordinate2D(latitude: location.latitude, longitude: location.longitude + degPerVertEdge)]
      let overlay = MKPolygon(coordinates: &corners, count: 4)
      overlay.title = "\(coord.offset)"
      overlays.append(overlay)
    }
    return overlays.count > 0 ? overlays : ni
 }

    //MARK:- MKMapViewDelegate

 extension MapViewController: MKMapViewDelegate {  
    func mapView(_ mapView: MKMapView, rendererFor overlay: MKOverlay) -> MKOverlayRenderer {
       // overlay is a WSW zone
       if let polygon = overlay as? MKPolygon {
          let renderer = MKPolygonRenderer(polygon: polygon)
          renderer.strokeColor = UIColor.gray.withAlphaComponent(0.4)
          renderer.fillColor = UIColor.orange.withAlphaComponent(0.5)
          renderer.lineWidth = 2
          return renderer
       }
          // overlay is a line segment from the run (only remaining overlay type)
       else {
          let renderer = MKPolylineRenderer(polyline: overlay as! MKPolyline)
          renderer.strokeColor = UIColor.blue.withAlphaComponent(0.8)
          renderer.lineWidth = 3
          return renderer
       }
      }
    }
© www.soinside.com 2019 - 2024. All rights reserved.