[BlackPoint-Xr] 퍼펙트 튜토리얼 – 16 : 수치지도 레이어에 대한 고급 사용자 정의 표현

수치지도는 지형지물에 대한 형상(도형) 정보와 함께 1:1로 연관되는 속성 데이터를 가지고 있습니다. 이 속성 데이터를 화면에 표시하거나 이를 이용해 다양한 조건으로 만들어 도형을 색상을 변경하여 표현할 수 있습니다. 이 튜토리얼에서는 임상도에 대한 SHP 파일을 이용해 도형 및 라벨을 다양한 조건에 맞춰 표현해 보는 API에 대해 설명합니다.

이 글은 퍼펙트 튜토리얼 – 2 : SHP 파일로부터 레이어 추가하기에서 작성된 코드를 기반으로 합니다.

먼저 임상도에 대한 속성 데이터를 살펴보면 다음과 같습니다.

위의 속성값 중 FIFTH_FRTP를 활용해 라벨 및 도형의 심벌 표현을 입맛에 맞게 다양하게 조정할 수 있습니다. FIFTH_FRTP는 임상도에 대한 코드 값입니다. 아래의 표는 이 코드에 대한 내용이며, 실제 의미하는 제목과 도형에 대해 표현할 색상값이 정의되어 있습니다.

코드 설명 색상 색상코드
99 해당없음 #FFFFFF
D 소나무림 #8E6343
H 활엽수림 #C6EB61
L 경작지 #DBCD00
M 침활혼효림 #90B232
O 미립목지 #BAA500
PD 소나무인공림 #6F9158
PR 리기다소나무림 #ABB66B
PT 해송림 #FFFF00
R 제지 #998B53
LP 초지 #83B680
PC 침엽수인공림 #8E841F
W 하천 #BED2FF
PH 활엽수인공림 #5F7713

임상도에 대한 SHP 파일을 레이어로 추가하는 코드를 먼저 작성합니다. LayersLoadingTask 클래스의 doInBackground 함수를 아래처럼 입력합니다.

위의 코드 중에 13, 14, 15번에 언급된 함수를 작성하는 것이 이 튜토리얼에서 설명하는 모든 것이라고 할 수 있는데요. 먼저 setLabelTextFormatter 함수를 작성해 보겠습니다. 이 함수의 작성은 코드값으로 제공되는 속성값을 라벨로 사용하기 위한 것입니다. 예를 들어 코드값이 ‘PD’라면 ‘소나무인공림’으로 표현하는 것입니다. setLabelTextFormatter 함수는 다음과 같습니다.

위의 코드를 보면 5번 코드에서 changeFormatter 함수를 통해 라벨의 Formatter를 변경하고 있습니다. 이 코드에서 언급된 CustomLabelFormatter 클래스는 아래와 같습니다.

다음은 임상의 종류가 소나무의 형태일 때 라벨의 텍스트 색상을 녹색으로 표현하고 그 외의 경우는 검정색으로 표현하도록 하는 setLabelTextColor 함수를 작성해 보겠습니다. 참고로 임상의 종류가 소나무일 때의 코드는 ‘D’, ‘PD’, ‘PR’이라는 것을 염두해 두고 아래의 setLabelTextColor 함수를 살펴보기 바랍니다.

위의 함수를 보면 5번 코드에 언급된 CustomDrawLabelTheme 클래스는 아래와 같습니다.

다음은 임상의 종류에 따라 앞서 표에서 정의된 색상으로 표현되도록 하는 setShapeColor 함수는 아래와 같습니다.

위의 코드 중 4번에 언급된 CustomShapeSymbol는 아래와 같습니다.

정리해 보면, 앞의 코드에서 3개의 새로운 클래스를 정의하였습니다. 각각 CustomLabelFormatter, CustomDrawLabelTheme, CustomShapeSymbol 클래스이며, 이 클래스들은 각각 ProgrammableLabelFormatter, ProgrammableDrawLabelTheme, ShapeSymbolProgrammable를 상속받은 것들입니다. 비록 개발자가 클래스를 직접 파생받아 구현하는 번거로운 방식같지만, 상당한 유연성을 제공하는 방식입니다. 이제 실행해 보면 아래와 같은 실행 결과를 살펴볼 수 있습니다.

[BlackPoint-Xr] 퍼펙트 튜토리얼 – 17 : WiFi와 GPS를 이용한 내 위치 찾기

