2016-04-16 118 views

回答

1

您可以通過MKCoordinateSpanMake設置「縮放級別」。

試試這個:

mapView.setRegion(MKCoordinateRegion(center: CLLocationCoordinate2DMake(location.coordinate.latitude, location.coordinate.longitude), span: MKCoordinateSpanMake(0.05, 0.05)), animated: true) 
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) 
0

這裏我加入圈子從當前位置到1公里半徑和地圖displaya約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) 
} 
相關問題