2. Geolocation 객체를 이용한 위치 정보 서비스


* 위치 정보 서비스

- 위치 정보 서비스(Geolocation)란 브라우저가 현재 위도와 경도를 자바스크립트 코드에게 공급하는 서비스이다.


* geolocation 객

브라우저는 geolocation 이름의 객체를 통해 위치 정보 서비스를 제공한다. 이 객체는 다음 2가지 방법으로 접근할 수 있다.

navigator.geolocation

window.navigator.geolocation



geolocation 객체의 메소드

getCurrentPosition() // 현재 위치 얻기

watchPosition() // 위치가 변경될 때마다 알려주는 반복 위치 서비스 시작

clearWatch() // 반복 위치 서비스 중단


* 현재 위치 얻기

getCurrentPosition()는 호출 즉시 현재위치를 리턴하는 것이 아니라, 위치가 파악되면 호출될 positionCallback(Position) 함수를 등록한다.

1
2
3
4
5
navigator.geolocation.getCurrentPosition(positionCallback(필수), errorCallback(생략가능), options(생략가능))
positionCallback : 현재 위치가 파악되었을 때 호출되는 콜백 함수명, 필수
errorCallback : 위치 파악 중 오류가 발생하였을 때 호출되는 콜백 함수명, 생략가능
options : 위치 파악 허용 최대 시간, 대기 시간, 위치에 대한 정확도 등의 정보를 담은 객체. 생략가능
 
cs



* Position 타입 객체 (메소드 없음)

coords // 현재 위치를 나타내는 Coordinates 타입의 객체

timestamp // 위치가 파악된 시간 정보


* Coordinates 타입 객체 (메소드 없음)

latitude // 위도의 실수 값

longitute // 경도의 실수 값

accuracy // 위도와 경도의 정확도를 표현하는 실수 값. 미터 단위

altitude // 고도의 실수 값. 미터 단위. 제공하지 않을 때 null

altitudeAccuracy // 고도의 정확도를 표현하는 실수 값. 미터 단위

heading // 컴퓨터나 장치가 움직이는 방향 정보의 실수 값. 시계 방향의 각도(0~360)를 뜻하며,

북쪽 방향이 0도, spped 값이 0이면 이 값은 의미 없음. 제공하지 않을 때 null

speed // 초당 미터 값으로 컴퓨터나 장치가 움직이는 속도. 제공하지 않을 때 null


예제 13-5. getCurrentPosition()로 현재 위치 파악

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
32
33
34
35
36
37
38
39
40
41
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>getCurrentPosition()로 현재 위치 파악</title></head>
<body>
<h3>getCurrentPosition()로 현재 위치 파악</h3>
<hr>
<div id="msg">이곳에  위치 정보 출력</div>
<div id="map"></div>
<script>
if(!navigator.geolocation)
    alert("지원하지 않음");
else // found() 콜백 함수 등록
    navigator.geolocation.getCurrentPosition(found);
 
// 위치 파악 시 found() 호출.
// 위치 정보 들어 있는 position 객체가 매개 변수로 넘어온다.
function found(position) {
    var now = new Date(position.timestamp);
    var lat = position.coords.latitude; // 위도
    var lon = position.coords.longitude; // 경도
    var acc = position.coords.accuracy; // 정확도
 
    // 위도와 경도의 소수점 이하 자리가 너무 길어 유효 숫자 6자리로 짜름
    lat = lat.toPrecision(6); lon = lon.toPrecision(6);
 
    var text = "현재 시간 " + now.toUTCString() + "<br>";
    text += "현재 위치 (위도 " + lat + "°, 경도 " + lon + "°)<br>";
    text += "정확도 " + acc + "m<br>";
 
    document.getElementById("msg").innerHTML = text;
    var img = new Image();
    img.src = "https://maps.googleapis.com/maps/api/staticmap?center=" + lat
            + "," + lon + "&zoom=13&size=400x300&sensor=false&markers=color:red%7Clabel:C%7C"+ lat +"," + lon + "&key=AIzaSyCsMeRJB-5RGwpEQi8Bqf6kTa_Hw5h1lAc";
 
    document.getElementById("map").appendChild(img); // 구글 지도 이미지를 div의 자식으로 붙임
}
</script>
</body></html>
 
