반응형
블로그 이미지
개발자로서 현장에서 일하면서 새로 접하는 기술들이나 알게된 정보 등을 정리하기 위한 블로그입니다. 운 좋게 미국에서 큰 회사들의 프로젝트에서 컬설턴트로 일하고 있어서 새로운 기술들을 접할 기회가 많이 있습니다. 미국의 IT 프로젝트에서 사용되는 툴들에 대해 많은 분들과 정보를 공유하고 싶습니다.
솔웅

최근에 올라온 글

최근에 달린 댓글

최근에 받은 트랙백

글 보관함

카테고리

[Swift] 현재 위치 맵에 표시하기

2015. 9. 14. 09:28 | Posted by 솔웅


반응형

지난 글에 스위프트로 현재 위치 정보를 얻어서 다루는 방법에 대해 공부했습니다.

이번엔 현재 위치를 가지고 맵에 표시하는 방법을 공부해 보겠습니다.


오늘도 VEA Software의 강좌를 가지고 공부했습니다.


https://www.veasoftware.com/tutorials/2015/7/25/map-view-current-location-in-swift-xcode-7-ios-9-tutorial


이것은 xcode 7 으로 작업했더라구요. 그래서 소스를 받아서 6.4 에서 돌리니까 에러가 났습니다.

그래서 7.1 beta를 설치해서 거기서 돌리니까 제대로 돌아가더라구요.


그런데 이전에 작업했던 걸 불러오니까 자기가 Convert 시켰는데도 실행이 안되네요.

애플의 개발 툴도 아주 안정적이지는 않은 것 같아요.



하여간 일단 소스코드를 보겠습니다.


import UIKit
import MapKit
import CoreLocation

class ViewController: UIViewController, MKMapViewDelegate, CLLocationManagerDelegate
{
    @IBOutlet weak var mapView: MKMapView!
   
    let locationManager = CLLocationManager()
   
    override func viewDidLoad()
    {
        super.viewDidLoad()
       
        self.locationManager.delegate = self
        self.locationManager.desiredAccuracy = kCLLocationAccuracyBest
        self.locationManager.requestWhenInUseAuthorization()
        self.locationManager.startUpdatingLocation()
       
        self.mapView.showsUserLocation = true
       
    }

    override func didReceiveMemoryWarning()
    {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    // MARK: - Location Delegate Methods
   
    func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation])
    {
        let location = locations.last
       
        let center = CLLocationCoordinate2D(latitude: location!.coordinate.latitude, longitude: location!.coordinate.longitude)
        let region = MKCoordinateRegion(center: center, span: MKCoordinateSpan(latitudeDelta: 1, longitudeDelta: 1))
       
        self.mapView.setRegion(region, animated: true)
       
        self.locationManager.stopUpdatingLocation()
    }
   
    func locationManager(manager: CLLocationManager, didFailWithError error: NSError)
    {
        print("Error: " + error.localizedDescription, terminator: "")
    }
   
}


CoreLocation과 관련된 것은 이전 글에서 다뤘으니까 여기서 따로 다루지는 않겠고...


맵을 사용하려면 우선 MapKit 을 import 하고 CLLocationManagerDelegate를 클래스에 추가합니다.


그리고 화면에 맵을 표시해야 하니까 Main.storyBoard 를 사용해서 MapView를 스크린에 얹고 변수 mapView 를 선언합니다.


다음에 viewDidLoad 메소드에 CLLocationManager()를 사용해 구현한 4개의 라인 밑에 맵뷰의 showsUserLocation을 true로 세팅합니다.


이러면 사용자 위치를 보여줄 수 있도록 사전 준비가 다 된 겁니다.


다음은 CLLocationManagerDelegate의 didUpdateLocations 메소드를 구현합니다.

이 메소드 안을 보면 우선 가장 최근의 위치정보를 location 에 담구요 


Core Location의 Data Type 중 하나인 CLLocationCoordinate2D를 사용합니다.

이 데이터 타입에는 CLLocationAccuracy, CLLocationDegrees, CLLocationDirection, CLLocationDistance 그리고 CLLocationSpeed 등이 있습니다.


CLLocationCoordinate2D는 위도와 경도 정보를 받는 겁니다.

이 위도 경도 정보를 center라는 변수에 담습니다.



다음은 MKCoordinateRegion 을 사용합니다. 이것은 MapKit의 데이터 타입중 하나입니다.

이외에 MKCoordinateSpan, MKMapPoint, MKMapSize, MKMapRect, MKZoomScale 등이 있습니다.


MKCoordinateRegion은 위도 경도에 해당하는 지역을 맵의 중앙에 위치하고 MKCoordinateSpan 은 지도의 scale을 정할 수 있습니다.


이렇게 region을 완료하면 그 다음에 이 region을 mapView 에 세팅을 하면 됩니다.

이때 animated는 true로 선언하구요.


그리고 나서 locationManager의 stopUpdatingLocation()을 호출해서 업데이트를 중지시킵니다.


이렇게 하면 지도에 현재의 위치를 표시하게 됩니다.





반응형