我們的特勤部門開發(fā)了實際坐標轉(zhuǎn)換為虛擬坐標的系統(tǒng),這個系統(tǒng)在中國銷售的數(shù)字地圖必須使用該系統(tǒng)進行坐標轉(zhuǎn)換,然后才能列出,那么iOS中定位坐標及轉(zhuǎn)換的幾種方法大家都了解嗎?今天就讓武林技術(shù)頻道小編帶你一起來了解一下吧!
定位和位置信息獲取
定位和反查位置信息要加載兩個動態(tài)庫 CoreLocation.framework 和 MapKit.framework 一個獲取坐標一個提供反查
?
?
轉(zhuǎn)換為火星坐標
這個寫的公共類叫做:GPScombineClass類主要展示GPS位置的定位,GPS坐標的獲取,然后從手機坐標轉(zhuǎn)換成火星坐標,繼而在需要的情況下,由火星轉(zhuǎn)百度 ,百度轉(zhuǎn)火星的詳細算法;
在GPScombineClass.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
?
?
?
???
??? 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中
?
?
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)換成百度地圖
???? /*
??? //顯示火星坐標
??? [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坐標轉(zhuǎn)換成火星坐標 (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];
???
}
?
//把火星坐標轉(zhuǎn)換成百度坐標
-(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)換成谷歌地圖--火星坐標
-(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
以上代碼都是武林技術(shù)頻道小編為大家搜集的關(guān)于iOS中定位坐標及轉(zhuǎn)換的幾種方法,希望對大家的學(xué)習(xí)有一定的幫助!
新聞熱點
疑難解答
圖片精選