本文小白 仅供提醒
IOS地图的使用情况问题
1 创建地图 地图定位
map = [[MKMapViewalloc]initWithFrame:self.view.bounds];
// 只读属性 火星地图 - 火星坐标
map.showsUserLocation =YES;
// 标准地图
map.mapType =MKMapTypeStandard;
[self.viewaddSubview:map];
// 地图定位
locationManager = [[CLLocationManageralloc] init];
locationManager.delegate =self;
//要求CLLocationManager对象返回全部结果
[locationManagersetDistanceFilter:kCLDistanceFilterNone];
//要求CLLocationManager对象的返回结果尽可能的精准
[locationManagersetDesiredAccuracy:kCLLocationAccuracyBest];
[locationManagerstartUpdatingLocation];
2. 本人困扰的问题 火星坐标与实际的坐标关系
火星坐标 : 谷歌地图
地图坐标 实际的位置
火星坐标不能转到实际坐标 (不知道原因啊)
以下是实际坐标转火星坐标
#import <Foundation/Foundation.h>
#import <MapKit/MapKit.h>
@interface WGS_84 :NSObject
//判断是否已经超出中国范围
+(BOOL)isLocationOutOfChina:(CLLocationCoordinate2D)location;
//转GCJ-02
+(CLLocationCoordinate2D)transformFromWGSToGCJ:(CLLocationCoordinate2D)wgsLoc;
@end
#import "WGS-84.h"
const double a = 6378245.0;
const double ee = 0.00669342162296594323;
const double pi = 3.14159265358979324;
@implementation WGS_84
+(CLLocationCoordinate2D)transformFromWGSToGCJ:(CLLocationCoordinate2D)wgsLoc
{
CLLocationCoordinate2D adjustLoc;
if([selfisLocationOutOfChina:wgsLoc]){
adjustLoc = wgsLoc;
}else{
double adjustLat = [selftransformLatWithX:wgsLoc.longitude -105.0 withY:wgsLoc.latitude -35.0];
double adjustLon = [selftransformLonWithX:wgsLoc.longitude -105.0 withY:wgsLoc.latitude -35.0];
double radLat = wgsLoc.latitude /180.0 * pi;
double magic = sin(radLat);
magic =1 - ee * magic * magic;
double sqrtMagic = sqrt(magic);
adjustLat = (adjustLat *180.0) / ((a * (1 -ee)) / (magic * sqrtMagic) * pi);
adjustLon = (adjustLon *180.0) / (a / sqrtMagic *cos(radLat) * pi);
adjustLoc.latitude = wgsLoc.latitude + adjustLat;
adjustLoc.longitude = wgsLoc.longitude + adjustLon;
}
return adjustLoc;
}
//判断是不是在中国
+(BOOL)isLocationOutOfChina:(CLLocationCoordinate2D)location
{
if (location.longitude <72.004 || location.longitude >137.8347 || location.latitude <0.8293 || location.latitude >55.8271)
return YES;
return NO;
}
+(double)transformLatWithX:(double)x withY:(double)y
{
double lat = -100.0 +2.0 * x + 3.0 * y +0.2 * y * y + 0.1 * x * y +0.2 * sqrt(abs(x));
lat += (20.0 *sin(6.0 * x *pi) + 20.0 *sin(2.0 * x *pi)) * 2.0 /3.0;
lat += (20.0 *sin(y * pi) +40.0 * sin(y /3.0 * pi)) *2.0 / 3.0;
lat += (160.0 *sin(y / 12.0 *pi) + 3320 *sin(y * pi /30.0)) * 2.0 /3.0;
return lat;
}
+(double)transformLonWithX:(double)x withY:(double)y
{
double lon = 300.0 + x +2.0 * y + 0.1 * x * x +0.1 * x * y + 0.1 *sqrt(abs(x));
lon += (20.0 *sin(6.0 * x *pi) + 20.0 *sin(2.0 * x *pi)) * 2.0 /3.0;
lon += (20.0 *sin(x * pi) +40.0 * sin(x /3.0 * pi)) *2.0 / 3.0;
lon += (150.0 *sin(x / 12.0 *pi) + 300.0 *sin(x / 30.0 *pi)) * 2.0 /3.0;
return lon;
}
@end
//CLLocationManager委托方法
-(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations{
//得到newLocation
CLLocation *loc = [locations objectAtIndex:0];
//判断是不是属于国内范围
if (![WGS_84isLocationOutOfChina:[loc coordinate]]) {
//转换后的coord
coord = [WGS_84transformFromWGSToGCJ:[loc coordinate]];
}
}
// 定位后,移动到当前位置
- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation {
[locationManagerstopUpdatingLocation];
NSString *strLat = [NSStringstringWithFormat:@"%.4f",newLocation.coordinate.latitude];
NSString *strLng = [NSStringstringWithFormat:@"%.4f",newLocation.coordinate.longitude];
NSLog(@"Lat: %@ Lng: %@", strLat, strLng);
coord = CLLocationCoordinate2DMake(newLocation.coordinate.latitude,newLocation.coordinate.longitude);
float zoomLevel = 0.02;
MKCoordinateRegion region =MKCoordinateRegionMake(coord,MKCoordinateSpanMake(zoomLevel, zoomLevel));
[map setRegion:[mapregionThatFits:region] animated:YES];
[selfcreateAnnotationWithCoords:coord];
}