SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

japan.internet.com翻訳記事

位置情報を利用するiPhoneアプリケーションを作成しよう

Core Locationフレームワークで位置情報を特定

マップの表示

 位置座標を取得するだけでも役には立ちますが、その位置を地図上で視覚的に確認できれば、情報の有用性はずっと高くなるでしょう。幸いなことに、iPhone SDK 3.0にはMap Kit APIが付属しており、これによってアプリケーション内にGoogleマップを簡単に表示できます。例を見てみましょう。

 先ほど作成したプロジェクトを使って、LBSViewController.xibファイルのViewウィンドウにButtonビューを追加します(図3を参照)。

図3 View Map Button: Viewウィンドウに "View Map" Buttonビューを追加した後のプロジェクトの様子
図3 View Map Button: Viewウィンドウに "View Map" Buttonビューを追加した後のプロジェクトの様子

 XcodeでFrameworksグループを右クリックし、MapKit.frameworkという新しいフレームワークを追加します。

 次のコードの中で太字になっているステートメントをLBSViewController.hファイルに追加します。

#import <UIKit/UIKit.h>
#import <CoreLocation/CoreLocation.h>
#import <MapKit/MapKit.h>
@interface LBSViewController : UIViewController 
    <CLLocationManagerDelegate> {
    IBOutlet UITextField *accuracyTextField;
    IBOutlet UITextField *latitudeTextField;
    IBOutlet UITextField *longitudeTextField;
    CLLocationManager *lm;
  
    MKMapView *mapView;
}
@property (retain, nonatomic) UITextField *accuracyTextField;
@property (retain, nonatomic) UITextField *latitudeTextField;
@property (retain, nonatomic) UITextField *longitudeTextField;

-(IBAction) btnViewMap: (id) sender;

@end

 Interface Builderに戻り、controlキーを押しながらButtonビューをクリックし、File's Ownerアイテムにドラッグし、btnViewMap:を選択します。

 次のコードの中で太字になっているステートメントをLBSViewController.mファイルに追加します。

-(IBAction) btnViewMap: (id) sender {
    [self.view addSubview:mapView];
}
- (void) viewDidLoad {
    lm = [[CLLocationManager alloc] init];
    lm.delegate = self;
    lm.desiredAccuracy = kCLLocationAccuracyBest;
    lm.distanceFilter = 1000.0f;
    [lm startUpdatingLocation];
    
    mapView = [[MKMapView alloc] initWithFrame:self.view.bounds];
    mapView.mapType = MKMapTypeHybrid; 
}
- (void) locationManager: (CLLocationManager *) manager
    didUpdateToLocation: (CLLocation *) newLocation
    fromLocation: (CLLocation *) oldLocation{
    NSString *lat = [[NSString alloc] initWithFormat:@"%g", 
        newLocation.coordinate.latitude];
    latitudeTextField.text = lat;
    
    NSString *lng = [[NSString alloc] initWithFormat:@"%g", 
        newLocation.coordinate.longitude];
    longitudeTextField.text = lng;
    

    NSString *acc = [[NSString alloc] initWithFormat:@"%g", 
        newLocation.horizontalAccuracy];
    accuracyTextField.text = acc;    
    
    [acc release];
    [lat release];
    [lng release];
    
    MKCoordinateSpan span;
    span.latitudeDelta=.005;
    span.longitudeDelta=.005;
    
    MKCoordinateRegion region;
    region.center = newLocation.coordinate;
    region.span=span;
    
    [mapView setRegion:region animated:TRUE]; 
}
- (void) dealloc{
    [mapView release];
    [lm release];
    [latitudeTextField release];
    [longitudeTextField release];
    [accuracyTextField release];
    [super dealloc];
}

 上記のコードでは基本的に次のことを行っています。

  • ビューのロード時にMKMapViewクラスのインスタンスを作成し、表示するマップタイプ(ハイブリッド: この例では地図と衛星写真)を設定する。
  • ユーザーがView Mapボタンを押したときに現在のビューにmapViewオブジェクトを追加する。
  • 位置情報が更新されたときにmapViewオブジェクトのsetRegion:メソッドを使って位置を拡大する。

 Command-rを押して、iPhoneシミュレータでアプリケーションをテストします。今度は、View Mapボタンを押すと、ロケーションマネージャで報告された位置が含まれている地図が表示されます(図4を参照)。

図4 地図に表示された位置: Core Locationフレームワークで報告された位置の地図を表示した様子
図4 地図に表示された位置: Core Locationフレームワークで報告された位置の地図を表示した様子

 シミュレータは常に固定の位置を返すので、実際の機器をテストせずに済ませられるのはここまでです。実機テストを行えば、機器を持って移動するとそれに伴って地図が動的に更新される様子を確認できます。テストの際は、distanceFilterプロパティの値を小さくして、わずかな距離の変化も検知されるようにしてください。

 ご覧いただいたように、iPhone SDKのCore Locationフレームワークを使用すると、位置情報を利用するサービスを簡単に実装できます。さらに、iPhone 3.0 SDKに含まれているMapKitを使用すると、マップ表示も簡単に実装できます。まだ位置情報を利用するアプリケーションを作成したことがなければ、これらの新機能を全部使って挑戦してみてください。

この記事は参考になりましたか?

連載通知を行うには会員登録(無料)が必要です。
既に会員の方はを行ってください。
japan.internet.com翻訳記事連載記事一覧

もっと読む

この記事の著者

japan.internet.com(ジャパンインターネットコム)

japan.internet.com は、1999年9月にオープンした、日本初のネットビジネス専門ニュースサイト。月間2億以上のページビューを誇る米国 Jupitermedia Corporation (Nasdaq: JUPM) のニュースサイト internet.comEarthWeb.com からの最新記事を日本語に翻訳して掲載するとともに、日本独自のネットビジネス関連記事やレポートを配信。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

Wei-Meng Lee(Wei-Meng Lee)

Microsoft MVP受賞者。Microsoft社の最新テクノロジー実地研修を専門とするDeveloper Learning Solutions社を創設。.NETとワイヤレステクノロジーの開発者、指導者として知られる。国際的なカンファレンスでたびたび講演し、.NET、XML、ワイヤレステクノロジーに関す...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/4574 2009/11/30 14:00

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー