手机
当前位置:查字典教程网 >编程开发 >IOS开发 >iOS中定位当前位置坐标及转换为火星坐标的方法
iOS中定位当前位置坐标及转换为火星坐标的方法
摘要:定位和位置信息获取定位和反查位置信息要加载两个动态库CoreLocation.framework和MapKit.framework一个获取坐...

定位和位置信息获取

定位和反查位置信息要加载两个动态库 CoreLocation.framework 和 MapKit.framework 一个获取坐标一个提供反查

复制代码 代码如下:

// appDelgate.h

#import <UIKit/UIKit.h>

#import <CoreLocation/CoreLocation.h>

#import <MapKit/MapKit.h>

@interface AppDelegate : UIResponder <UIApplicationDelegate,CLLocationManagerDelegate,MKReverseGeocoderDelegate>

@property (strong, nonatomic) UIWindow *window;

@end

复制代码 代码如下:

#import "AppDelegate.h"

@implementation AppDelegate

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

{

self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];

// Override point for customization after application launch.

self.window.backgroundColor = [UIColor whiteColor];

[self.window makeKeyAndVisible];

UIButton *button = [UIButton buttonWithType:UIButtonTypeContactAdd];

button.frame = CGRectMake(0, 100, 100, 30);

[button setTitle:@"定位" forState:UIControlStateNormal];

[button addTarget:self action:@selector(test) forControlEvents:UIControlEventTouchUpInside];

UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(0, 150, 320, 30)];

label.tag = 101;

label.text = @"等待定位中....";

[self.window addSubview:label];

[label release];

[self.window addSubview:button];

return YES;

}

-(void) test {

CLLocationManager *locationManager = [[CLLocationManager alloc] init];

// 设置定位精度,十米,百米,最好

[locationManager setDesiredAccuracy:kCLLocationAccuracyNearestTenMeters];

locationManager.delegate = self;

// 开始时时定位

[locationManager startUpdatingLocation];

}

// 错误信息

