일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- javascript
- PER
- 다이어트
- mssql
- 맛집
- 라즈베리파이
- urllib
- ubuntu
- python
- Unity
- flutter
- Excel
- 유니티
- pandas
- swift
- tensorflow
- sqlite
- 함수
- Linux
- GIT
- port
- MS-SQL
- 리눅스
- PyQt
- node.js
- PyQt5
- MySQL
- IOS
- 날짜
- ASP
아미(아름다운미소)
swift 맵 뷰로 지도 나타내기4 (위치와 경도로 원하는 핀 설치하기) 본문
위치와 경도로 원하는 핀 설치하기
위치 |
마지막줄 |
연결(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 = "우리집"
}
}
[결과화면]
'랭귀지 > SWIFT' 카테고리의 다른 글
JSON 문자열을 Dictionary로 변환 (0) | 2018.02.04 |
---|---|
페이지 이동하기 - 페이지 컨트롤 (0) | 2018.02.03 |
swift 맵 뷰로 지도 나타내기3(위치 정보를 추출해서 텍스트로 표시하기) (0) | 2018.02.01 |
swift 맵 뷰로 지도 나타내기2(위도와 경도로 원하는 위치 표시하기) (0) | 2018.01.31 |
swift 맵 뷰로 지도 나타내기1(Map Kit View 추가) (0) | 2018.01.30 |