【Swift】CLGeocoderの使い方。住所を座標に変換してピンを刺す。(Swift 2.1、XCode 7.2)

2020年6月16日

地図の使われ方で一番多いものは

前回までの記事で、MKMapView(以下、マップビュー)を使って地図を表示し、指定した座標にピンを刺す方法を説明してきた。⇒「記事

mapview_pin_color_5color

 

目的地を探すときに、座標を入力したり、地図をスクロールして探すような使い方はあまりされない。一番多いのは、住所やキーワードから目的地を検索する使い方だ。そこで本記事では、住所を座標に変換してピンを刺す方法と、ピンを刺した座標を住所に変換する方法を説明する。

以降の手順は「Map Kit Viewの使い方」の続きから行うので、実装を試してみる人は先に読んでおくことをお勧めする。

 

住所を座標に変換してピンを刺す

テキストフィールドに入力した住所を緯度経度の座標に変換し、その座標にピンを刺す動きを実装する。

まず、デバイス画面にテキストフィールドを配置する(下図赤矢印)。黄緑枠のPinボタンを押して吹き出しの設定画面を表示し、Constrain to marginsのチェックを外す。

黄枠の位置の制約に上「90」、左「30」、右「30」(下は入力しない)、水色枠のHeightにチェックを入れて「Add 4 Constrains」ボタンを押す。これで、画面上部にテキストフィールドが表示されるようになった。

デバイス画面にテキストフィールドを配置する

 

下図赤枠のアシスタントエディタボタンを押してViewController.swiftを開く。

Ctrlキーを押しながらテキストフィールドをドラッグ&ドロップでソースコードまで運んで吹き出しの設定画面を表示する。Connectionに「Outlet」、Nameに「testTextField」を入力し、Connectボタンを押す。これでテキストフィールドをソースコードで操作できるようになった。

テキストフィールドとソースコードのコネクションを確立する

 

ViewController.swiftを以下のコードに変更する。

キーボードのReturnキーが押されたら、テキストフィールドの文字列を使って住所を座標に変換している。

変換にはCLGeocoderクラスのgeocodeAddressStringメソッドを利用し、引数には「住所」と「クロージャ」を与える。「クロージャ」には変換結果エラー情報の2つの変数が渡ってくるので、エラー情報に何も設定されていないときは変換成功としてピンを刺す。

クロージャについては次の記事を参照されたし。⇒「クロージャとは

 

以下は実際のプレイ動画。キーボードで住所を入力するのに時間がかかるので、前もってコピーしておいた文字列をペーストしている。

座標を住所に変換する

次は、地図を長押しした座標を住所に変換し、吹き出しのサブタイトルに設定する動きを実装する。

Long Press Gesture Recognizer(以下、長押し検知)をデバイス画面に配置する(下図赤矢印)。黄緑枠の長押し検知が追加されるので、Ctrlキーを押しながら長押し検知をドラッグ&ドロップでソースコードまで運んで吹き出しの設定画面を表示させる(青矢印)。

Connectionに「Action」、Nameに「pressMap」、Typeに「UILongPressGestureRecognizer」を設定してConnectボタンを押す。これで地図が長押しされたときのイベントをソースコードで受けれるようになった。

Long Press Gesture Recognizerをデバイス画面に配置する

 

ViewController.swiftを以下のコードに変更する。

長押しされた地図の場所を緯度経度の座標に変換したあと、先ほどとは逆方向のreverseGeocodeLocationメソッドを「住所」と「クロージャ」の引数で呼び出している。

先ほどと同じように、「クロージャ」には変換結果エラー情報の2つの変数が渡ってくるので、エラー情報に何も設定されていないときは変換成功としてサブタイトルに住所を設定し、ピンを刺す。

 

以下は実際のプレイ動画

 

日本の住所で使われる、変換結果のプロパティの内容と例を下表にまとめる。

プロパティ名 内容 設定例
1 postalCode 郵便番号 160-0023
2 country 日本
3 administrativeArea 都道府県 東京都
4 locality 市区町村 新宿区
5 subLocality 西新宿
6 thoroughfare 西新宿1丁目
7 subThoroughfare 番地 7番3号