iOS中定位當(dāng)前位置坐標(biāo)及轉(zhuǎn)換為火星坐標(biāo)的方法
定位和位置信息獲取
定位和反查位置信息要加載兩個動態(tài)庫 CoreLocation.framework 和 MapKit.framework 一個獲取坐標(biāo)一個提供反查
// 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];
// 設(shè)置定位精度,十米,百米,最好
[locationManager setDesiredAccuracy:kCLLocationAccuracyNearestTenMeters];
locationManager.delegate = self;
// 開始時時定位
[locationManager startUpdatingLocation];
}
// 錯誤信息
-(void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error {
NSLog(@"error");
}
// 6.0 以上調(diào)用這個函數(shù)
-(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations {
NSLog(@"%d", [locations count]);
CLLocation *newLocation = locations[0];
CLLocationCoordinate2D oldCoordinate = newLocation.coordinate;
NSLog(@"舊的經(jīng)度:%f,舊的緯度:%f",oldCoordinate.longitude,oldCoordinate.latitude);
// CLLocation *newLocation = locations[1];
// CLLocationCoordinate2D newCoordinate = newLocation.coordinate;
// NSLog(@"經(jīng)度:%f,緯度:%f",newCoordinate.longitude,newCoordinate.latitude);
// 計算兩個坐標(biāo)距離
// 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); // 區(qū)
// NSLog(@"country,%@",place.country); // 國家
}
}];
}
// 6.0 調(diào)用此函數(shù)
-(void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation {
NSLog(@"%@", @"ok");
}
@end
轉(zhuǎn)換為火星坐標(biāo)
這個寫的公共類叫做:GPScombineClass類主要展示GPS位置的定位,GPS坐標(biāo)的獲取,然后從手機坐標(biāo)轉(zhuǎn)換成火星坐標(biāo),繼而在需要的情況下,由火星轉(zhuǎn)百度 ,百度轉(zhuǎn)火星的詳細(xì)算法;
在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]) { // 檢查定位服務(wù)是否可用
locationManager = [[CLLocationManager alloc] init];
locationManager.delegate = self;
locationManager.distanceFilter=0.5;
locationManager.desiredAccuracy = kCLLocationAccuracyBest;
[locationManager startUpdatingLocation]; // 開始定位
}
NSLog(@"GPS 啟動");
}
// 定位成功時調(diào)用
- (void)locationManager:(CLLocationManager *)manager
didUpdateToLocation:(CLLocation *)newLocation
fromLocation:(CLLocation *)oldLocation
{
CLLocationCoordinate2D mylocation = newLocation.coordinate;//手機GPS
mylocation = [self zzTransGPS:mylocation];///轉(zhuǎn)換成火星GPS
deleeverLocation=mylocation;
baidulocation=[self hhTrans_bdGPS:mylocation];//轉(zhuǎn)換成百度地圖
/*
//顯示火星坐標(biāo)
[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];
*/
}
// 定位失敗時調(diào)用
- (void)locationManager:(CLLocationManager *)manager
didFailWithError:(NSError *)error {
NSLog(@"定位失敗");
}
//把手機GPS坐標(biāo)轉(zhuǎn)換成火星坐標(biāo) (google坐標(biāo))
-(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{
//顯示火星坐標(biāo)
[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];
}
//把火星坐標(biāo)轉(zhuǎn)換成百度坐標(biāo)
-(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];//轉(zhuǎn)換為百度
[self SetPurchaseMapPoint:googleGPS MKMapView:myMapView];
}
//把百度地圖轉(zhuǎn)換成谷歌地圖--火星坐標(biāo)
-(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
相關(guān)文章
IOS開發(fā) 支持https請求以及ssl證書配置詳解
這篇文章主要介紹了IOS開發(fā) 支持https請求以及ssl證書配置詳解的相關(guān)資料,需要的朋友可以參考下2017-02-02講解Java中如何構(gòu)造內(nèi)部類對象以及訪問對象
這篇文章主要介紹了講解Java中如何構(gòu)造內(nèi)部類對象以及訪問對象,是Java入門學(xué)習(xí)中的基礎(chǔ)知識,需要的朋友可以參考下2015-09-09iOS中定位當(dāng)前位置坐標(biāo)及轉(zhuǎn)換為火星坐標(biāo)的方法
這篇文章主要介紹了iOS中獲取當(dāng)前位置坐標(biāo)及轉(zhuǎn)換為火星坐標(biāo)的方法,這里的火星坐標(biāo)指的是我國專門研制的一種加密的坐標(biāo)系統(tǒng)...需要的朋友可以參考下2016-02-02iOS開發(fā)中CAlayer層的屬性以及自定義層的方法
這篇文章主要介紹了iOS開發(fā)中CAlayer層的屬性以及自定義層的方法,代碼基于傳統(tǒng)的Objective-C,需要的朋友可以參考下2015-11-11