苹果地图未显示地图叠加层

时间:2018-10-11 21:32:40

标签: mapkit geojson apple-maps

我对创建Apple Map Overlay有疑问。我正在尝试从JSON文件设置奇形叠加。我已经在Stack Overflow上对此进行了研究,并尝试了许多解决方案,但似乎没有一个可行。我的代码如下:

import UIKit
import MapKit
import CoreLocation

class ViewController: UIViewController, CLLocationManagerDelegate, MKMapViewDelegate, UIGestureRecognizerDelegate {

    @IBOutlet weak var mapView: MKMapView!

    var coordinate: CLLocationCoordinate2D?

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.

        mapView.showsUserLocation = true
        mapView.delegate = self
        mapView.mapType = .standard

        let gestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(self.TapGesture))
        mapView.addGestureRecognizer(gestureRecognizer)
    }

    func mapView(_ mapView: MKMapView, rendererFor overlay: MKOverlay) -> MKOverlayRenderer {
            if overlay is MKPolygon {
                let polygonView = MKPolygonRenderer(overlay: overlay)
                polygonView.strokeColor = UIColor.black
                polygonView.lineWidth = 0.5
                polygonView.fillColor = UIColor.blue
                return polygonView
            }
            return MKOverlayRenderer()
    }

    @objc func TapGesture(gesRect: UITapGestureRecognizer) {

        let location = gesRect.location(in: mapView)
        coordinate = mapView.convert(location,toCoordinateFrom: mapView)

        let locCoord = mapView.convert(location, toCoordinateFrom: mapView)
        print("Tapped at lat: \(locCoord.latitude) long: \(locCoord.longitude)")
        print("Tapped at: \(location)")

        self.retreiveShape() { (full_shape) in

            if let shape = full_shape {

                let polygon = MKPolygon.init(coordinates: shape, count: shape.count)

                self.mapView.addOverlay(polygon)
            } else {
                print("ARRAY EMPTY")
            }
        }
    }

   func retreiveShape(completion: @escaping ([CLLocationCoordinate2D]?) -> ()) {

        let path = Bundle.main.path(forResource: "shape", ofType: "json")
        var coord_array = [CLLocationCoordinate2D]()
        do {
            let data = try Data.init(contentsOf: URL.init(fileURLWithPath: path!))
            let json = try JSONSerialization.jsonObject(with: data, options: .allowFragments)
            if let dictionary = json as? [String: Any] {

                if let shape = dictionary["shape"] as? Array<Any>  {

                    for regions in shape {

                        guard let region = regions as? Array<Array<Array<Double>>> else {
                            print("NOT HAPPENING")
                            return
                        }
                        for sections in region {
                            for coord in sections {
                                print("LATITUDE: \(coord[0])", "LONGITUDE: \(coord[1])")
                                let coordinatesToAppend = CLLocationCoordinate2D(latitude: coord[0], longitude: coord[1])
                                coord_array.append(coordinatesToAppend)
                            }
                        }
                    }
                    completion(coord_array)
                }
            }
        } catch let error {
            print(error)
        }
    }

shape.json文件如下:

