MapView는 기본적으로 화면에 지도를 표시해주고 좌표를 물리적인 주소로 반환해주거나 특정지역에 핀을 꽂고 설명을 달수도 있다.
MapView는 구글 지도 서비스를 이용하며 사용하기 위해서는 MapKit.framework를 포함 시켜줘야 하고, 위치 정보도 함께 이용을 하기 위해서는 CoreLocation.framework도 포함 시켜줘야 한다.
맵 뷰에서 사용자는 확대나 축소를 위한 핀치 더블 탭등의 제스처를 사용할수 있고 이러한 반응에 대한 관리는 Delegate에서 한다.
맵 뷰의 표현 방식에는 3가지 방식이 있다.
==================================================================================
enum {
MKMapTypeStandard = 0, // 표준
MKMapTypeSatellite, // 위성
MKMapTypeHybrid // 하이브리드
};
typedef NSUInteger MKMapType;
==================================================================================
@interface MKMapView : UIView <NSCoding>
// 맵뷰의 표현 방식
@property (nonatomic) MKMapType mapType;
// 지도에 무엇을 보여줄지 혹은 어느곳을 보여주고 있는지에 대한 기능을 담당하는 구조체
@property (nonatomic) MKCoordinateRegion region;
- (void)setRegion:(MKCoordinateRegion)region animated:(BOOL)animated;
typedef struct {
CLLocationCoordinate2D center;
MKCoordinateSpan span;
} MKCoordinateRegion;
@property (nonatomic) CLLocationCoordinate2D centerCoordinate;
- (void)setCenterCoordinate:(CLLocationCoordinate2D)coordinate animated:(BOOL)animated;
// 좌표를 넘겨주면 맵뷰의 화면비에 맞춰진 새로운 좌표 지역을 반환
- (MKCoordinateRegion)regionThatFits:(MKCoordinateRegion)region;
@property (nonatomic) BOOL showsUserLocation;
@property (nonatomic, readonly) MKUserLocation *userLocation;
// 화면에 주석을 추가,삭제
- (void)addAnnotation:(id <MKAnnotation>)annotation;
- (void)addAnnotations:(NSArray *)annotations;
- (void)removeAnnotation:(id <MKAnnotation>)annotation;
- (void)removeAnnotations:(NSArray *)annotations;
// 주석을 선택했을때 호출(Delegate로 넘어감)
- (void)selectAnnotation:(id <MKAnnotation>)annotation animated:(BOOL)animated;
// 주석을 선택해제 했을때 호출
- (void)deselectAnnotation:(id <MKAnnotation>)annotation animated:(BOOL)animated;
@property (nonatomic, readonly) NSArray *annotations;
@end
==================================================================================
@protocol MKMapViewDelegate <NSObject>
@optional
// 사용자가 제스처를 통해 화면이 바뀌는 동안 호출
- (void)mapView:(MKMapView *)mapView regionWillChangeAnimated:(BOOL)animated;
// 제스처가 멈췄을때 호출
- (void)mapView:(MKMapView *)mapView regionDidChangeAnimated:(BOOL)animated;
// 맵뷰가 보여질때 호출
- (void)mapViewWillStartLoadingMap:(MKMapView *)mapView;
// 맵뷰가 화면에 나타난뒤 호출
- (void)mapViewDidFinishLoadingMap:(MKMapView *)mapView;
// 맵뷰를 불러오는데 실패 했을때 호출
- (void)mapViewDidFailLoadingMap:(MKMapView *)mapView withError:(NSError *)error;
// 맵뷰가 주석을 화면에 표시하려고 할때 호출(화면을 이동하면 계속 호출)
- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation;
- (void)mapView:(MKMapView *)mapView didAddAnnotationViews:(NSArray *)views;
- (void)mapView:(MKMapView *)mapView annotationView:(MKAnnotationView *)view calloutAccessoryControlTapped:(UIControl *)control;
@end
==================================================================================
MKCoordinateRegionMakeWithDistance(CLLocationCoordinate2D centerCoordinate, CLLocationDistance latitudinalMeters, CLLocationDistance longitudinalMeters); 메서드에 좌표와 위도와 경도상의 거리를 미터단위로 주면 좌표상의 위도를 보고 델타 값을 계산하여 화면에 표시할 지역을 생성해 준다.
==================================================================================
// 사용자의 현재 위치로부터 반경 1km 지역을 설정한다.
MKCoordinateRegion viewRegion = MKCoordinateRegionMakeWithDistance(newLocation.coordinate, 2000, 2000);
==================================================================================
화면에 보여줄 지역을 생성했다면 생성된 것을 맵뷰의 비율에 맞게 조절하여서 화면에 설정해 지도가 보이게 한다.
==================================================================================
// 보여질 지역을 화면비에 맞게 조절한다.
MKCoordinateRegion adjustedRegion = [mapView regionThatFits:viewRegion];
// 화면비에 맞게 조절된 지역을 맵뷰에 설정하여 보여지게 한다.
[mapView setRegion:adjustedRegion animated:YES];
==================================================================================
주석객체는 <MKAnnotation> 프로토콜을 준수하는 커스텀 객체로 기본적으로는 핀 모양이나 사용자가 핀을 바꿀수도 있고 주석을 터치 했을 때 나오는 Callout도 설정해줄수 있다.
==================================================================================
@protocol MKAnnotation <NSObject>
// 주석이 표시될 위치
@property (nonatomic, readonly) CLLocationCoordinate2D coordinate;
@optional
- (NSString *)title;
- (NSString *)subtitle;
- (void)setCoordinate:(CLLocationCoordinate2D)newCoordinate;
@end
==================================================================================
리버스 지오코딩은 좌표세트의 값을 구글 데이터 베이스를 검색하여 물리적인 주소로 반환 해주는 기능을 한다.
리버스 지오코딩은 MKReverseGeocoder 클래스에서 처리한다.
리버스 지오코딩을 하려면 객체를 전달하면서 좌표를 전달 하고 델리게이트를 재정의 한후 start메서드만 사용하면 쉽게 할수 있다.
==================================================================================
// newLocation에서 가져온 현재 위치를 사용하여 MKReverseGeocoder의 인스턴스를 할당한다.
MKReverseGeocoder *geocoder = [[MKReverseGeocoder alloc] initWithCoordinate:newLocation.coordinate];
// 델리게이트로 self를 설정하고
geocoder.delegate = self;
// 리버스 지오코딩을 시작한다.
[geocoder start];
==================================================================================
@interface MKReverseGeocoder : NSObject
// 좌표 값을 통해 객체 생성
- (id)initWithCoordinate:(CLLocationCoordinate2D)coordinate;
// 변환 시작, 취소
- (void)start;
- (void)cancel;
// 변환을 위한 좌표 값
@property (nonatomic, readonly) CLLocationCoordinate2D coordinate;
// 전 세계의 주소 체계를 나타낼수 있는 객체
@property (nonatomic, readonly) MKPlacemark *placemark
==================================================================================
@protocol MKReverseGeocoderDelegate <NSObject>
@required
// 오륭 없이 성공적으로 주소를 변환 하면 호출(변환된 객체가 MKPlacemark로 온다)
- (void)reverseGeocoder:(MKReverseGeocoder *)geocoder didFindPlacemark:(MKPlacemark *)placemark;
// 위치를 분 별 할수 없을 때 호출
- (void)reverseGeocoder:(MKReverseGeocoder *)geocoder didFailWithError:(NSError *)error;
@end
==================================================================================
@interface MKPlacemark : NSObject <MKAnnotation>
// 길 주소가 여러 줄이라면 첫번 째 줄
@property (nonatomic, readonly) NSString *thoroughfare;
// 두번 째 줄
@property (nonatomic, readonly) NSString *subThoroughfare;
// 도시명
@property (nonatomic, readonly) NSString *locality;
// 주변지역 랜드마크(종종 nil값이다.)
@property (nonatomic, readonly) NSString *subLocality;
// 주, 도, 영토
@property (nonatomic, readonly) NSString *administrativeArea;
// 국가
@property (nonatomic, readonly) NSString *subAdministrativeArea;
// 우편번호(zip code)
@property (nonatomic, readonly) NSString *postalCode;
// 국가
@property (nonatomic, readonly) NSString *country;
// 두자리 IOS 국가 코드
@property (nonatomic, readonly) NSString *countryCode;
@end
출처 : http://blog.naver.com/sssin00?Redirect=Log&logNo=140149252542
'프로그래밍 > iOS' 카테고리의 다른 글
xcode 4.0에서 gh-unit을 이용해서 unittest 하기.. (0) | 2012.01.18 |
---|---|
MapView에 특별한 Annotation 붙이기 (0) | 2012.01.16 |
위치정보를 이용하는 어플 예제 (0) | 2012.01.16 |
iOS (iPhone,iPod touch) 의 MKMapView 정리하기 (0) | 2012.01.16 |
Push Notification 적용하기 #2. 앱 수정 (0) | 2012.01.13 |