Geolocation

Geolocation

Geolocation은 모바일 장치의 위치 정보를 제공하는 오브젝트입니다. 위치 정보는 GPS(Global Positioning System)나 WPS(Wifi Positioning System)를 통해 측정되는데 고도, 방향, 위도, 경도, 속도 정보가 포함됩니다.

위치 정보를 기반으로 하는 서비스는 모바일에서 없어서는 안 될 주요 콘텐츠로 자리매김 했습니다. 특히 지도와 결합하여 길을 찾아주는 내비게이션, 대중교통 정보, 배달 등 다양한 앱에서 활용되고 있습니다.

현재 위치 정보 구하기

위치 정보는 Geolocation 오브젝트의 메소드를 호출하여 구할 수 있습니다. getCurrentPosition 메소드는 현재 시점의 위치 정보를 수신합니다. 주기적으로 위치 정보를 수신하려면 watchStart 메소드를 사용합니다. 메소드 수행이 성공하면 onrecvsuccess 이벤트가 발생하며 GeolocationEventInfo 오브젝트에서 출처, 고도, 방향, 위도, 경도, 속도 등의 값을 구할 수 있습니다.

예제

다음은 GPS 혹은 WPS로부터 위치 정보를 수신받아 모바일 장치의 위치 정보를 보여주는 예제입니다. Accuracy와 Interval Time을 설정한 후 Watch Start 버튼을 터치하면 Interval Time 간격으로 위치 정보를 측정하여 표시해줍니다. Watch Stop 버튼을 터치하면 측정을 멈춥니다.

sample_geolocation_01

예제에서 사용한 핵심 기능

Geolocation > watchStart 메소드

모바일 장치의 위치 정보를 주기적으로 수신하는 메소드입니다. accuracy와 interval time을 인수로 설정합니다. accuracy는 안드로이드의 경우 0~2 사이의 값, iOS의 경우 0~4 사이의 값을 설정할 수 있습니다. interval time은 밀리 초(milliseconds) 단위로 200~86,400,000ms 사이로 설정할 수 있습니다.

Geolocation > sourcetype 속성

위치 정보를 제공한 소스 정보를 갖는 속성입니다. GPS면 1 값을, WPS면 2 값을 갖습니다. iOS 환경에서는 사용할 수 없습니다.

Geolocation > coords 속성

모바일 장치에서 수신한 위치 정보를 갖는 읽기 전용 속성입니다. coords가 갖는 위치 정보는 다음과 같습니다.

accuracy

위치 정보의 오차 범위

altitude

고도 정보(Meter 단위)

altitudeaccuracy

고도 정보의 오차 범위(iOS에서만 지원)

heading

방향 정보(˚ 단위)

latitude

위도 정보

longitude

경도 정보

speed

속도 정보(미터 퍼 세컨드, m/s 단위)

예제 구현 방법

1

화면 구성하기

Geolocation 오브젝트를 추가합니다. 추가된 오브젝트는 Invisible Object 창에서 확인할 수 있습니다.

위치 정보를 표시할 Static 컴포넌트와 GoogleMap 컴포넌트를 예제의 그림과 같이 적절히 배치합니다.

화면 구성을 위해 사용한 컴포넌트 및 오브젝트는 다음과 같습니다.

컴포넌트/오브젝트

ID

Static

Static00~Static11

Radio

rdo_accuracy

Edit

edt_intervaltime

edt_timestamp

edt_sourcetype

edt_accuracy

edt_altitude

edt_altitudeaccuracy

edt_heading

edt_latitude

edt_longitude

edt_speed

Button

btn_start

btn_stop

GroupBox

GroupBox00

2

Watch Start 버튼 이벤트 함수 작성하기

Watch Start 버튼의 onclick 이벤트 함수를 다음과 같이 작성합니다.

this.btn_start_onclick = function(obj:nexacro.Button,e:nexacro.ClickEventInfo)
{
	var nAccuracy = this.rdo_accuracy.text;	
	var nIntervalTime = this.edt_intervaltime.value;
	
	if(nIntervalTime < 200 || nIntervalTime > 86400000)
	{
		this.edt_intervaltime.setFocus();
		
		alert("Invalid range");
		return;
	}
	
	this.Geolocation00.watchStart(nAccuracy, nIntervalTime);
	
	this.btn_start.set_enable(false);
	this.btn_stop.set_enable(true);
};

3

Watch Stop 버튼 이벤트 함수 작성하기

Watch Stop 버튼의 onclick 이벤트 함수를 다음과 같이 작성합니다.

this.btn_stop_onclick = function(obj:nexacro.Button,e:nexacro.ClickEventInfo)
{
	this.Geolocation00.watchStop();

	this.btn_start.set_enable(true);
	this.btn_stop.set_enable(false);
};

4

Geolocation 이벤트 함수 작성하기

위치 정보 수신에 성공하면 onrecvsuccess 이벤트를, 실패하면 onrecverror 이벤트가 발생합니다.

위치 정보 수신에 성공하면 onrecvsuccess 이벤트가 발생합니다. GeolocationEventInfo 오브젝트로부터 sourcetype, accuracy, altitude, altitudeaccuracy, heading, latitude, longitude, speed 값을 얻을 수 있습니다.

this.Geolocation00_onrecvsuccess = function(obj:nexacro.Geolocation,e:nexacro.GeolocationEventInfo)
{
	this.edt_accuracy.set_value(e.coords.accuracy);
	this.edt_altitude.set_value(e.coords.altitude);
	this.edt_altitudeaccuracy.set_value(e.coords.altitudeaccuracy);
	this.edt_heading.set_value(e.coords.heading);
	this.edt_latitude.set_value(e.coords.latitude);
	this.edt_longitude.set_value(e.coords.longitude);
	this.edt_speed.set_value(e.coords.speed);
	
	var strSourceType = "UNKNOWN";	
	switch(e.sourcetype)
	{
		case "1":
			strSourceType = "GPS";
			break;
		case "2":
			strSourceType = "WPS";
			break;
		default:
			strSourceType = "UNKNOWN";
	}
	this.edt_sourcetype.set_value(strSourceType);
	
	this.edt_timestamp.set_value(e.timestamp);
};

위치 정보 수신에 실패하면 onrecverror 이벤트가 발생합니다. 어떤 이유로 에러가 발생했는지 에러 정보를 팝업으로 표시합니다.

this.Geolocation00_onrecverror = function(obj:nexacro.Geolocation,e:nexacro.GeolocationErrorEventInfo)
{
	var strResult = "["+ e.errortype +" "+ e.statuscode +"] "+ e.errormsg;	
	alert(strResult);
};

5

모바일 장치에서 확인하기

accuracy와 interval time을 설정한 후 Watch Start 버튼을 터치합니다. 위치 정보가 정상적으로 수신되면 하단의 Coords Information 그룹 박스의 위치 정보 값이 interval time 주기로 갱신되어 보입니다. 위치 정보 수신을 멈추려면 Watch Stop 버튼을 터치합니다.