国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統(tǒng) > iOS > 正文

iOS中定位坐標及轉(zhuǎn)換的幾種方法

2020-02-19 15:50:38
字體:
供稿:網(wǎng)友

我們的特勤部門開發(fā)了實際坐標轉(zhuǎn)換為虛擬坐標的系統(tǒng),這個系統(tǒng)在中國銷售的數(shù)字地圖必須使用該系統(tǒng)進行坐標轉(zhuǎn)換,然后才能列出,那么iOS中定位坐標及轉(zhuǎn)換的幾種方法大家都了解嗎?今天就讓武林技術(shù)頻道小編帶你一起來了解一下吧!

定位和位置信息獲取
定位和反查位置信息要加載兩個動態(tài)庫 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];
??? // 設(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);
????
??? // 計算兩個坐標距離
??? //??? 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)換為火星坐標
這個寫的公共類叫做:GPScombineClass類主要展示GPS位置的定位,GPS坐標的獲取,然后從手機坐標轉(zhuǎn)換成火星坐標,繼而在需要的情況下,由火星轉(zhuǎn)百度 ,百度轉(zhuǎn)火星的詳細算法;

在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)換成百度地圖

???? /*

??? //顯示火星坐標

??? [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í)有一定的幫助!

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 高安市| 哈密市| 神木县| 韶山市| 隆尧县| 通州市| 嫩江县| 资阳市| SHOW| 赞皇县| 封开县| 衡水市| 阿拉善盟| 漠河县| 梁河县| 济源市| 淄博市| 长春市| 尼玛县| 黔西| 峡江县| 平顶山市| 西青区| 来安县| 封开县| 衡东县| 肇东市| 陵水| 霍山县| 会昌县| 杭锦后旗| 漠河县| 河池市| 都江堰市| 万山特区| 开封县| 共和县| 怀仁县| 迁西县| 阜新| 阿拉尔市|