아미(아름다운미소)

swift 맵 뷰로 지도 나타내기4 (위치와 경도로 원하는 핀 설치하기) 본문

랭귀지/SWIFT

swift 맵 뷰로 지도 나타내기4 (위치와 경도로 원하는 핀 설치하기)

유키공 2018. 2. 2. 12:30

위치와 경도로 원하는 핀 설치하기

위치 

 마지막줄 

연결(Connection)

 Action

이름(Name)

 sgChangeLocation

유형(Type)

 UISegmentedControl


[전체소스]


import UIKit

import MapKit


class ViewController: UIViewController, CLLocationManagerDelegate{

    @IBOutlet weak var myMap: MKMapView!

    @IBOutlet weak var lblLocationInfo1: UILabel!

    @IBOutlet weak var lblLocationInfo2: UILabel!

    

    let locationManager = CLLocationManager()

    

    override func viewDidLoad() {

        super.viewDidLoad()

        //위치정보 레이블은 동백으로 둡니다.

        lblLocationInfo1.text = " "

        lblLocationInfo2.text = " "

        //상수 locationManager의 델리게이트를 self로 설정합니다.

        locationManager.delegate = self

        //정확도를 최고로 설정합니다.

        locationManager.desiredAccuracy = kCLLocationAccuracyBest

        //위치 데이터를 추적하기 위해 사용자에게 승인을 요구합니다.

        locationManager.requestWhenInUseAuthorization()

        //위치 업데이트를 시작합니다.

        locationManager.startUpdatingLocation()

        //위치보기 값을 true로 설정합니다.

        myMap.showsUserLocation = true

    }


    override func didReceiveMemoryWarning() {

        super.didReceiveMemoryWarning()

    }


//    func goLocation(latitude latitudeValue: CLLocationDegrees, longitude longitudeValue : CLLocationDegrees, delta span :Double) {

//        //위도 값과 경도 값을 매개변수로 하여 CLLocationCoordinate2DMake 함수를 호출하고, 리턴값을 pLocation로 받습니다.

//        let pLocation = CLLocationCoordinate2DMake(latitudeValue, longitudeValue)

//        //범위 값을 매개변수로 하여 MKCoordinateSpanMake함수를 호출하고, 리턴 값을 spanValue로 받습니다.

//        let spanValue = MKCoordinateSpanMake(span, span)

//        //pLocation와 spanValue를 매개변수로 하여 MKCoordinateRegionMake 함수를 호출하고, 리턴 값을 pRegion으로 받습니다.

//        let pRegion = MKCoordinateRegionMake(pLocation, spanValue)

//        //pRegion을 매개변수로하여 myMap.setRegion 함수를 호출합니다.

//        myMap.setRegion(pRegion, animated: true)

//    }

    func goLocation(latitude latitudeValue: CLLocationDegrees, longitude longitudeValue : CLLocationDegrees, delta span :Double)->CLLocationCoordinate2D {

        //위도 값과 경도 값을 매개변수로 하여 CLLocationCoordinate2DMake 함수를 호출하고, 리턴값을 pLocation로 받습니다.

        let pLocation = CLLocationCoordinate2DMake(latitudeValue, longitudeValue)

        //범위 값을 매개변수로 하여 MKCoordinateSpanMake함수를 호출하고, 리턴 값을 spanValue로 받습니다.

        let spanValue = MKCoordinateSpanMake(span, span)

        //pLocation와 spanValue를 매개변수로 하여 MKCoordinateRegionMake 함수를 호출하고, 리턴 값을 pRegion으로 받습니다.

        let pRegion = MKCoordinateRegionMake(pLocation, spanValue)

        //pRegion을 매개변수로하여 myMap.setRegion 함수를 호출합니다.

        myMap.setRegion(pRegion, animated: true)

        return pLocation

    }

    

    func setAnnotation(latitude latitudeValue: CLLocationDegrees, longitude longitudeValue: CLLocationDegrees, delta span : Double, title strTitle: String, subtitle strSubtitle:String) {

        //핀을 설치하기 위해 MKPointAnnotation 함수를 호출하여 리턴 값을 annotation으로 받습니다.

        let annotation = MKPointAnnotation()

        //annotation의 coordinate 값을 goLocation함수로부터 CLLocationCoordinate2DMake형태로 받아야 하는데, 이를 위해서는 goLocation 함수를 수정해야 합니다.

        annotation.coordinate = goLocation(latitude: latitudeValue, longitude: longitudeValue, delta: span)

        annotation.title = strTitle

        annotation.subtitle = strSubtitle

        myMap.addAnnotation(annotation)

    }

    

    func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {

        //위치가 업데이트되면 먼저 마지막 위치 값을 찿아냅니다.

        let pLocation = locations.last

        //마지막 위치의 위도와 경도 값을 가지고 앞에서 만든 goLocation함수를 호출 합니다.이때 delta를 0.01로 하였으니 1의 값보다 지도를 100배로 확대해서 보여 줄 것입니다.

        goLocation(latitude: (pLocation?.coordinate.latitude)!, longitude: (pLocation?.coordinate.longitude)!, delta: 0.01)

        

        CLGeocoder().reverseGeocodeLocation(pLocation!, completionHandler: {

            (placemarks, error) -> Void in

            //placemarks 값의 첫 부분만 pm 상수로 대입합니다.

            let pm = placemarks!.first

            //pm 상수에서 나라 값을 country 상수에 대입합니다.

            let country = pm!.country

            //문자열 address에 country 상수의 값을 대입합니다.

            var address:String = country!

            //pm 상수에서 지역 값이 존재하면 address 문자열에 추가합니다.

            if pm!.locality != nil {

                address += " "

                address += pm!.locality!

            }

            if pm!.thoroughfare != nil {

                address += " "

                address += pm!.thoroughfare!

            }

            //레이블에 "현재위치" 텍스트를 표시합니다.

            self.lblLocationInfo1.text = "현재위치"

            //레이블에 address문자열의 값을 표시합니다.

            self.lblLocationInfo2.text = address

        })

        //마지막으로 위치가 업데이트되는 것을 멈추게 합니다.

        locationManager.stopUpdatingLocation()

    }