{
    "shape":[
        [
            [
                [-81.621199, 30.282314],
                [-81.613987, 30.281941],
                [-81.611277, 30.284743],
                [-81.602735, 30.284026],
                [-81.601978, 30.292561],
                [-81.596275, 30.290861],
                [-81.592406, 30.290182],
                [-81.571146, 30.28763],
                [-81.55922, 30.286602],
                [-81.559148, 30.291132],
                [-81.558633, 30.294747],
                [-81.55881, 30.312887],
                [-81.558601, 30.312888],
                [-81.558622, 30.316235],
                [-81.558313, 30.316828],
                [-81.552252, 30.320252],
                [-81.548471, 30.321618],
                [-81.527882, 30.323989],
                [-81.529486, 30.328076],
                [-81.537635, 30.336704],
                [-81.537706, 30.337221],
                [-81.538717, 30.338277],
                [-81.539343, 30.338462],
                [-81.542809, 30.341686],
                [-81.547286, 30.345211],
                [-81.552498, 30.348839],
                [-81.552559, 30.352445],
                [-81.577566, 30.352039],
                [-81.578098, 30.353324],
                [-81.578161, 30.35642],
                [-81.577294, 30.3596],
                [-81.576996, 30.366609],
                [-81.58011, 30.366553],
                [-81.580875, 30.37062],
                [-81.580844, 30.373862],
                [-81.581462, 30.374486],
                [-81.578114, 30.374236],
                [-81.572908, 30.374611],
                [-81.562232, 30.372303],
                [-81.551965, 30.366559],
                [-81.548676, 30.365568],
                [-81.540187, 30.378172],
                [-81.538175, 30.380467],
                [-81.538213, 30.387239],
                [-81.536613, 30.388739],
                [-81.512612, 30.392739],
                [-81.505211, 30.390739],
                [-81.490911, 30.392139],
                [-81.49085, 30.389014],
                [-81.489978, 30.389207],
                [-81.488818, 30.38775],
                [-81.489203, 30.389266],
                [-81.487056, 30.390019],
                [-81.481446, 30.391262],
                [-81.479505, 30.39117],
                [-81.477708, 30.390635],
                [-81.476792, 30.390609],
                [-81.476244, 30.391002],
                [-81.473212, 30.389422],
                [-81.472125, 30.388436],
                [-81.472225, 30.388071],
                [-81.474072, 30.386758],
                [-81.475085, 30.384287],
                [-81.474394, 30.381898],
                [-81.473246, 30.38059],
                [-81.473337, 30.380112],
                [-81.47295, 30.379864],
                [-81.472643, 30.380053],
                [-81.471914, 30.379532],
                [-81.471629, 30.378346],
                [-81.470845, 30.377256],
                [-81.468671, 30.376016],
                [-81.466871, 30.374481],
                [-81.465402, 30.374424],
                [-81.464374, 30.373764],
                [-81.465116, 30.373015],
                [-81.467728, 30.372493],
                [-81.469102, 30.371435],
                [-81.470279, 30.369931],
                [-81.472008, 30.370608],
                [-81.473695, 30.370041],
                [-81.471862, 30.370238],
                [-81.470952, 30.369737],
                [-81.471715, 30.369462],
                [-81.470506, 30.369378],
                [-81.469456, 30.368207],
                [-81.468051, 30.367707],
                [-81.46754, 30.366828],
                [-81.466905, 30.366464],
                [-81.467432, 30.366219],
                [-81.466928, 30.365735],
                [-81.465222, 30.365136],
                [-81.464909, 30.364103],
                [-81.46316, 30.362764],
                [-81.463369, 30.36188],
                [-81.462197, 30.361235],
                [-81.461151, 30.36123],
                [-81.46117, 30.360531],
                [-81.461878, 30.360305],
                [-81.461619, 30.359642],
                [-81.461873, 30.358669],
                [-81.461645, 30.358376],
                [-81.460504, 30.358329],
                [-81.46288, 30.357969],
                [-81.462786, 30.357137],
                [-81.461247, 30.355282],
                [-81.460556, 30.352518],
                [-81.46184, 30.340222],
                [-81.462497, 30.339325],
                [-81.465064, 30.337897],
                [-81.471588, 30.328301],
                [-81.472988, 30.318258],
                [-81.469123, 30.319481],
                [-81.450496, 30.320896],
                [-81.443818, 30.302908],
                [-81.442451, 30.301512],
                [-81.438991, 30.299798],
                [-81.437921, 30.298031],
                [-81.437696, 30.284657],
                [-81.438134, 30.283427],
                [-81.439935, 30.281191],
                [-81.440578, 30.279729],
                [-81.440309, 30.276152],
                [-81.441217, 30.271746],
                [-81.440891, 30.270368],
                [-81.440247, 30.269313],
                [-81.438555, 30.267721],
                [-81.43765, 30.266188],
                [-81.43705, 30.257116],
                [-81.441869, 30.256519],
                [-81.45385, 30.252008],
                [-81.466184, 30.251073],
                [-81.472173, 30.251296],
                [-81.491372, 30.251034],
                [-81.507105, 30.253603],
                [-81.510744, 30.253761],
                [-81.530261, 30.250144],
                [-81.56957, 30.249854],
                [-81.584658, 30.251369],
                [-81.586895, 30.251326],
                [-81.589607, 30.250593],
                [-81.593308, 30.248471],
                [-81.605497, 30.260294],
                [-81.621493, 30.282334],
                [-81.621199, 30.282314]
            ]
        ]
    ]
}

它应该在佛罗里达州杰克逊维尔的南侧创建一个奇怪的形状叠加层,但事实并非如此。调用完成块时,会将坐标添加到数组,但不会显示地图叠加层。有什么想法吗?

1 个答案:

答案 0 :(得分:0)

这有点尴尬。我按照注释中的建议进行了操作,并尝试使用具有9个顶点的形状。仍然没有用。然后,我将坐标从:

print("LATITUDE: \(coord[0])", "LONGITUDE: \(coord[1])")
                                let coordinatesToAppend = CLLocationCoordinate2D(latitude: coord[0], longitude: coord[1])

收件人:

print("LATITUDE: \(coord[1])", "LONGITUDE: \(coord[0])")
                                let coordinatesToAppend = CLLocationCoordinate2D(latitude: coord[1], longitude: coord[0])

它完美地工作。原来我的经纬度有误。