en

hi, it seems you are using microsoft internet explorer. it doesn't match web standard and causes problems browsing this site. please please please use mozilla firefox or google chrome instead. thank you!

zh

哦哦!您正在使用Internet Explorer 瀏覽器,它與我們的網頁標準並不相容,可能會導致畫面顯示不正常。
請改用 Mozilla Firefox 或者 Google Chrome 才能正常瀏覽本網站,謝謝!

1.03.2011

使用 MapKit 取得目前地理位置與經緯度的設定

 

這次要介紹如何使用 MapKit 來實做取得目前所在位置的經緯度,在 iOS 3.0 開始就有提供 MapKit 來讓開發者做地圖的相關應用,而這些功能的背後全都要仰賴 Google 數據庫所提供的資料,因此在使用時也必須要遵守 Google 地圖應用的服務條款,在此就不贅述,接下來我們就來實做這些功能。(View-based Template)

首先先加入 MapKey 的 Framework,加入的方法是在 Groups & Files 內的專案名稱上按下右鍵 > Add > Existing Frameworks,之後選擇需要的 framework 並 Add 即可。


在加入 Framework 之後,還必須要匯入 MapKit 的標頭檔。

#import <MapKit/MapKit.h>
最後則是在 ViewCotroller.h 中設定代理,才算是完成環境的設置。

@interface LocationViewController : UIViewController <MKMapViewDelegate> {
在程式進入點的地方使用 MKMapView 在畫面中繪出 MAP,其程式碼如下。

- (void)viewDidLoad {
    [super viewDidLoad];

    //建立MapView
    map = [[MKMapView alloc] initWithFrame:CGRectMake(0.0f, 40.0f, 320.0f, 400.0f)];

    //顯示目前位置(藍色圓點)
    map.showsUserLocation = YES;

    //MapView的環境設置
    map.mapType = MKMapTypeStandard;
    map.scrollEnabled = YES;
    map.zoomEnabled = YES;

    //將MapView顯示於畫面
    [self.view insertSubview:map atIndex:0];

    //取得目前MAP的中心點座標並show在對應的TextField中
    double X = map.centerCoordinate.latitude;
    double Y = map.centerCoordinate.longitude;
    latitudeField.text = [NSString stringWithFormat:@"%6f", X];
    longitudeField.text = [NSString stringWithFormat:@"%6f", Y];
}

現在我們已經可以在畫面上成功繪出地圖並取得目前地圖中心點的經緯度,若想要繪出不同類型的地圖可以參考以下程式碼。

//切換地圖為混合型態
map.mapType = MKMapTypeHybrid;

//切換地圖為標準型態
map.mapType = MKMapTypeStandard;

//切換地圖為衛星型態
map.mapType = MKMapTypeSatellite;

接下來就是如何取得目前的所在位置的經緯度資料,並將地圖畫面移動到該處,其寫法如下。

- (IBAction)onNowLocacion:(id)sender {

    //取得現在位置
    double X = map.userLocation.location.coordinate.latitude;
    double Y = map.userLocation.location.coordinate.longitude;

    //show在對應的TextField中
    latitudeField.text = [NSString stringWithFormat:@"%6f", X];
    longitudeField.text = [NSString stringWithFormat:@"%6f", Y];

    //自行定義的設定地圖函式
    [self setMapRegionLongitude:Y andLatitude:X withLongitudeSpan:0.05 andLatitudeSpan:0.05];
}

//自行定義的設定地圖函式
- (void)setMapRegionLongitude:(double)Y andLatitude:(double)X withLongitudeSpan:(double)SY andLatitudeSpan:(double)SX {

    //設定經緯度
    CLLocationCoordinate2D mapCenter;
    mapCenter.latitude = X;
    mapCenter.longitude = Y;

    //Map Zoom設定
    MKCoordinateSpan mapSpan;
    mapSpan.latitudeDelta = SX;
    mapSpan.longitudeDelta = SY;

    //設定地圖顯示位置
    MKCoordinateRegion mapRegion;
    mapRegion.center = mapCenter;
    mapRegion.span = mapSpan;

    //前往顯示位置
    [map setRegion:mapRegion];
    [map regionThatFits:mapRegion];
}

透過自行定義的函式,我們也可以輸入想要的經緯度來移動地圖,不過如果只是單純想要取得目前的所在位置,可直接寫成這樣。

mapRegion.center = map.userLocation.location.coordinate;





8 則留言:

  1. 您好!請問一下您提到顯示目前位置mapRegion.center = map.userLocation.location.coordinate;
    我不需抓經緯度~只要按鍵按下就到目前位置~
    依照您上面程序做法都沒問題~只是您提到「只顯示目前位置方式mapRegion.center = map.userLocation.location.coordinate;」 這段程式碼式取代掉「自行定義的設定地圖函式」內所有程式碼嗎?~~~~我試了一下好想不太行~~謝謝您回覆^^_^

    回覆刪除
    回覆
    1. Bryan Chen 您好:

      顯示目前位置所呼叫的方法函式 map.userLocation.location.coordinate,是透過裝置內的定位系統所取得的參數座標來設定,將目標(目前)位置移動到該處。

      即使這樣做,您還是必須將地圖的畫面移動到目前的位置,參考前往顯示位置的註解,不然你的地圖顯示畫會停留在原處,我想您的問題點應該在這。

      刪除
  2. 恩恩~~感謝您指導^^_^

    回覆刪除
  3. 匿名5/15/2013

    請問以上函數是放置viewcontroller.h還是.m??(抱歉我是新手)

    回覆刪除
    回覆
    1. 匿名5/15/2013

      抱歉應該不是這樣問,應該是說,除了@interface LocationViewController :這段放在.h,其他都放在.m裡面嗎??在這之前需要先設定些什麼嗎?

      刪除
    2. 您好:

      你還需要自己在標頭檔(.h)中設定一個 MKMapView 型態的變數 (範例為map),你在實作檔(.m)才有辦法實作它。

      刪除
    3. 匿名5/15/2013

      友友友我都有設,謝謝你,不好意思一質問很遜的問題

      刪除
    4. 沒關係,別在意!

      刪除