Swift mkmapview 从纬度经度增量获取可见地图区域的缩放级别、宽度或半径

Swift mkmapview get zoom level, width or radius of visible map area from latitude longitude delta

我很困惑,关于如何获得地图可见区域的缩放级别和半径(使用 mapkit mapview)。

这是我要找的东西(根据需要,其中一个或两个)-

  1. 缩放级别,是为了查看地图在哪个级别显示给用户,根据该信息,我想在可见区域显示自定义图钉。如果缩放级别很高,我需要将一些商业商店的实际徽标显示为图钉。如果缩放级别低,我需要显示彩色点而不是徽标。

截至目前,我正在使用 let updatedRadius = (mapView.camera.altitude)/1000 获取相机的高度,如果更新的半径值 > 25.0,我将显示彩色点。低于 25.0,我显示徽标。我在 regionDidChanged 中这样做 这个方法正确吗?

  1. Radius,是将它作为参数发送到我的 REST API 以获取该半径内的地点列表。当用户在地图上缩小时,可见区域会增加,因此 REST API 需要更大的半径才能 return 该区域覆盖的地方。

最终,应该发生的是,每当用户缩小时,半径就会改变。我需要将这个更改后的半径发送到我的 REST 以获取更新的列表。

  1. 什么是纬度经度增量,我们可以使用这些值得到 radius/width 可见区域吗?

    let latitudeDeltaVal = mapView.region.span.latitudeDelta let longitudeDeltaVal = mapView.region.span.longitudeDelta

有人可以阐明需要做什么吗?

由于区域变化时需要调用api所以需要在mapView的委托函数中计算半径,RegionDidChange.

    func mapView(mapView: MKMapView, regionDidChangeAnimated animated: Bool) {
        let centralLocation = CLLocation(latitude: mapView.centerCoordinate.latitude, longitude:  mapView.centerCoordinate.longitude)
        self.centralLocationCoordinate = mapView.centerCoordinate

        print("Radius - \(self.getRadius(centralLocation))")

    }


    func getRadius(centralLocation: CLLocation) -> Double{
        let topCentralLat:Double = centralLocation.coordinate.latitude -  mapView.region.span.latitudeDelta/2
        let topCentralLocation = CLLocation(latitude: topCentralLat, longitude: centralLocation.coordinate.longitude)
        let radius = centralLocation.distanceFromLocation(topCentralLocation)
        return radius / 1000.0 // to convert radius to meters 
    }

为了同时考虑横向和纵向方向,and/or 地图方向接近东北、西北、西南、东南的情况,为了将整个屏幕包围到角落,应该同时考虑这两种情况latitudeDeltalongitudeDelta:

func getRadius() -> Double{
    let centralLocation = CLLocation(latitude: mapView.region.center.latitude, longitude: mapView.region.center.longitude)
    let cornerOfMap = CLLocation(latitude: centralLocation.coordinate.latitude + mapView.region.span.latitudeDelta , longitude: centralLocation.coordinate.longitude + mapView.region.span.longitudeDelta)
    let radius = centralLocation.distance(from: cornerOfMap)
    return radius / 1000.0 // to convert radius to meters
}