Notice
Recent Posts
Recent Comments
Link
ยซ   2024/05   ยป
์ผ ์›” ํ™” ์ˆ˜ ๋ชฉ ๊ธˆ ํ† 
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Archives
Today
Total
๊ด€๋ฆฌ ๋ฉ”๋‰ด

lgvv98

Map - ์ฝ”๋“œ๋ฆฌ๋ทฐ(๋งต๋ทฐ) ๋ณธ๋ฌธ

โš ๏ธ deprecated โš ๏ธ/Doit ์•„์ดํฐ ์•ฑ(์ž…๋ฌธ)

Map - ์ฝ”๋“œ๋ฆฌ๋ทฐ(๋งต๋ทฐ)

๐Ÿฅ• ์บ๋Ÿฟ๋งจ 2021. 3. 2. 12:55

Map.zip
0.06MB

 

//
//  ViewController.swift
//  Map
//
//  Created by Hamlit Jason on 2021/02/21.
//

import UIKit
import MapKit
class ViewController: UIViewController, CLLocationManagerDelegate {

    // ๊ถŒํ•œ์ด ์•ˆ๋œจ๋ฉด ์ดˆ๊ธฐ์— ํ—ˆ์šฉํ•ด๋‘์–ด์„œ ๊ทธ๋ ‡๊ณ , plist ์ˆ˜์ •์‹œ ์ฑ… 256์ชฝ ์ฐธ๊ณ 
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
        lblLocationInfo1.text = "" // ์œ„์น˜ ์ •๋ณด๋ฅผ ํ‘œ์‹œํ•  ๋ ˆ์ด๋ธ”
        lblLocationInfo2.text = "" // ์œ„์น˜ ์ •๋ณด๋ฅผ ํ‘œ์‹œํ•  ๋ ˆ์ด๋ธ”
        locationManager.delegate = self // ์ƒ์ˆ˜ ๋กœ์ผ€์ด์…˜ ๋ฉ”๋‹ˆ์ €์˜ ๋ธ๋ฆฌ๊ฒŒ์ดํŠธ๋ฅผ ์…€๋กœํ”„ ์„ค์ •
        locationManager.desiredAccuracy = kCLLocationAccuracyBest // ์ •ํ™•๋„๋ฅผ ์ตœ๊ณ ๋กœ ์„ค์ •
        locationManager.requestWhenInUseAuthorization() // ์œ„์น˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”์ ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ์ž์—๊ฒŒ ์Šน์ธ์„ ์š”๊ตฌํ•˜๋Š” ์ฝ”๋“œ
        locationManager.startUpdatingLocation() // ์œ„์น˜ ์—…๋ฐ์ดํŠธ ์‹œ์ž‘
        myMap.showsUserLocation = true // ์œ„์น˜ ๋ณด๊ธฐ ๊ฐ’์„ ํŠธ๋ฃจ๋กœ ์„ค์ •
    }
    
    let locationManager = CLLocationManager()
    
    @IBOutlet var myMap: MKMapView!
    
    @IBOutlet var lblLocationInfo1: UILabel!
    @IBOutlet var lblLocationInfo2: UILabel!
    
    @IBAction func sgChangeLocation(_ sender: UISegmentedControl) {
        if sender.selectedSegmentIndex == 0 {
            self.lblLocationInfo1.text = "" // ๋ ˆ์ด๋ธ” ์ดˆ๊ธฐํ™”
            self.lblLocationInfo2.text = "" // ๋ ˆ์ด๋ธ” ์ดˆ๊ธฐํ™”
            locationManager.startUpdatingLocation() // ์œ„์น˜ ์—…๋ฐ์ดํŠธํ•˜๋Š” ์ฝ”๋“œ
        } else if sender.selectedSegmentIndex == 1 {
            setAnnotation(latitudeValue: 37.73728281049552, longitudeValue: 128.89024026920865, delta: 1, title: "ํด๋ฆฌํ…๋Œ€ํ•™ ๊ฐ•๋ฆ‰์บ ํผ์Šค", subtitle: "๊ฐ•์›๋„ ๊ฐ•๋ฆ‰์‹œ ๋‚จ์‚ฐ์ดˆ๊ต๊ธธ 121") // ๋ธํƒ€ ๊ฐ’์€ ํ™•๋Œ€๋น„์œจ๋กœ ๊ธฐ์ค€์ด 1์ด๊ณ  ์ด๋ณด๋‹ค ์ž‘์œผ๋ฉด ํ™•๋Œ€ ํฌ๋ฉด ์คŒ์•„์›ƒ์ด๋‹ค.
            self.lblLocationInfo1.text = "๋ณด๊ณ  ๊ณ„์‹  ์œ„์น˜"
            self.lblLocationInfo2.text = "ํ•œ๊ตญ ํด๋ฆฌํ…๋Œ€ํ•™ ๊ฐ•๋ฆ‰์บ ํผ์Šค"
        } else if sender.selectedSegmentIndex == 2 {
            setAnnotation(latitudeValue: 37.556876, longitudeValue: 126.914066, delta: 0.1, title: "์ด์ง€ ํผ๋ธ”๋ฆฌ์‹ฑ", subtitle: "์„œ์šธ์‹œ ๋งˆํฌ๊ตฌ ์ž”๋‹ค๋ฆฌ๋กœ 109 ์ด์ง€์Šค ๋นŒ๋”ฉ")
            self.lblLocationInfo1.text = "๋ณด๊ณ  ๊ณ„์‹  ์œ„์น˜"
            self.lblLocationInfo2.text = "์ด์ง€ํผ๋ธ”๋ฆฌ์‹ฑ ์ถœํŒ์‚ฌ"
        } else if sender.selectedSegmentIndex == 3 {
            setAnnotation(latitudeValue: 37.5433183958374, longitudeValue: 127.08835455546703, delta: 0.1, title: "์ž์ทจ๋ฐฉ", subtitle: "์„œ์šธ์‹œ ๊ด‘์ง„๊ตฌ ์ž์–‘๋กœ 30๊ธธ 63")
            self.lblLocationInfo1.text = "๋ณด๊ณ  ๊ณ„์‹  ์œ„์น˜"
            self.lblLocationInfo2.text = "์ž์ทจ๋ฐฉ"
        }
        
        
    }
    
   
    
    func goLocation(latitudeValue : CLLocationDegrees, longitudeValue : CLLocationDegrees, delta span : Double) -> CLLocationCoordinate2D {
        // ์œ„๋„์™€ ๊ฒฝ๋„๋กœ ์›ํ•˜๋Š” ์œ„์น˜๋ฅผ ํ‘œ์‹œํ•˜๊ธฐ ์œ„ํ•œ ํ•จ์ˆ˜
        
        
        let pLocation = CLLocationCoordinate2DMake(latitudeValue, longitudeValue) // ์œ„๋„ ๊ฐ’๊ณผ ๊ฒฝ๋„ ๊ฐ’์„ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ํ•˜์—ฌ ํ•จ์ˆ˜ํ˜ธ์ถœํ•˜์—ฌ ๊ทธ๊ฒƒ์„ ๋ฐ›๋Š”๋‹ค.
        let spanValue = MKCoordinateSpan(latitudeDelta: span, longitudeDelta: span) // ๋ฒ”์œ„ ๊ฐ’์„ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ํ•˜์—ฌ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๊ณ  ๋ฆฌํ„ด๊ฐ’์„ ๋ฐ›๋Š”๋‹ค
        let pRegion = MKCoordinateRegion(center: pLocation, span: spanValue) // ์œ„์˜ ๋‘ ์ •๋ณด๋ฅผ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ํ•˜์—ฌ ๋ฆฌํ„ด๊ฐ’์„ ๋ฐ›๋Š”๋‹ค.
        myMap.setRegion(pRegion, animated: true) // ํ•จ์ˆ˜ ํ˜ธ์ถœ!
        
        return pLocation
    }
    

    
    func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
        // ์œ„์น˜๊ฐ€ ์—…๋ฐ์ดํŠธ ๋˜์—ˆ์„ ๋•Œ ์ง€๋„์— ์œ„์น˜๋ฅผ ๋‚˜ํƒ€๋‚ด๊ธฐ ์œ„ํ•œ ํ•จ์ˆ˜
        let pLocation = locations.last // ์œ„์น˜๊ฐ€ ์—…๋ฐ์ดํŠธ ๋˜๋ฉด ๋จผ์ € ๋งˆ์ง€๋ง‰ ์œ„์น˜ ๊ฐ’์„ ์ฐพ์•„๋‚ธ๋‹ค
        _ = goLocation(latitudeValue: (pLocation?.coordinate.latitude)!, longitudeValue: (pLocation?.coordinate.longitude)!, delta: 0.01) // ๋งˆ์ง€๋ง‰ ์œ„์น˜์˜ ์œ„๋„์™€ ๊ฒฝ๋„ ๊ฐ’์„ ๊ฐ€์ง€๊ณ  ์•ž์—์„œ ๋งŒ๋“  goLocation ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค. ์ด๋•Œ delta ๊ฐ’์€ ์ง€๋„์˜ ํฌ๊ธฐ๋ฅผ ์ •ํ•˜๋Š”๋ฐ, ๊ฐ’์ด ์ž‘์„์ˆ˜๋ก ํ™•๋Œ€๋˜๋Š” ํšจ๊ณผ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. delta 0.01๋กœ ํ•˜์˜€์œผ๋‹ˆ 1์˜ ๊ฐ’๋ณด๋‹ค ์ง€๋„๋ฅผ 100๋ฐฐ๋กœ ํ™•๋Œ€ํ•ด์†Œ ๋ณด์—ฌ์ค„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. _ ํ‘œ์‹œ๋Š” ์›Œ๋‹์ด๋‚˜ ์—๋Ÿฌ๋ฅผ ๋ง‰๊ธฐ ์œ„ํ•œ ์ฝ”๋“œ
        
        CLGeocoder().reverseGeocodeLocation(pLocation!, completionHandler: {
            /*
             ํ”Œ๋ ˆ์ด์Šค ๋งˆํฌ ๊ฐ’์˜ ์ฒซ ๋ถ€๋ถ„๋งŒ pm์ƒ์ˆ˜๋กœ ๋ฐ›๋Š”๋‹ค.
             country ๋‚˜๋ผ
             locality ์ง€์—ญ
             thoroughfare ๋„๋กœ
             
             ๋‚˜๋ผ ์ง€์—ญ ๋„๋กœ --> ๊ณต๋ฐฑ๋„ฃ์–ด ์ฝ๊ธฐ ์‰ฝ๊ฒŒํ•˜๊ธฐ
             */
            
            (placemarks, error) -> Void in
            let pm = placemarks!.first // ํ”Œ๋ ˆ์ด์Šค๋งˆํฌ ๊ฐ’์˜ ์ฒซ ๋ถ€๋ถ„๋งŒ pm์ƒ์ˆ˜๋กœ ๋Œ€์ž…ํ•œ๋‹ค
            let country = pm!.country // pm์ƒ์ˆ˜์—์„œ ๋‚˜๋ผ ๊ฐ’์„ ์ปจํŠธ๋กœ ์ƒ์ˆ˜์— ๋Œ€์ž…
            var address: String = country! // ๋ฌธ์ž์—ด address์— country ์ƒ์ˆ˜์˜ ๊ฐ’์„ ๋Œ€์ž…ํ•ฉ๋‹ˆ๋‹ค.
            if pm!.locality != nil { // pm ์ƒ์ˆ˜์—์„œ ๋„๋กœ ๊ฐ’์ด ์กด์žฌํ•˜๋ฉด adress ๋ฌธ์ž์—ด์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค
                address += " " // ๊ณต๋ฐฑ๋„ฃ์–ด์„œ ์ฝ๊ธฐ ์‰ฝ๊ฒŒ ํ•˜๋ ค๊ณ .
                address += pm!.thoroughfare!
            }
            
            self.lblLocationInfo1.text = "ํ˜„์žฌ์œ„์น˜"
            self.lblLocationInfo2.text = address
            
        }) // ์œ„๋„์™€ ๊ฒฝ๋„๊ฐ’์„ ๊ฐ–๊ณ  ์—ญ์œผ๋กœ ์ฃผ์†Œ๋ฅผ ์ฐพ์•„๋ณด๊ฒ ๋‹ค. ํ•ธ๋“ค๋Ÿฌ์˜ ์ต๋ช…ํ•จ์ˆ˜๋ฅผ ์ถ”๊ฐ€๋กœ ์ค€๋น„ํ•ด๊ณ  ์ต๋ช…ํ•จ์ˆ˜๋กœ ์ฒ˜๋ฆฌํ•œ๋‹ค
        
        locationManager.stopUpdatingLocation() // ๋งˆ์ง€๋ง‰์œผ๋กœ ์œ„์น˜๊ฐ€ ์—…๋ฐ์ดํŠธ๋˜๋Š” ๊ฒƒ์„ ๋ฉˆ์ถ”๊ฒŒ ํ•œ๋‹ค.
    }
    
    func setAnnotation(latitudeValue : CLLocationDegrees, longitudeValue : CLLocationDegrees, delta span : Double, title strTitle : String, subtitle strSubtitle : String) {
        let annotation = MKPointAnnotation() // ํ•€์„ ์„ค์ทจํ•˜๊ธฐ ์œ„ํ•ด mkํฌ์ธํŠธ์–ด๋…ธํ…Œ์ด์…˜ ํ•จ์ˆ˜ ํ˜ธ์ถœํ•˜์—ฌ ๋ฆฌํ„ด ๊ฐ’์„ ๋ฐ›๋Š”๋‹ค.
        annotation.coordinate = goLocation(latitudeValue: latitudeValue, longitudeValue: longitudeValue, delta: span) // ์–ด๋…ธํ…Œ์ด์…˜์˜ ์ฟ ๋””๋„ค์ดํŠธ ๊ฐ’์„ ๊ณ ๋กœ์ผ€์ด์…˜ ํ•จ์ˆ˜๋กœ๋ถ€ํ„ฐ 2Dํ˜•ํƒœ๋กœ ๋ฐ›์–ด์•ผํ•˜๋Š”๋ฐ, ์ด๋ฅผ ์œ„ํ•ด์„œ๋Š” goLocation ํ•จ์ˆ˜์— ๋ฆฌํ„ด๊ฐ’์ด ์žˆ๊ฒŒ ์ˆ˜์ •ํ•ด์•ผ ํ•œ๋‹ค.
        
        //annotation.coordinate = goLocation(latitudeValue: latitudeValue, longitudeValue: longitudeValue, delta: span)
        annotation.title = strTitle // ํ•€์˜ ํƒ€์ดํ‹€
        annotation.subtitle = strSubtitle // ํ•€์˜ ์„œ๋ธŒํƒ€์ดํ‹€
        myMap.addAnnotation(annotation) // ๋งต ๋ทฐ์— ๋ณ€์ˆ˜ ์–ด๋…ธํ…Œ์ด์…˜ ๊ฐ’์„ ์ถ”๊ฐ€
        
    }

    
}

 

์—ฌ๊ธฐ ์ฝ”๋“œ๋Š” ์• ํ”Œ์—์„œ ์ง€์›ํ•ด์ฃผ๋Š” ๊ฒƒ์ด๊ณ , ์นด์นด์˜ค๋‚˜ ๊ตฌ๊ธ€ ๋“ฑ api๋ฅผ ์ด์šฉํ•˜์—ฌ ๊ณต๋ถ€ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ™•์žฅํ•˜์ž..! 

์ฃผ์„์„ ๋ณด๋ฉด์„œ ์ดํ•ดํ•˜๋ฉด ์‰ฝ๋‹ค.

 

Comments