用到ios自带的定位,想把当前位置在地图上标记出来,定位位置很准确,但是定位的位置却没有在mapview控件的中央,有哪位碰到过这样得问题吗?
以下是代码
@implementation MyMap001ViewController
{
MKMapView *mapview;
CLLocationManager *locationManager;
}
-(void)viewDidLoad
{
mapview=[[MKMapView alloc]initWithFrame:CGRectMake(0, 0, 320, 460)];
mapview.showsUserLocation = YES;
mapview.mapType = MKMapTypeSatellite;
[self.view addSubview:mapview];
locationManager = [[CLLocationManager alloc] init];
locationManager.delegate = self;
[locationManager startUpdatingLocation];
}
- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation {
[locationManager stopUpdatingLocation];
NSString *strLat = [NSString stringWithFormat:@"%.4f",newLocation.coordinate.latitude];
NSString *strLng = [NSString stringWithFormat:@"%.4f",newLocation.coordinate.longitude];
NSLog(@"Lat: %@ Lng: %@", strLat, strLng);
CLLocationCoordinate2D coords = CLLocationCoordinate2DMake(newLocation.coordinate.latitude,newLocation.coordinate.longitude);
float zoomLevel = 0.002;
MKCoordinateRegion region = MKCoordinateRegionMake(coords,MKCoordinateSpanMake(zoomLevel, zoomLevel));
[mapview setRegion:[mapview regionThatFits:region] animated:YES];
}
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
本来就不在中点的。
给你个category,你加到工程中,在mapview需要显示CLLocationCoordinate2D的地方调用就行了。
MapViewUtil.h
#import <Foundation/Foundation.h> #import <MapKit/MapKit.h> @interface MKMapView (MapViewUtil) - (void)setCenterCoordinate:(CLLocationCoordinate2D)centerCoordinate zoomLevel:(NSUInteger)zoomLevel animated:(BOOL)animated; @endMapViewUtil.m
#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