2015年3月24日火曜日

swift iPhone画面上に映っている地図の距離をメートルで取得する。

iPhoneで地図を使ったアプリを開発する際、画面上にうつってる範囲の距離を取得したい時があります。
画面上で見えてる範囲だけ距離を取得しAPIに投げたい。のが動機です。

まずはiPhone上に地図を表示しなくては始まりませんね。
xcodeで新規プロジェクト、シングルページで新規アプリを作ります。
下記コードをコピペ。とりあえず地図が表示されます。
//
// ViewController.swift
// MapKit001
//
import UIKit
import MapKit
class ViewController: UIViewController, MKMapViewDelegate {
// MapView.
var myMapView : MKMapView!
override func viewDidLoad() {
super.viewDidLoad()
// MapViewの生成.
myMapView = MKMapView()
// MapViewのサイズを画面全体に.
myMapView.frame = self.view.bounds
// Delegateを設定.
myMapView.delegate = self
// MapViewをViewに追加.
self.view.addSubview(myMapView)
// 中心点の緯度経度.
let myLat: CLLocationDegrees = 37.506804
let myLon: CLLocationDegrees = 139.930531
let myCoordinate: CLLocationCoordinate2D = CLLocationCoordinate2DMake(myLat, myLon)
// 縮尺.
let myLatDist : CLLocationDistance = 100
let myLonDist : CLLocationDistance = 100
// Regionを作成.
let myRegion: MKCoordinateRegion = MKCoordinateRegionMakeWithDistance(myCoordinate, myLatDist, myLonDist);
// MapViewに反映.
myMapView.setRegion(myRegion, animated: true)
}
// Regionが変更された時に呼び出されるメソッド.
func mapView(mapView: MKMapView!, regionDidChangeAnimated animated: Bool) {
println("regionDidChangeAnimated")
}
}
view raw gistfile1.swift hosted with ❤ by GitHub
参考にさせて頂きました。Swift Docs 地図の表示

下記のファンクションを使用します。
/ Regionが変更された時に呼び出されるメソッド.
func mapView(mapView: MKMapView!, regionDidChangeAnimated animated: Bool) {
println("regionDidChangeAnimated")
}
view raw gistfile1.swift hosted with ❤ by GitHub
これは地図内を移動したり、縮尺を変えたりした時に通知されるファンクションです。
このファンクションを利用し、地図に変化があった場合、その都度距離を取得します。


下記内容に変更します。
iPhoneの縦の距離を表示します。
func mapView(mapView: MKMapView!,
regionDidChangeAnimated animated: Bool) {
println("regionDidChangeAnimated")
var mRect = mapView.visibleMapRect
var topMapPoint = MKMapPointMake(MKMapRectGetMidX(mRect), MKMapRectGetMinY(mRect))
var bottomMapPoint = MKMapPointMake(MKMapRectGetMidX(mRect), MKMapRectGetMaxY(mRect))
var currentDist = MKMetersBetweenMapPoints(topMapPoint, bottomMapPoint)
println("\(currentDist)m")
}
view raw gistfile1.swift hosted with ❤ by GitHub
画面上部真ん中と画面下部の真ん中の距離をメートルで表示しています。
コンソールに距離が表示されます。

もし横方向の距離を取得したい場合は下記に変更します。
func mapView(mapView: MKMapView!,
regionDidChangeAnimated animated: Bool) {
println("regionDidChangeAnimated")
var mRect = mapView.visibleMapRect
var leftMapPoint = MKMapPointMake(MKMapRectGetMinX(mRect), MKMapRectGetMidY(mRect))
var rightMapPoint = MKMapPointMake(MKMapRectGetMaxX(mRect), MKMapRectGetMidY(mRect))
var currentDist = MKMetersBetweenMapPoints(leftMapPoint, rightMapPoint)
println("\(currentDist)m")
}
view raw gistfile1.swift hosted with ❤ by GitHub
画面左真ん中と画面右真ん中の距離をメートルで表示しています。

受け取った距離を使ってAPIに投げれば画面上の情報の取得が可能です。

Related Posts:

  • 【ECCUBE3】複数の規格がある商品をcsvで登録する。ECCUBE2系の頃から規格が複数ある商品をcsvで登録するにはカスタマイズが必要でした。 EC CUBE3系も同様なので、商品登録csvの「規格分類1(ID)」セルにカンマ区切りで規格分類IDを入力すると登録できる仕様にしてみましょう。 ※「規格分類2(ID)」には手を加えないので、「規格分類1(… Read More
  • swift MapView PolyLine上を移動するアニメーションMapViewに描画したPolyLine上を移動するアニメーションを作りたくて試行錯誤。 アニメーションを使うというより、座標がわかっているので、ピンを座標に沿って移動していけば良いという事に辿り着く。 ずっとアニメーションで検索してたから結論になかなか辿り着けなかった。。。 stackoverf… Read More
  • 【ECCUBE3 プラグイン】最近購入された商品 【ECCUBE3 プラグイン】最近購入された商品 ECCUBE3の商品詳細画面に最近購入された商品を追加します。 ソースはGithubにupしています。 こちらから How to install Githubページの右下の「Download ZIP」からZIPファイルをダウンロード E… Read More
  • Gmailに来た作業依頼メールをTrelloの新規カードとして追加する。今日はTrelloの新しい発見。 Trello・・・TODOリストですね。 細かい使い方は省略して、今日はタイトル通り、特定のメールアドレスに作業依頼が来るので、Gmailに来た作業依頼メールをTrelloに新規カードとして追加する。という事をします。 Trelloボードにメンバー追加してカード… Read More
  • 【ECCUBE】2.12系 在庫のない規格を選択肢から消す。ECCUBE 2.12系で在庫のない商品の規格を選択肢から削除したい。 在庫がない場合、選択肢の横に(品切れ中)とは表示されるが、紛らわしいので消してしまおうという事に。 まずは「商品詳細ページ」のページ詳細を見てみる事に。 どうやら規格の選択肢の生成にはSmartyのhtml_optionを使っ… Read More

0 コメント:

コメントを投稿