您的位置:首页 > 编程语言

设置地图缩放等级的代码

2011-12-15 10:18 344 查看
Google 地图的 API 里有参数调整地图的缩放等级,但苹果的 MKMapView 里却没有这一功能,下面这段代码转自 http://troybrant.net/blog/,能帮你在
MapView 里实现地图缩放。

#import <Foundation/Foundation.h>

#import <MapKit/MapKit.h>

@interface MKMapView (MapViewUtil)

- (void)setCenterCoordinate:(CLLocationCoordinate2D)centerCoordinate

zoomLevel:(NSUInteger)zoomLevel

animated:(BOOL)animated;

@end

#import "MapViewUtil.h"

#define MERCATOR_OFFSET 268435456

#define MERCATOR_RADIUS 85445659.44705395

@implementation MKMapView (MapViewUtil)

#pragma mark -

#pragma mark Map conversion methods

- (double)longitudeToPixelSpaceX:(double)longitude

{

return round(MERCATOR_OFFSET + MERCATOR_RADIUS * longitude * M_PI / 180.0);

}

- (double)latitudeToPixelSpaceY:(double)latitude

{

return round(MERCATOR_OFFSET - MERCATOR_RADIUS * logf((1 + sinf(latitude * M_PI / 180.0)) / (1 - sinf(latitude * M_PI / 180.0))) / 2.0);

}

- (double)pixelSpaceXToLongitude:(double)pixelX

{

return ((round(pixelX) - MERCATOR_OFFSET) / MERCATOR_RADIUS) * 180.0 / M_PI;

}

- (double)pixelSpaceYToLatitude:(double)pixelY

{

return (M_PI / 2.0 - 2.0 * atan(exp((round(pixelY) - MERCATOR_OFFSET) / MERCATOR_RADIUS))) * 180.0 / M_PI;

}

#pragma mark -

#pragma mark Helper methods

- (MKCoordinateSpan)coordinateSpanWithMapView:(MKMapView *)mapView

centerCoordinate:(CLLocationCoordinate2D)centerCoordinate

andZoomLevel:(NSUInteger)zoomLevel

{

// convert center coordiate to pixel space

double centerPixelX = [self longitudeToPixelSpaceX:centerCoordinate.longitude];

double centerPixelY = [self latitudeToPixelSpaceY:centerCoordinate.latitude];

// determine the scale value from the zoom level

NSInteger zoomExponent = 20 - zoomLevel;

double zoomScale = pow(2, zoomExponent);

// scale the map’s size in pixel space

CGSize mapSizeInPixels = mapView.bounds.size;

double scaledMapWidth = mapSizeInPixels.width * zoomScale;

double scaledMapHeight = mapSizeInPixels.height * zoomScale;

// figure out the position of the top-left pixel

double topLeftPixelX = centerPixelX - (scaledMapWidth / 2);

double topLeftPixelY = centerPixelY - (scaledMapHeight / 2);

// find delta between left and right longitudes

CLLocationDegrees minLng = [self pixelSpaceXToLongitude:topLeftPixelX];

CLLocationDegrees maxLng = [self pixelSpaceXToLongitude:topLeftPixelX + scaledMapWidth];

CLLocationDegrees longitudeDelta = maxLng - minLng;

// find delta between top and bottom latitudes

CLLocationDegrees minLat = [self pixelSpaceYToLatitude:topLeftPixelY];

CLLocationDegrees maxLat = [self pixelSpaceYToLatitude:topLeftPixelY + scaledMapHeight];

CLLocationDegrees latitudeDelta = -1 * (maxLat - minLat);

// create and return the lat/lng span

MKCoordinateSpan span = MKCoordinateSpanMake(latitudeDelta, longitudeDelta);

return span;

}

#pragma mark -

#pragma mark Public methods

- (void)setCenterCoordinate:(CLLocationCoordinate2D)centerCoordinate

zoomLevel:(NSUInteger)zoomLevel

animated:(BOOL)animated

{

// clamp large numbers to 28

zoomLevel = MIN(zoomLevel, 28);

// use the zoom level to compute the region

MKCoordinateSpan span = [self coordinateSpanWithMapView:self centerCoordinate:centerCoordinate andZoomLevel:zoomLevel];

MKCoordinateRegion region = MKCoordinateRegionMake(centerCoordinate, span);

// set the region like normal

[self setRegion:region animated:animated];

}

@end
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: