iOS App 에서 지리 적 위치 포 지 셔 닝 을 실현 하 는 기본 적 인 방법 분석

6218 단어 iOS포 지 셔 닝
iOS 시스템 이 자체 적 으로 가지 고 있 는 포 지 셔 닝 서 비 스 는 많은 수 요 를 실현 할 수 있다.예 를 들 어 현재 경 위 를 얻 고 현재 위치 정 보 를 얻 는 등 이다.
그 포 지 셔 닝 은 세 가지 방식 이 있다.
1.GPS,가장 정확 한 포 지 셔 닝 방식
2.벌집 기지 국 의 삼각 포 지 셔 닝 은 신호 기지 국 이 비교적 비적 인 도시 에 위치 하 는 것 이 비교적 정확 하 다.
3.와 이 파이,이런 방식 은 인터넷 운영 자의 데이터 베 이 스 를 통 해 얻 은 것 으로 보 이 며,3 가지 포 지 셔 닝 종 류 는 가장 정확 하지 않다.
우선 Xcode 에 두 개의 연결 라 이브 러 리,MapKit 와 CoreLocation 를 추가 해 야 합 니 다.그림 참조.
201651091651873.jpg (856×368)
core location 은 포 지 셔 닝 기능 을 제공 하고 장치 의 현재 좌 표를 포 지 셔 닝 할 수 있 으 며 장치 이동 정 보 를 얻 을 수 있 습 니 다.가장 중요 한 유형 은 CLLocationManager,포 지 셔 닝 관리 입 니 다.
iOS 8 부터 Core Location framework 의 변 화 는 주로 다음 과 같은 몇 가지 가 있 습 니 다.
1.포 지 셔 닝 상태 에서 Always 와 WhenInUse 의 개념 을 도입 한다.
2.Visit monitoring 의 특성 을 추가 합 니 다.이런 특성 은 여행 유형의 응용 에 특히 적합 합 니 다.사용자 가 특정한 지역 에 도착 하면 Monitor 가 역할 을 합 니 다.
3.실내 포 지 셔 닝 기술 을 추가 하고 CLFloor 를 추가 하면 실내 에서 층 정 보 를 얻 을 수 있 습 니 다.
현재 위도 가 져 오기
먼저\#import를 가 져 와 CLLocationManager 의 인 스 턴 스 를 정의 하여 CLLocationManager Delegate 를 실현 합 니 다.

@interface ViewController ()<CLLocationManagerDelegate>
{
    CLLocationManager *_locationManager;
}

@end

위치 추적 시작 방법:

- (void)startLocating
{
    if([CLLocationManager locationServicesEnabled])
    {
        _locationManager = [[CLLocationManager alloc] init];
        //
        [_locationManager setDesiredAccuracy:kCLLocationAccuracyBest];
        _locationManager.distanceFilter = 100.0f;
        _locationManager.delegate = self;
        if ([[[UIDevice currentDevice] systemVersion] floatValue] > 8.0)
        {
            [_locationManager requestAlwaysAuthorization];
            [_locationManager requestWhenInUseAuthorization];
        }
        //
        [_locationManager startUpdatingLocation];
    }
}
에이전트 구현 방법:

-(void)locationManager:(CLLocationManager *)manager didChangeAuthorizationStatus:(CLAuthorizationStatus)status
{
    NSLog(@"Longitude = %f", manager.location.coordinate.longitude);
    NSLog(@"Latitude = %f", manager.location.coordinate.latitude);
    [_locationManager stopUpdatingLocation];
}
현재 위치 정보 가 져 오기
위의 대리 방법 에서

-(void)locationManager:(CLLocationManager *)manager didChangeAuthorizationStatus:(CLAuthorizationStatus)status
{
    NSLog(@"Longitude = %f", manager.location.coordinate.longitude);
    NSLog(@"Latitude = %f", manager.location.coordinate.latitude);
    [_locationManager stopUpdatingLocation];

    CLGeocoder * geoCoder = [[CLGeocoder alloc] init];
    [geoCoder reverseGeocodeLocation:manager.location completionHandler:^(NSArray *placemarks, NSError *error) {
        for (CLPlacemark * placemark in placemarks) {
            NSDictionary *test = [placemark addressDictionary];
            //  Country( )  State( )  SubLocality( )
            NSLog(@"%@", [test objectForKey:@"Country"]);
            NSLog(@"%@", [test objectForKey:@"State"]);
            NSLog(@"%@", [test objectForKey:@"SubLocality"]);
            NSLog(@"%@", [test objectForKey:@"Street"]);
        }
    }];

}

이렇게 하면 현재 위치의 상세 한 정 보 를 쉽게 얻 을 수 있다.
어느 지점 의 경 위 를 가 져 옵 니 다.

- (void)getLongitudeAndLatitudeWithCity:(NSString *)city
{
    //city
    NSString *oreillyAddress = city;
    CLGeocoder *myGeocoder = [[CLGeocoder alloc] init];
    [myGeocoder geocodeAddressString:oreillyAddress completionHandler:^(NSArray *placemarks, NSError *error) {
        if ([placemarks count] > 0 && error == nil)
        {
            NSLog(@"Found %lu placemark(s).", (unsigned long)[placemarks count]);
            CLPlacemark *firstPlacemark = [placemarks objectAtIndex:0];
            NSLog(@"Longitude = %f", firstPlacemark.location.coordinate.longitude);
            NSLog(@"Latitude = %f", firstPlacemark.location.coordinate.latitude);
        }
        else if ([placemarks count] == 0 && error == nil)
        {
            NSLog(@"Found no placemarks.");
        }
        else if (error != nil)
        {
            NSLog(@"An error occurred = %@", error);
        }
    }];
}
두 지점 사이 의 거 리 를 계산 하 다

- (double)distanceByLongitude:(double)longitude1 latitude:(double)latitude1 longitude:(double)longitude2 latitude:(double)latitude2{
    CLLocation* curLocation = [[CLLocation alloc] initWithLatitude:latitude1 longitude:longitude1];
    CLLocation* otherLocation = [[CLLocation alloc] initWithLatitude:latitude2 longitude:longitude2];
    double distance  = [curLocation distanceFromLocation:otherLocation];// m
    return distance;
}
우선 우 리 는 위의 getLongitude AndLatitude With City 방법 으로 특정한 장소의 경 위 를 얻 을 수 있다.예 를 들 어 우리 가 베 이 징 과 상하 이의 경 위 를 얻 는 것 은 각각 베 이 징 경도=116.405285,Latitude=39.904989 상하 이 경도=121.472644,Latitude=31.231706 이다.그러면 베 이 징 과 상하 이 사이 의 거 리 는 다음 과 같다.

double distance = [self distanceByLongitude:116.405285 latitude:39.904989 longitude:121.472644 latitude:31.231706];
NSLog(@"Latitude = %f", distance);
계산 한 것 은 대략적인 거리 여서 그렇게 정확 하지 않 을 것 이다.입력 결과:

distance = 1066449.749194

좋은 웹페이지 즐겨찾기