-(void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error {

NSLog(@"error");

}

// 6.0 以上调用这个函数

-(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations {

NSLog(@"%d", [locations count]);

CLLocation *newLocation = locations[0];

CLLocationCoordinate2D oldCoordinate = newLocation.coordinate;

NSLog(@"旧的经度:%f,旧的纬度:%f",oldCoordinate.longitude,oldCoordinate.latitude);

// CLLocation *newLocation = locations[1];

// CLLocationCoordinate2D newCoordinate = newLocation.coordinate;

// NSLog(@"经度:%f,纬度:%f",newCoordinate.longitude,newCoordinate.latitude);

// 计算两个坐标距离

// float distance = [newLocation distanceFromLocation:oldLocation];

// NSLog(@"%f",distance);

[manager stopUpdatingLocation];

//------------------位置反编码---5.0之后使用-----------------

CLGeocoder *geocoder = [[CLGeocoder alloc] init];

[geocoder reverseGeocodeLocation:newLocation

completionHandler:^(NSArray *placemarks, NSError *error){

for (CLPlacemark *place in placemarks) {

UILabel *label = (UILabel *)[self.window viewWithTag:101];

label.text = place.name;

NSLog(@"name,%@",place.name); // 位置名

// NSLog(@"thoroughfare,%@",place.thoroughfare); // 街道

// NSLog(@"subThoroughfare,%@",place.subThoroughfare); // 子街道

// NSLog(@"locality,%@",place.locality); // 市

// NSLog(@"subLocality,%@",place.subLocality); // 区

// NSLog(@"country,%@",place.country); // 国家

}

}];

}

// 6.0 调用此函数

-(void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation {

NSLog(@"%@", @"ok");

}

@end

转换为火星坐标

这个写的公共类叫做:GPScombineClass类主要展示GPS位置的定位,GPS坐标的获取,然后从手机坐标转换成火星坐标,继而在需要的情况下,由火星转百度 ,百度转火星的详细算法;

在GPScombineClass.h中

复制代码 代码如下:

#import <Foundation/Foundation.h>

#import <CoreLocation/CoreLocation.h>

#import "CSqlite.h"

#import <MapKit/MapKit.h>

@interface GPScombineClass : NSObject<MKMapViewDelegate>{

CLLocationManager *locationManager;

CSqlite *m_sqlite;

UILabel *m_locationName;

MKMapView *mainMapView;

@public CLLocationCoordinate2D baidulocation;

CLLocationCoordinate2D deleeverLocation;

}

-(void)OpenGPSmapView;

//在地图上放上自己的位置--外接接口

-(void)setMyMapPonitByMKMapView:(MKMapView *)MyMap;

@end

复制代码 代码如下:

@interface POI : NSObject <MKAnnotation> {

CLLocationCoordinate2D coordinate;

NSString *subtitle;

NSString *title;

}

@property (nonatomic,readonly) CLLocationCoordinate2D coordinate;

@property (nonatomic,retain) NSString *subtitle;

@property (nonatomic,retain) NSString *title;

-(id) initWithCoords:(CLLocationCoordinate2D) coords;

@end

在GPScombineClass.m中

复制代码 代码如下:

#import "GPScombineClass.h"

const double x_pi = 3.14159265358979324 * 3000.0 / 180.0;

@implementation GPScombineClass

-(void)OpenGPSmapView{

m_sqlite = [[CSqlite alloc]init];

[m_sqlite openSqlite];

if ([CLLocationManager locationServicesEnabled]) { // 检查定位服务是否可用

locationManager = [[CLLocationManager alloc] init];

locationManager.delegate = self;

locationManager.distanceFilter=0.5;

locationManager.desiredAccuracy = kCLLocationAccuracyBest;

[locationManager startUpdatingLocation]; // 开始定位

}

NSLog(@"GPS 启动");

}

// 定位成功时调用

- (void)locationManager:(CLLocationManager *)manager

didUpdateToLocation:(CLLocation *)newLocation

fromLocation:(CLLocation *)oldLocation

{

CLLocationCoordinate2D mylocation = newLocation.coordinate;//手机GPS

mylocation = [self zzTransGPS:mylocation];///转换成火星GPS

deleeverLocation=mylocation;

baidulocation=[self hhTrans_bdGPS:mylocation];//转换成百度地图

/*

//显示火星坐标

[self SetMapPoint:mylocation MKMapView:mainMapView];

/////////获取位置信息

CLGeocoder *geocoder = [[CLGeocoder alloc] init];

[geocoder reverseGeocodeLocation:newLocation completionHandler:^(NSArray* placemarks,NSError *error)

{

if (placemarks.count >0 )

{

CLPlacemark * plmark = [placemarks objectAtIndex:0];

NSString * country = plmark.country;

NSString * city = plmark.locality;

NSLog(@"%@-%@-%@",country,city,plmark.name);

self->m_locationName.text =plmark.name;

NSLog(@"%@",self->m_locationName);

}

NSLog(@"%@",placemarks);

}];

//[geocoder release];

*/

}

// 定位失败时调用

- (void)locationManager:(CLLocationManager *)manager

didFailWithError:(NSError *)error {

NSLog(@"定位失败");

}

//把手机GPS坐标转换成火星坐标 (google坐标)

-(CLLocationCoordinate2D)zzTransGPS:(CLLocationCoordinate2D)yGps

{

int TenLat=0;

int TenLog=0;

TenLat = (int)(yGps.latitude*10);

TenLog = (int)(yGps.longitude*10);

NSString *sql = [[NSString alloc]initWithFormat:@"select offLat,offLog from gpsT where lat=%d and log = %d",TenLat,TenLog];

NSLog(sql);

sqlite3_stmt* stmtL = [m_sqlite NSRunSql:sql];

int offLat=0;

int offLog=0;

while (sqlite3_step(stmtL)==SQLITE_ROW)

{

offLat = sqlite3_column_int(stmtL, 0);

offLog = sqlite3_column_int(stmtL, 1);

}

yGps.latitude = yGps.latitude+offLat*0.0001;

yGps.longitude = yGps.longitude + offLog*0.0001;

return yGps;

}

//在地图上放上自己的位置--外接接口

-(void)setMyMapPonitByMKMapView:(MKMapView *)MyMap{

//显示火星坐标

[self SetMapPoint:deleeverLocation MKMapView:MyMap];

MyMap=mainMapView;

}

//在地图上放上自己的位置

-(void)SetMapPoint:(CLLocationCoordinate2D)myLocation MKMapView:(MKMapView *)mapView

{

// POI* m_poi = [[POI alloc]initWithCoords:myLocation];

//

// [mapView addAnnotation:m_poi];

MKCoordinateRegion theRegion = { {0.0, 0.0 }, { 0.0, 0.0 } };

theRegion.center=myLocation;

[mapView setZoomEnabled:YES];

[mapView setScrollEnabled:YES];

theRegion.span.longitudeDelta = 0.01f;

theRegion.span.latitudeDelta = 0.01f;

[mapView setRegion:theRegion animated:YES];

}

//把火星坐标转换成百度坐标

-(CLLocationCoordinate2D)hhTrans_bdGPS:(CLLocationCoordinate2D)fireGps

{

CLLocationCoordinate2D bdGps;

double huo_x=fireGps.longitude;

double huo_y=fireGps.latitude;

double z = sqrt(huo_x * huo_x + huo_y * huo_y) + 0.00002 * sin(huo_y * x_pi);

double theta = atan2(huo_y, huo_x) + 0.000003 * cos(huo_x * x_pi);

bdGps.longitude = z * cos(theta) + 0.0065;

bdGps.latitude = z * sin(theta) + 0.006;

return bdGps;

}

#pragma mark 显示商品信息

#pragma mark

-(void)showPurchaseOnMapByLocation:(CLLocationCoordinate2D)baiduGPS MKMapView:(MKMapView*)myMapView{

CLLocationCoordinate2D googleGPS;

googleGPS=[self hhTrans_GCGPS:baiduGPS];//转换为百度

[self SetPurchaseMapPoint:googleGPS MKMapView:myMapView];

}

//把百度地图转换成谷歌地图--火星坐标

-(CLLocationCoordinate2D)hhTrans_GCGPS:(CLLocationCoordinate2D)baiduGps

{

CLLocationCoordinate2D googleGps;

double bd_x=baiduGps.longitude - 0.0065;

double bd_y=baiduGps.latitude - 0.006;

double z = sqrt(bd_x * bd_x + bd_y * bd_y) - 0.00002 * sin(bd_y * x_pi);

double theta = atan2(bd_y, bd_x) - 0.000003 * cos(bd_x * x_pi);

googleGps.longitude = z * cos(theta);

googleGps.latitude = z * sin(theta);

return googleGps;

}

-(void)SetPurchaseMapPoint:(CLLocationCoordinate2D)myLocation MKMapView:(MKMapView *)mapView

{

POI* m_poi = [[POI alloc]initWithCoords:myLocation];

[mapView addAnnotation:m_poi];

MKCoordinateRegion theRegion = { {0.0, 0.0 }, { 0.0, 0.0 } };

theRegion.center=myLocation;

[mapView setZoomEnabled:YES];

[mapView setScrollEnabled:YES];

theRegion.span.longitudeDelta = 0.01f;

theRegion.span.latitudeDelta = 0.01f;

[mapView setRegion:theRegion animated:YES];}

@end

【iOS中定位当前位置坐标及转换为火星坐标的方法】相关文章:

iOS绘制专属于程序猿的浪漫爱心

iOS开发中用imageIO渐进加载图片及获取exif的方法

iOS开发中使用Quartz2D绘制上下文栈和矩阵的方法

iOS开发中对文件目录的访问及管理的基本方法小结

OS X升级到10.10之后使用pod出现问题的解决方法

IOS判断字符串是不是纯数字的方法总结

iOS应用开发中实现页面跳转的简单方法笔记

IOS中使用UIWebView 加载网页、文件、 html的方法

iOS中使用URL Scheme进行App跳转的教程

详解iOS中多线程app开发的GCD队列的使用

精品推荐
分类导航