    @IBAction func sgChangeLocation(_ sender: UISegmentedControl) {

        

        if sender.selectedSegmentIndex == 0 {

        //현재 위치 표시

            self.lblLocationInfo1.text = " "

            self.lblLocationInfo2.text = " "

            locationManager.startUpdatingLocation()

        } else if sender.selectedSegmentIndex == 1 {

        //서울대학교

            setAnnotation(latitude: 37.459984, longitude: 126.951884, delta: 0.01, title: "서울대학교", subtitle: "서울특별시 관악구 관악로 1")

            self.lblLocationInfo1.text = "보고 계신 위치"

            self.lblLocationInfo2.text = "서울대학교"

        }else if sender.selectedSegmentIndex == 2 {

        //우리짐

            setAnnotation(latitude: 37.489613, longitude: 126.951825, delta: 0.01, title: "우리집", subtitle: "서울특별시 관악구 봉천동 성현로 80")

            self.lblLocationInfo1.text = "보고 계신 위치"

            self.lblLocationInfo2.text = "우리집"

        }else if sender.selectedSegmentIndex == 3 {

            setAnnotation(latitude: 37.545882, longitude: 127.014120, delta: 0.01, title: "옥수리버젠", subtitle: "서울특별시 성동구 옥수동 500")

            self.lblLocationInfo1.text = "보고 계신 위치"

            self.lblLocationInfo2.text = "우리집"

        }

    }

    

}


[부분소스]


    func goLocation(latitude latitudeValue: CLLocationDegrees, longitude longitudeValue : CLLocationDegrees, delta span :Double)->CLLocationCoordinate2D {

        //위도 값과 경도 값을 매개변수로 하여 CLLocationCoordinate2DMake 함수를 호출하고, 리턴값을 pLocation로 받습니다.

        let pLocation = CLLocationCoordinate2DMake(latitudeValue, longitudeValue)

        //범위 값을 매개변수로 하여 MKCoordinateSpanMake함수를 호출하고, 리턴 값을 spanValue로 받습니다.

        let spanValue = MKCoordinateSpanMake(span, span)

        //pLocation와 spanValue를 매개변수로 하여 MKCoordinateRegionMake 함수를 호출하고, 리턴 값을 pRegion으로 받습니다.

        let pRegion = MKCoordinateRegionMake(pLocation, spanValue)

        //pRegion을 매개변수로하여 myMap.setRegion 함수를 호출합니다.

        myMap.setRegion(pRegion, animated: true)

        return pLocation

    }


    func setAnnotation(latitude latitudeValue: CLLocationDegrees, longitude longitudeValue: CLLocationDegrees, delta span : Double, title strTitle: String, subtitle strSubtitle:String) {

        //핀을 설치하기 위해 MKPointAnnotation 함수를 호출하여 리턴 값을 annotation으로 받습니다.

        let annotation = MKPointAnnotation()

        //annotation의 coordinate 값을 goLocation함수로부터 CLLocationCoordinate2DMake형태로 받아야 하는데, 이를 위해서는 goLocation 함수를 수정해야 합니다.

        annotation.coordinate = goLocation(latitude: latitudeValue, longitude: longitudeValue, delta: span)

        annotation.title = strTitle

        annotation.subtitle = strSubtitle

        myMap.addAnnotation(annotation)

    }


    @IBAction func sgChangeLocation(_ sender: UISegmentedControl) {

        if sender.selectedSegmentIndex == 0 {

        //현재 위치 표시

            self.lblLocationInfo1.text = " "

            self.lblLocationInfo2.text = " "

            locationManager.startUpdatingLocation()

        } else if sender.selectedSegmentIndex == 1 {

        //서울대학교

            setAnnotation(latitude: 37.459984, longitude: 126.951884, delta: 0.01, title: "서울대학교", subtitle: "서울특별시 관악구 관악로 1")

            self.lblLocationInfo1.text = "보고 계신 위치"

            self.lblLocationInfo2.text = "서울대학교"

        }else if sender.selectedSegmentIndex == 2 {

        //우리짐

            setAnnotation(latitude: 37.489613, longitude: 126.951825, delta: 0.01, title: "우리집", subtitle: "서울특별시 관악구 봉천동 성현로 80")

            self.lblLocationInfo1.text = "보고 계신 위치"

            self.lblLocationInfo2.text = "우리집"

        }else if sender.selectedSegmentIndex == 3 {

            setAnnotation(latitude: 37.545882, longitude: 127.014120, delta: 0.01, title: "옥수리버젠", subtitle: "서울특별시 성동구 옥수동 500")

            self.lblLocationInfo1.text = "보고 계신 위치"

            self.lblLocationInfo2.text = "우리집"

        }

    }


[결과화면]

위치와 경도로 원하는 핀 설치하기


Comments