iOS App 에서 지리 적 위치 포 지 셔 닝 을 실현 하 는 기본 적 인 방법 분석
그 포 지 셔 닝 은 세 가지 방식 이 있다.
1.GPS,가장 정확 한 포 지 셔 닝 방식
2.벌집 기지 국 의 삼각 포 지 셔 닝 은 신호 기지 국 이 비교적 비적 인 도시 에 위치 하 는 것 이 비교적 정확 하 다.
3.와 이 파이,이런 방식 은 인터넷 운영 자의 데이터 베 이 스 를 통 해 얻 은 것 으로 보 이 며,3 가지 포 지 셔 닝 종 류 는 가장 정확 하지 않다.
우선 Xcode 에 두 개의 연결 라 이브 러 리,MapKit 와 CoreLocation 를 추가 해 야 합 니 다.그림 참조.
core location 은 포 지 셔 닝 기능 을 제공 하고 장치 의 현재 좌 표를 포 지 셔 닝 할 수 있 으 며 장치 이동 정 보 를 얻 을 수 있 습 니 다.가장 중요 한 유형 은 CLLocationManager,포 지 셔 닝 관리 입 니 다.
iOS 8 부터 Core Location framework 의 변 화 는 주로 다음 과 같은 몇 가지 가 있 습 니 다.
1.포 지 셔 닝 상태 에서 Always 와 WhenInUse 의 개념 을 도입 한다.
2.Visit monitoring 의 특성 을 추가 합 니 다.이런 특성 은 여행 유형의 응용 에 특히 적합 합 니 다.사용자 가 특정한 지역 에 도착 하면 Monitor 가 역할 을 합 니 다.
3.실내 포 지 셔 닝 기술 을 추가 하고 CLFloor 를 추가 하면 실내 에서 층 정 보 를 얻 을 수 있 습 니 다.
현재 위도 가 져 오기
먼저\#import
@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
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
View의 레이아웃 방법을 AutoLayout에서 따뜻한 손 계산으로 하면 성능이 9.26배로 된 이야기이 기사는 의 15 일째 기사입니다. 어제는 에서 이었습니다. 손 계산을 권하는 의도는 없고, 특수한 상황하에서 계측한 내용입니다 화면 높이의 10 배 정도의 contentView가있는 UIScrollView 레이아...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.