cs

* 반복 위치 서비스

이동 중에 위치가 변경될 때마다 계속 위치 서비스를 받을 수 있다.

이것은 watchPosition() 메소드로 위치가 변경될 때마다 호출되는 콜백 함수를 등록하면 된다.

1
2
3
4
5
id = navigator.geolocation.watchPosition(positionCallback(필수), errorCallback(생략가능), options(생략가능))
positionCallback : 현재 위치가 파악되었을 때 호출되는 콜백 함수명, 필수
errorCallback : 위치 파악 중 오류가 발생하였을 때 호출되는 콜백 함수명, 생략가능
options : 위치 파악 허용 최대 시간, 대기 시간, 위치에 대한 정확도 등의 정보를 담은 객체. 생략가능
리턴값 : 반복 위치 서비스 id
cs


1
2
3
4
5
6
7
8
9
var watchId = navigator.geolocation.watchPosition(changed); // changed()를 콜백
// 함수로 등록하고, 반복 위치 서비스를 시작시킨다.
// 위치가 바뀌면 changed()가 호출되고, 위치 정보가 들어 있는 position 객체가 매개 변수로 넘어온다.
function changed(position)
{
    var lat = position.coords.latitude; // 변경된 위도
    var lon = position.coords.longitude; // 변경된 경도
    alert("(" + lat + "," + lon + ") 위치로 변경됨");
}
cs
watchPosition()에 등록된 changed(position) 함수는 컴퓨터나 모바일 장치의 위치가 변경될 때마다 계속 호출되며,

매개 변수 position에는 갱신된 위치 정보가 전달된다.


* 반복 위치 서비스 중단
watchPosition()은 반복 위치 서비스 id 값을 리턴한다.
이 리턴 값은 다음과 같이 반복 위치 서비스를 해제할 때 사용된다.


navigator.geolocation.clearWatch(watchID); // watchID의 반복 위치 서비스 중단


예제 13-6. watchPosition()으로 반복 위치 서비스

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>watchPosition()으로 반복 위치 서비스</title></head>
<body>
<h3>watchPosition()으로 반복 위치 서비스</h3>
<hr>
<div id="msg">이곳에  위치 정보 출력</div>
<div id="map"></div>
<script>
if(!navigator.geolocation)
    alert("지원하지 않음");
else {
    var options = { // watchPosition()의 마지막 매개 변수로 전달
        enableHighAccuracy: false,
        timeout: 5000,
        maximumAge: 0 };
    var img = new Image();
    var count=0;
    var watchID;
 
    // changed() 콜백 함수를 등록하고, 반복 위치 서비스 시작
    watchID = navigator.geolocation.watchPosition(changed, null, options);
}
 
//위치가 바뀌면 changed()가 호출되고, 위치 정보가 들어 있는 position 객체가 매개 변수로 넘어온다.
function changed(position) {
    if(count == 5) { // clearWatch() 테스트를 위해 5번만 서비스
        navigator.geolocation.clearWatch(watchID); // 반복 서비스 종료
        document.getElementById("msg").innerHTML = "위치 서비스 종료";
        return;
    }
    var lat = position.coords.latitude; // 변경된 위도
    var lon = position.coords.longitude // 변경된 경도
    var text = count + ": (위도 " + lat + "°, 경도 " + lon + "°)로 변경됨<br>";
    document.getElementById("msg").innerHTML = text; // 위치 정보 출력
 
    // 지도 이미지 갱신
    img.src = "https://maps.googleapis.com/maps/api/staticmap?center=" + lat
                + "," + lon + "&zoom=13&size=400x300&sensor=false&markers=color:red%7Clabel:C%7C"+lat +"," +lon;
    if(count == 0// 처음이면 구글 지도 이미지 부착
        document.getElementById("map").appendChild(img); // 지도 이미지 부착
    count++// 갱신 회수 증가
}
</script>
</body></html>
 
cs


Posted by 너래쟁이
: