如何在地图视图中设置缩放级别或半径?

时间:2016-04-16 11:51:44

标签: ios swift

美好的一天。我想知道如何在MapView上的当前位置设置像1公里半径

mapView.showsUserLocation = true

这可能吗?谢谢。

3 个答案:

答案 0 :(得分:1)

您可以按MKCoordinateSpanMake设置“缩放级别”。

试试这个:

mapView.setRegion(MKCoordinateRegion(center: CLLocationCoordinate2DMake(location.coordinate.latitude, location.coordinate.longitude), span: MKCoordinateSpanMake(0.05, 0.05)), animated: true)

答案 1 :(得分:0)

不是我的代码。也许它可以帮到你

extension MKMapView {

private var MERCATOR_OFFSET: Double {
    get {
        return 268435456
    }
}
private var MERCATOR_RADIUS: Double {
    get {
        return 85445659.44705395
    }
}
private var MAX_ZOOM_LEVEL: Double {
    get {
        return 19
    }
}

// MARK: -  Private functions
private func longitudeToPixelSpaceX (longitude: Double) -> Double {
    return round(MERCATOR_OFFSET + MERCATOR_RADIUS * longitude * M_PI / 180.0)
}

private func latitudeToPixelSpaceY (latitude: Double) -> Double {

    let a = 1 + sinf(Float(latitude * M_PI) / 180.0)
    let b = 1.0 - sinf(Float(latitude * M_PI / 180.0)) / 2.0

    return round(MERCATOR_OFFSET - MERCATOR_RADIUS * Double(logf(a / b)))
}

private func pixelSpaceXToLongitude (pixelX: Double) -> Double {
    return ((round(pixelX) - MERCATOR_OFFSET) / MERCATOR_RADIUS) * 180.0 / M_PI
}

private func pixelSpaceYToLatitude (pixelY: Double) -> Double {
    return (M_PI / 2.0 - 2.0 * atan(exp((round(pixelY) - MERCATOR_OFFSET) / MERCATOR_RADIUS))) * 180.0 / M_PI
}

private func coordinateSpanWithMapView(mapView: MKMapView, centerCoordinate: CLLocationCoordinate2D, andZoomLevel zoomLevel:Int) -> MKCoordinateSpan {

    // convert center coordiate to pixel space
    let centerPixelX = self.longitudeToPixelSpaceX(centerCoordinate.longitude)
    let centerPixelY = self.latitudeToPixelSpaceY(centerCoordinate.latitude)

    // determine the scale value from the zoom level
    let zoomExponent = 20 - zoomLevel
    let zoomScale = CGFloat(pow(Double(2), Double(zoomExponent)))

    // scale the map’s size in pixel space
    let mapSizeInPixels = mapView.bounds.size
    let scaledMapWidth = mapSizeInPixels.width * zoomScale
    let scaledMapHeight = mapSizeInPixels.height * zoomScale

    // figure out the position of the top-left pixel
    let topLeftPixelX = CGFloat(centerPixelX) - (scaledMapWidth / 2)
    let topLeftPixelY = CGFloat(centerPixelY) - (scaledMapHeight / 2)

    // find delta between left and right longitudes
    let minLng: CLLocationDegrees = self.pixelSpaceXToLongitude(Double(topLeftPixelX))
    let maxLng: CLLocationDegrees = self.pixelSpaceXToLongitude(Double(topLeftPixelX + scaledMapWidth))
    let longitudeDelta: CLLocationDegrees = maxLng - minLng

    // find delta between top and bottom latitudes
    let minLat: CLLocationDegrees = self.pixelSpaceYToLatitude(Double(topLeftPixelY))
    let maxLat: CLLocationDegrees = self.pixelSpaceYToLatitude(Double(topLeftPixelY + scaledMapHeight))
    let latitudeDelta: CLLocationDegrees = -1 * (maxLat - minLat)

    // create and return the lat/lng span
    let span = MKCoordinateSpanMake(latitudeDelta, longitudeDelta)

    return span

}

// MARK: - Public Functions

func setCenterCoordinate(centerCoordinate: CLLocationCoordinate2D, zoomLevel: Int, animated: Bool) {

    // clamp large numbers to 28
    let zoom = min(zoomLevel, 28)

    // use the zoom level to compute the region
    let span = self.coordinateSpanWithMapView(self, centerCoordinate:centerCoordinate, andZoomLevel:zoom)
    let region = MKCoordinateRegionMake(centerCoordinate, span)

    // set the region like normal
    self.setRegion(region, animated:animated)

}

func getZoomLevel() -> Int {
    let longitudeDelta = self.region.span.longitudeDelta
    let mapWidthInPixels = self.bounds.size.width*2 //2 is for retina display
    let zoomScale = longitudeDelta * MERCATOR_RADIUS * M_PI / Double((180.0 * mapWidthInPixels))
    var zoomer = MAX_ZOOM_LEVEL - log2(zoomScale)
    if zoomer < 0 {
        zoomer = 0
    }
    zoomer = round(zoomer)
    return Int(zoomer)
}

}

使用

mapView.setCenterCoordinate(mapView.centerCoordinate, zoomLevel: 17, animated: true)

答案 2 :(得分:0)

这里我将从当前位置添加到1公里半径的圆圈和地图显示区域约6平方公里。我认为它会对你有帮助。

// adding circle as overlay 
func addRadiusCircle(location: CLLocation){
    self.mapView.delegate = self
 //radius of 1000 meters     
    let circle = MKCircle(centerCoordinate: location.coordinate, radius: 1000 as CLLocationDistance)

    self.mapView.addOverlay(circle)
}

//circle design and coloring

func mapView(mapView: MKMapView, rendererForOverlay overlay: MKOverlay) -> MKOverlayRenderer {
    let circle = MKCircleRenderer(overlay: overlay)
    if overlay is MKCircle {
        circle.strokeColor = UIColor.blackColor()
        circle.fillColor = UIColor(red: 235/255, green: 174/255, blue: 13/255, alpha:0.3)
        circle.lineWidth = 1
    }
    return circle
}

// initial area to display on map

func centerMapOnLocation(location: CLLocation) {
    let coordinateRegion = MKCoordinateRegionMakeWithDistance(location.coordinate,
        6000, 6000)
    mapView.setRegion(coordinateRegion, animated: true)
}