Как получить координаты широты / долготы из VisibleRegion с помощью Apple MapKit? - PullRequest
0 голосов
/ 28 мая 2019

Мне нужны координаты upperRight и bottomLeft видимого mapView.

В mapViewDidChangeVisibleRegion я получаю значения.

class ViewController: UIViewController, MKMapViewDelegate {

    @IBOutlet weak var mapView: MKMapView!

    var currentLocation: CLLocation!

    override func viewDidLoad() {
        super.viewDidLoad()

        self.mapView.delegate = self

        self.customizeMapView()

        currentLocation =  CLLocation(latitude: ( 37.334922), longitude: (-122.009033))

        self.centerMapOnLocation()

   }

    func customizeMapView(){
        self.mapView.showsBuildings = true
        self.mapView.showsCompass = true
        self.mapView.showsPointsOfInterest = true
        self.mapView.showsUserLocation = false
        self.mapView.userTrackingMode = .none
        self.mapView.showsZoomControls = true
        self.mapView.mapType = .satelliteFlyover       
    }

    func centerMapOnLocation(){

        let centerRegionCoordinate: CLLocationCoordinate2D = CLLocationCoordinate2D(latitude: currentLocation.coordinate.latitude, longitude: currentLocation.coordinate.longitude)

        let spanRegion:MKCoordinateSpan = MKCoordinateSpan(latitudeDelta: 0.0025, longitudeDelta: 0.0025)
        let mapRegion: MKCoordinateRegion = MKCoordinateRegion(center: centerRegionCoordinate, span: spanRegion)
        mapView.setRegion(mapRegion, animated: true)


    }

    func mapViewDidChangeVisibleRegion(_ mapView: MKMapView) {
        print("mapViewDidChangeVisibleRegion")
       /*
         0,0         +x




         +y

        */
        let upperRight = mapView.convert(CGPoint(x: self.view.frame.size.width, y: 0.0), toCoordinateFrom: self.view)
        let bottomLeft = mapView.convert(CGPoint(x: 0.0, y: self.view.frame.size.height), toCoordinateFrom: self.view)

        print("upperRight: \(upperRight) ")
        print("bottomLeft: \(bottomLeft) ")


    }

Я ожидаю, что координаты будут правильными, но я получаю -180.0.

Это значения, которые я получаю при первом запуске приложения:

upperRight: CLLocationCoordinate2D(latitude: -180.0, longitude: -180.0) 
bottomLeft: CLLocationCoordinate2D(latitude: -180.0, longitude: -180.0) 

Перемещение карты по горизонтали с помощью жеста:

upperRight: CLLocationCoordinate2D(latitude: -180.0, longitude: -180.0) 
bottomLeft: CLLocationCoordinate2D(latitude: 37.33245941071868, longitude: -122.01073312548439) 

Перемещение карты по вертикали с помощью жеста:

upperRight: CLLocationCoordinate2D(latitude: 37.33687329393082, longitude: -122.00780068382419) 
bottomLeft: CLLocationCoordinate2D(latitude: -180.0, longitude: -180.0) 

Перемещение карты по диагонали с помощью жеста:

upperRight: CLLocationCoordinate2D(latitude: 37.336306795130724, longitude: -122.00839348216184) 
bottomLeft: CLLocationCoordinate2D(latitude: 37.33126864523067, longitude: -122.01130820828396) 

Как правильно выполнить mapView.convert?

1 Ответ

2 голосов
/ 28 мая 2019

Вместо вычисления фрейма mapView для определения координат, я бы предпочел использовать MKCoordinateRegion, чтобы получить координаты ограничительного прямоугольника, например:

extension MKCoordinateRegion {

    var boundingBoxCoordinates: [CLLocationCoordinate2D] {
        let halfLatDelta = self.span.latitudeDelta / 2
        let halfLngDelta = self.span.longitudeDelta / 2

        let topLeftCoord = CLLocationCoordinate2D(
            latitude: self.center.latitude + halfLatDelta,
            longitude: self.center.longitude - halfLngDelta
        )
        let bottomRightCoord = CLLocationCoordinate2D(
            latitude: self.center.latitude - halfLatDelta,
            longitude: self.center.longitude + halfLngDelta
        )
        let bottomLeftCoord = CLLocationCoordinate2D(
            latitude: self.center.latitude - halfLatDelta,
            longitude: self.center.longitude - halfLngDelta
        )
        let topRightCoord = CLLocationCoordinate2D(
            latitude: self.center.latitude + halfLatDelta,
            longitude: self.center.longitude + halfLngDelta
        )

        return [topLeft, topRight, bottomRight, bottomLeft]
    }

}

Использование: Отображение аннотацийMKMapView вверху слева, вверху справа, внизу справа, внизу слева

class ViewController: UIViewController, MKMapViewDelegate {

    @IBOutlet var mapView: MKMapView!

    private let annotations: [MKPointAnnotation] = [MKPointAnnotation(), MKPointAnnotation(), MKPointAnnotation(), MKPointAnnotation()]

    override func viewDidLoad() {
        super.viewDidLoad()

        self.mapView.addAnnotations(annotations)

        let currentLocationCoordinate = CLLocationCoordinate2D(latitude: 37.334922, longitude: -122.009033)
        let spanRegion = MKCoordinateSpan(latitudeDelta: 0.0025, longitudeDelta: 0.0025)
        let mapRegion = MKCoordinateRegion(center: currentLocationCoordinate, span: spanRegion)
        mapView.setRegion(mapRegion, animated: true)
    }

    func mapView(_ mapView: MKMapView, regionDidChangeAnimated animated: Bool) {
        let bounds = mapView.region.boundingBoxCoordinates
        print("TopLeft: \(bounds[0])\nTopRight: \(bounds[1])\nBottomRight: \(bounds[2])\nBottomLeft: \(bounds[3])")
        for (i, coordinate) in bounds.enumerated() {
            self.annotations[i].coordinate = coordinate
        }
    }

}

, что дает

enter image description here

...