내 위치를 찾는 방법은 통신사의 기지국을 이용하는 WiFi 방식과 GPS를 이용하는 방식이 있습니다. 블랙포인트에서는 이 두가지 방식 중 가장 정확한 위치를 선택해 사용자의 위치를 찾아줍니다. 기본적으로 아무런 좌표계 투영이 없다면 위치에 대한 좌표계는 WGS94 타원체의 경위도 좌표계인데요. 블랙포인트에서는 이 좌표계를 다양한 좌표계를 가지는 지도에 대한 옳바른 위치 좌표로 손쉽게 변환해주는 API도 함께 제공합니다. 이 글에서는 이러한 WiFi와 GPS를 이용한 내 위치를 몇가지 SHP 파일로 구성된 지도 위에 표시해 보도록 하겠습니다.

이 글은 퍼펙트 튜토리얼 – 2 : SHP 파일로부터 레이어 추가하기에서 작성된 소스 코드를 기반으로 합니다.

먼저 세가지 종류의 SHP 파일을 활용해 배경지도를 구성해 보도록 하겠는데요. 각각 도로명을 가진 도로중심선, 도로의 형상을 가지는 실폭도로, 건물의 형상을 가지는 건물입니다. 레이어 구성을 위해 LayersLoadingTask 클래스의 doInBackground 함수를 다음처럼 입력합니다.

앞의 튜토리얼에서 설명한 SHP 파일을 통한 레이어를 구성하고 레이어의 그리기(Drawing) 심벌과 도로중심선과 건물에 대해 각각 도로명과 건물명을 라벨로 표시하고 있는 코드입니다. 여기에 추가적으로 지도의 배경색을 회색(Gray)로 변경하기 위해 LayersLoadingTask의 생성자를 아래처럼 입력합니다. 새로운 코드는 5번입니다. 참고로 위의 SHP 파일은 도로명주소 SHP DB 중 제가 현재 위치한 대전시에 대한 것입니다.

이제 실행하고 지도를 탐색해 보면 아래와 같은 화면을 볼 수 있습니다.

이제 여기에 WiFi와 GPS를 이용한 위치 찾기를 위한 기능을 추가할 것입니다. LayersLoadingTask 클래스의 onPostExecute 함수를 아래처럼 입력합니다.

7번 코드를 통해 실행되면서 지도를 1:1500 축척으로 변경합니다. 그리고 12~16번 코드에서처럼 위치 찾기 기능에 대한 설정값을 지정해 두는데요. 먼저 12번 코드에서 블랙포인트에서 제공하는 위치 찾기 관리자 객체를 얻어와 설정값을 지정합니다. 지정한 설정값은 모두 3가지로써, 먼저 13~14번 코드처럼 현재 사용하는 SHP 파일의 지도 좌표계가 무엇인지와 15번 코드에서 내 위치를 1초마다 갱신하도록 하는 갱신주기값, 16번 코드에서 내 위치가 이전보다 얼마만큼 변경되면 위치값을 갱신시킬지에 대한 기준값으로 1미터를 지정하고 있습니다. 좌표계의 지정은 미리 정의해둔 EPSG 코드값을 클래스화 시켜 두고 있으며 이를 이용합니다. 도로명 SHP 파일을 기본적으로 GRS80 타원체의 UTM-K 좌표계를 사용하며 이에 대한 EPSG 코드에 대한 클래스는 EPSG5179입니다. 이렇게 해두면 복잡한 좌표계 변환을 블랙포인트 내부에서 자동으로 변환해 줍니다.

이제 옵션 메뉴를 두개 만들 것입니다. 하나는 내 위치 추적을 시작하는 메뉴인 Tracking On과 내 위치 추적을 멈추는 Tracking Off입니다. menu_main.xml 파일을 아래처럼 입력합니다.

그리고 각 메뉴에 대한 타이틀 문자열 지정을 위해 strings.xml 파일에 다음의 코드를 추가합니다.

각 메뉴에 대한 실행 코드는 MainActivity 클래스의 onOptionsItemSelected 함수에서 지정할 수 있으며 아래와 같습니다.

위치 추적은 Permission을 지정해야 제대로 작동합니다. AndroidManifest.xml에 아래 2개의 Permission을 추가합니다.

이와 연관되는 코드로 MainActivity 클래스 안에 PERMISSIONS_STORAGE이라는 정적(static) 문자열 배열도 아래처럼 함께 변경됩니다.

이제 GPS를 켜고 앱을 실행한 뒤 Tracking On 메뉴 터치하면 아래 화면처럼 내 위치가 지도에 표시되는 것을 볼 수 있습니다.

끝으로 위치추적은 단말기의 건전지를 많이 소모시키는 기능입니다. 만약 사용자가 부주의로 위치 처적을 멈추는 Tracking Off를 실행하지 않고 앱을 종료해도 위치 추적 기능이 켜져있을 수 있습니다. 이를 위해 MainActivity의 onDestroy 함수를 아래처럼 추가합니다.