iOS中定位当前位置坐标及转换为火星坐标的方法

定位和位置信息获取
定位和反查位置信息要加载两个动态库 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

(0)

相关推荐

  • 在iOS App中实现地理位置定位的基本方法解析

    iOS系统自带的定位服务可以实现很多需求.比如:获取当前经纬度,获取当前位置信息等等. 其定位有3种方式: 1,GPS,最精确的定位方式 2,蜂窝基站三角定位,这种定位在信号基站比较秘籍的城市比较准确. 3,Wifi,这种方式貌似是通过网络运营商的数据库得到的数据,在3种定位种最不精确 首先你要在你的Xcode中添加两个连接库,MapKit和CoreLocation,如图 core location提供了定位功能,能定位装置的当前坐标,同时能得到装置移动信息,最重要的类是CLLocationMa

  • IOS 开发之自定义按钮实现文字图片位置随意定制

    IOS 开发之自定义按钮实现文字图片位置随意定制 可能有些看到这篇文章的朋友会觉得很不屑:"按钮谁不会自定义?还需要看你的?" 也确实,按钮是我们项目中最常见的控件之一,天天在使用.对于不同类型的按钮,我们是否有更加简便的方法来实现需求是我们需要做的.这里我提出自己的两种方法,您可以对你自己平时自定义按钮的方法做一下对比,看看哪种方法更加简单. 多说一句,千万不要觉得知识简单,觉得自己会了,没必要学习.'往往简单的东西存在大智慧'(这个比给满分),知识都是慢慢积累出来的. 按钮是应用中

  • IOS中UITableView滚动到指定位置

    方法很简单: - (void)scrollToRowAtIndexPath:(NSIndexPath *)indexPath atScrollPosition:(UITableViewScrollPosition)scrollPosition animated:(BOOL)animated 有些需要注意的地方: 如果在reloadData后需要立即获取tableview的cell.高度,或者需要滚动tableview,那么,直接在reloadData后执行代码是有可能出问题的. reloadDa

  • iOS设置UIButton文字显示位置和字体大小、颜色的方法

    前言 大家都知道UIButton按钮是IOS开发中最常用的控件,作为IOS基础学习教程知识 ,初学者需要了解其基本定义和常用设置,以便在开发在熟练运用. 一.iOS设置UIButton的字体大小 btn.frame = CGRectMake(x, y, width, height); [btn setTitle: @"search" forState: UIControlStateNormal]; //设置按钮上的自体的大小 //[btn setFont: [UIFont system

  • iOS开发中最基本的位置功能实现示例

    定位获取位置及位置编码-反编码 我们的应用程序,可以通过添加Core Location框架所包含的类,获取设备的地图位置. 添加CoreLocation.framework框架,导入#import<CoreLocation/CoreLocation.h>. 使用地图服务时,会消耗更多地设备电量.因此,在获取到设备的位置后,应该停止定位来节省电量. 我们通过一个demo来展示内容与效果 复制代码 代码如下: // // HMTRootViewController.h // My-GPS-Map

  • iOS应用进入后台后计时器和位置更新停止问题的解决办法

    由于iOS系统为"伪后台"运行模式,当按下HOME键时,如程序不做任何操作,应用会有5秒的执行缓冲时间,随机程序被挂起,所有任务终端,包括计时器和位置更新等操作,但程序打开后台模式开关后,部分任务可以再后台执行,如音频,定位,蓝牙,下载,VOIP,即便如此,程序的后台运行最多可以延长594秒(大概是10分钟).不幸的是,程序在声明后台模式后很有可能在app上架时被拒.基于此,我研究出了不用申明后台模式就能让计时器和定位在app进入前台时继续运行的方法.   实现原理如下: 利用iOS的

  • iOS中定位当前位置坐标及转换为火星坐标的方法

    定位和位置信息获取 定位和反查位置信息要加载两个动态库 CoreLocation.framework 和 MapKit.framework 一个获取坐标一个提供反查 复制代码 代码如下: // appDelgate.h #import <UIKit/UIKit.h> #import <CoreLocation/CoreLocation.h> #import <MapKit/MapKit.h>   @interface AppDelegate : UIResponder

  • IOS 中NSUserDefaults读取和写入自定义对象的实现方法

    IOS 中NSUserDefaults读取和写入自定义对象的实现方法 NSUserDefaults可以存取一些短小的信息. 比如存入再读出一个字符串到NSUserDefaults: NSString *string = [NSString stringWithString @"hahaha"]; NSUserDefaults *ud = [NSUserDefaults standardUserDefaults]; [ud setObject:string forKey:@"m

  • iOS中UIAlertView3秒后消失的两种实现方法

    一,效果图. 二,代码. - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. UIAlertView* alert = [[UIAlertView alloc]initWithTitle:nil message:@"此信息3秒后消失" delegate:nil cancelButtonTitle:nil ot

  • iOS中Xcode 8 日志输出乱码问题的解决方法

    更新到Xcode 8的同学应该都遇到了这个问题:用Xcode 8运行项目,日志会疯狂的刷,就像下面这种图一样: 日志输出 于是,简单搜寻了下,"歪果仁"给出了如下解决方法: Edit Scheme-> Run -> Arguments, 在Environment Variables里边添加 OS_ACTIVITY_MODE = disable 以上所述是小编给大家介绍的iOS中Xcode 8 日志输出乱码问题,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复

  • iOS中textField限制字符串长度、字符数的方法

    前言 最近在开发的时候遇到一个问题,就是需要限制TextField中输入的字符串的长度,但是不是直接根据长度限制,而是根据字符数限制,一个汉字为两个字节,数字字母为一个字符.超过字符限制则不允许继续输入并弹出toast提示. 这个问题有三个关键点:判断字符串是否超出长度,超出长度不可输入,判断字符串的字符数. 下面话不多说了,来一起看看详细的介绍吧 方法如下: 1.判断字符串是否超出长度 [self.txfUsername addTarget:self action:@selector(text

  • iOS中定位(location manager )出现log日志的解决办法

    前言 最近发现一个问题,自iOS 10.0以后,项目中老是出现有关定位管理者的日志信息,说定位管理者最好放在主线程;在实际开发中,当在子线程中创建定位管理者,有可能收不到回调信息 提示信息如下: A location manager (0x7fbafac12560) was created on a dispatch queue executing on a thread other than the main thread. It is the developer's responsibili

  • iOS中自带超强中文分词器的实现方法

    说明 在处理文本的时候,第一步往往是将字符串进行分词,得到一个个关键词.苹果从很早就开始支持中文分词了,而且我们几乎人人每天都会用到,回想一下,在使用手机时,长按一段文字,往往会选中按住位置的一个词语,这里就是一个分词的绝佳用例,而iOS自带的分词效果非常棒,大家可以自己平常注意观察一下,基本对中文也有很好的效果.而这个功能也开放了API供开发者调用,我试用了一下,很好用! 效果如下: 实现 其实苹果给出了完整的API,想要全面了解的可以直接看文档:CFStringTokenizer Refer

  • 详解IOS中文件路径判断是文件还是文件夹

    详解IOS中文件路径判断是文件还是文件夹 方法1 + (BOOL)isDirectory:(NSString *)filePath { BOOL isDirectory = NO; [[NSFileManager defaultManager] fileExistsAtPath:filePath isDirectory:&isDirectory]; return isDirectory; } 方法2 + (BOOL)isDirectory:(NSString *)filePath { NSNum

  • IOS 中UIKit-UIPageControl利用delegate定位圆点位置

    IOS 中UIKit-UIPageControl利用delegate定位圆点位置 在UIScrollView中会添加UIPageControl作为页码标识,可以让用户清楚的知道当前的页数.我们需要优化的一点是让pageControl的小圆点精确的跟着scrollView而定位.我们先来看一下效果图: 我们发现,当图片拖动不到一半的时候,pageControl的圆点定位到前一张图,图片拖动超过一半的时候,定位到下一张图.这里就需要四舍五入的计算了. 我们可以利用协议 delegate 去做这件事情

  • iOS中使用JSPatch框架使Objective-C与JavaScript代码交互

    JSPatch是GitHub上一个开源的框架,其可以通过Objective-C的run-time机制动态的使用JavaScript调用与替换项目中的Objective-C属性与方法.其框架小巧,代码简洁,并且通过系统的JavaScriptCore框架与Objective-C进行交互,这使其在安全性和审核风险上都有很强的优势.Git源码地址:https://github.com/bang590/JSPatch. 一.从一个官方的小demo看起 通过cocoapods将JSPath集成进一个Xcod

随机推荐