地圖定位與錨點



記得加入庫MapKit


#import <MapKit/MapKit.h>

#import <CoreLocation/CoreLocation.h>

{

CLGeocoder* geocoder;

}

@property (strong, nonatomic) IBOutlet UITextField *latitudeField;

@property (strong, nonatomic) IBOutlet UITextField *longitudeField;

@property (strong, nonatomic) IBOutlet MKMapView *mapView;

- (IBAction)goClicked:(id)sender;


//================

geocoder = [[CLGeocoder alloc] init];

// 設置地圖的顯示風格,此處設置使用標準地圖

self.mapView.mapType = MKMapTypeStandard;

// 設置地圖可縮放

self.mapView.zoomEnabled = YES;

// 設置地圖可滾動

self.mapView.scrollEnabled = YES;

// 設置地圖可旋轉

self.mapView.rotateEnabled = YES;

// 設置顯示用戶當前位置

self.mapView.showsUserLocation = YES;

// 調用自己實現的方法設置地圖的顯示位置和顯示區域

[self locateToLatitude:39.5427 longitude:116.2317];

// 創建一個手勢處理器,用于檢測、處理長按手勢

UILongPressGestureRecognizer* gesture = [[UILongPressGestureRecognizer

alloc]initWithTarget:self action:@selector(longPress:)];

// 為該控件添加手勢處理器

[self.view addGestureRecognizer:gesture];

//=============

- (IBAction)goClicked:(id)sender

{

// 關閉兩個文本框的虛擬鍵盤

[self.latitudeField resignFirstResponder];

[self.longitudeField resignFirstResponder];

NSString* latitudeStr = self.latitudeField.text;

NSString* longtitudeStr = self.longitudeField.text;

// 如果用戶輸入的經度、緯度不為空

if (latitudeStr != nil && latitudeStr.length > 0

&& longtitudeStr != nil && longtitudeStr.length > 0)

{

// 調用自己實現的方法設置地圖的顯示位置和顯示區域

[self locateToLatitude:latitudeStr.floatValue

longitude:longtitudeStr.floatValue];

}

}

//自定義

- (void)locateToLatitude:(CGFloat)latitude longitude:(CGFloat)longitude

{

// 設置地圖中心的經、緯度

CLLocationCoordinate2D center = {latitude , longitude};

// 設置地圖顯示的范圍,

MKCoordinateSpan span;

// 地圖顯示范圍越小,細節越清楚

span.latitudeDelta = 0.01;

span.longitudeDelta = 0.01;

// 創建MKCoordinateRegion對象,該對象代表了地圖的顯示中心和顯示范圍。

MKCoordinateRegion region = {center,span};

// 設置當前地圖的顯示中心和顯示范圍

[self.mapView setRegion:region animated:YES];

// 創建MKPointAnnotation對象——代表一個錨點

MKPointAnnotation* annotation = [[MKPointAnnotation alloc] init];

annotation.title = @"八維研修學院";

annotation.subtitle = @"上地7街軟件園南";

CLLocationCoordinate2D coordinate = {latitude , longitude};

annotation.coordinate = coordinate;

// 添加錨點

[self.mapView addAnnotation:annotation];

}

//手勢回調

- (void)longPress:(UILongPressGestureRecognizer*)gesture

{

// 獲取長按點的坐標

CGPoint pos = [gesture locationInView:self.mapView];

// 將長按點的坐標轉換為經度、維度值

CLLocationCoordinate2D coord = [self.mapView convertPoint:pos

toCoordinateFromView:self.mapView];

// 將經度、維度值包裝為CLLocation對象

CLLocation* location = [[CLLocation alloc] initWithLatitude:coord.latitude

longitude:coord.longitude];

// 根據經、緯度反向解析地址

[geocoder reverseGeocodeLocation:location completionHandler:

^(NSArray *placemarks, NSError *error)

{

if (placemarks.count > 0 && error == nil)

{

// 獲取解析得到的第一個地址信息

CLPlacemark* placemark = [placemarks objectAtIndex:0];

// 獲取地址信息中的FormattedAddressLines對應的詳細地址

NSArray* addrArray = placemark

.addressDictionary[@"FormattedAddressLines"];

// 將詳細地址拼接成一個字符串

NSMutableString* address = [[NSMutableString alloc] init];

for(int i = 0 ; i < addrArray.count ; i ++)

{

[address appendString:addrArray[i]];

}

// 創建MKPointAnnotation對象——代表一個錨點

MKPointAnnotation? *annotation = [[MKPointAnnotation alloc] init];

annotation.title = placemark.name;

annotation.subtitle = address;

annotation.coordinate = coord;

// 添加錨點

[self.mapView addAnnotation:annotation];

}

}];

}

#if 1// MKMapViewDelegate協議中的方法,該方法的返回值可用于定制錨點控件的外觀- (MKAnnotationView *) mapView:(MKMapView *)mapView? ? ? ? ? ? viewForAnnotation:(id) annotation

{

static NSString* annoId = @"fkAnno";

// 獲取可重用的錨點控件

MKAnnotationView* annoView = [mapView

dequeueReusableAnnotationViewWithIdentifier:annoId];

// 如果可重用的錨點控件不存在,創建新的可重用錨點控件

if (!annoView)

{

annoView= [[MKAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:annoId];

/*

如果不想改變錨點控件的圖片,只想改變顏色,則可創建MKPinAnnotationView實例

再修改MKPinAnnotationView對象的pinColor屬性即可。

*/

}

// 為錨點控件設置圖片

annoView.image = [UIImage imageNamed:@"pos.gif"];

// 設置該錨點控件是否可顯示氣泡信息

annoView.canShowCallout = YES;

// 定義一個按鈕,用于為錨點控件設置附加控件

UIButton *button = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];

// 為按鈕綁定事件處理方法

[button addTarget:self action:@selector(buttonTapped:)

forControlEvents:UIControlEventTouchUpInside];

// 可通過錨點控件的rightCalloutAccessoryView、leftCalloutAccessoryView設置附加控件

annoView.rightCalloutAccessoryView = button;

return annoView;

}

#endif

- (void) buttonTapped:(id)sender

{

NSLog(@"您點擊了錨點信息!");

}

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容