マップの呼び出しとルート設定

自分のアプリ内からルートを設定したGoogleMapを呼び出す方法。
(標準のマップアプリではなく、safari上でGoogleMapを呼び出す方法)

追記:
iPhoneシミュレータ上ではsafariが起動しますが、実機だと標準のマップアプリで起動する模様。

 

            NSString *place = @"daddr=目的地&saddr=現在地";
            NSString *placeEscape = [place stringByAddingPercentEscapesUsingEncoding: NSUTF8StringEncoding];
            NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"http://maps.google.com/maps?%@", placeEscape]];
            [[UIApplication sharedApplication] openURL:url];            

 
参考にさせていただいたサイト様
 http://634.ayumu-baby.com/uiapplication_openurl.html
 http://ushigyu.net/2011/12/08/1tap_root_search/

Mapkitのいろいろ

ネットからいろいろ拾い読みして試していたら記事としてまとめる気力を使い果たしたので、ログとして記事作成。
後日気力が回復したら、しっかりまとめようと思います。

『Mapkitにアイコン画像でピン立て』
 http://blog.syuhari.jp/archives/2040

『ピンが落ちてくるアニメーション』
 http://blog.syuhari.jp/archives/2049

『MKPinAnnotationView』
 http://iphone-tora.sakura.ne.jp/mkpinannotationview.html

『ジオコーディングとJSON』
 http://kinsentansa.blogspot.com/2010/05/iphonejsonjson-framework-by-stig.html

『ピンの座標(起点)変更』
 http://blog.fenrir-inc.com/jp/2011/06/mapkit-pin.html

MapKit – 地図の表示と現在位置の取得と現在位置にピン立て

MKMapViewをIBでViewに追加とか、初歩的な部分は割愛。

前提作業
・アプリに『MapKit.framework』と『CoreLocation.framework』を追加して、import

ViewController.h

#import <UIKit/UIKit.h>
#import <MapKit/Mapkit.h>
#import <CoreLocation/CoreLocation.h>

//MapViewのインスタンス作ったりとか
@interface ViewController : UIViewController <CLLocationManagerDelegate>{
    CLLocationManager *locationManager;
}
@property (nonatomic, retain) CLLocationManager *locationManager;    
@property (strong, nonatomic) IBOutlet MKMapView *mapView;

ViewController.m

- (void)viewDidLoad
{
    locationManager = [[CLLocationManager alloc] init];
    
    // 位置情報サービスが利用できるかどうかをチェック
    if ([CLLocationManager locationServicesEnabled]) {
        locationManager.delegate = self;
        // 測位開始
        [locationManager startUpdatingLocation];
    } else {
        NSLog(@"Location services not available.");
    }

    [super viewDidLoad];
}

// 位置情報更新時
- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation
{
	CLLocationCoordinate2D coordinate = newLocation.coordinate;
    
	[mapView setCenterCoordinate:coordinate animated:NO];
    
	// 縮尺を設定
	MKCoordinateRegion zoom = mapView.region;
	zoom.span.latitudeDelta = 0.005;
	zoom.span.longitudeDelta = 0.005;
	[mapView setRegion:zoom animated:YES];
    mapView.showsUserLocation=TRUE;

    //測位停止
    [locationManager stopUpdatingLocation];
}

// 測位失敗時や、位置情報の利用をユーザーが許可しなかった場合などに呼ばれる
- (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error
{
    UIAlertView* alert = [[UIAlertView alloc] initWithTitle:@"位置情報利用不可" message:@"位置情報の取得に失敗しました。" delegate:nil cancelButtonTitle:nil otherButtonTitles:@"OK", nil];
    
    [alert show];
}

Mapアプリはいろいろ便利なのができそうで、わくわくします。
 
 
2012/8/1追記:
GPSの取得の後に何か処理をする場合、一旦処理を止めてあげないと、GPSの取得に処理の実行速度が勝っちゃって(?)、GPSの取得が中途半端になる模様。

解決策としては、『stopUpdatingLocation』は別メソッドに隔離して、遅延実行してやると良いみたいだ。

        // 測位開始
        [locationManager startUpdatingLocation];
        // 『追加』一秒後に測位停止
        [self performSelector:@selector(stopUpdatingLocation:)
                   withObject:nil
                   afterDelay:1.0];

- (void)stopUpdatingLocation:(NSObject *)args{
    [locationManager stopUpdatingLocation]; //測位停止
}

MKMapViewの追加で困ったこと(フレームワークの追加)

 自分が買った解説書(Xcode4非対応)には、「Mapの表示はとても簡単で〜(略)〜ViewにMKMapViewを追加してビルドして実行。これだけで、最もズームアウトされた状態で、世界地図が表示されるはずです」とか書いてあるんだけど、残念ながらこの通りにやっても、なんか謎のエラー(?)でRunが途中で止まって、そもそも実行すらされない。

 で、何故かと調べてみたら、どうやらMap関係のフレームワークがデフォルトではリンクされていないので、それを手動で追加してやる必要があるらしい。

以下手順。

1.Xcodeの左のペインの一番上、プロジェクト名をクリック。
2.『TARGETS』でプロジェクトを選択して、『Build Phases』タブを選択
3.『Link Binary With Libraries』の横の『>』をクリックして、左下の『+』をクリック
4.フレームワークの一覧が出てくるので、ズワーッとスクロールして、『MapKit.framework』を選択→Add
5.ライブラリに追加された『MapKit.framework』上で右クリック。
6.表示されたメニューの一番下、『Reveal in Project Navigator』をクリック
7.プロジェクトにフレームワークが追加されたのを確認
8.MKMapViewを使っているViewControllerのヘッダーに『#import <MapKit/MapKit.h>』を追加
9.ビルドして実行。

以上。