흐름 방향을 갖는 선형 설비에 대한 심벌 표현

안드로이드 기반의 GIS 엔진인 BlackPoint-Xr은 현장에서 내 위치 주변의 설비를 조회하고 정상 여부를 검사하는 앱 개발을 한 기반이 됩니다. 설비 중 전력선, 상수/하수관로, 가스관 등은 선형으로 표시되는데, 이때 흐름의 방향이 사용자에게 중요한 의미를 갖게 됩니다. 아래의 화면은 BlackPoint-Xr을 이용해 개발된 하수관망 현장조회 시스템의 화면중 하나입니다.

하수관거 중 합류, 오수, 차집관 등에 대해 물의 흐름을 화살표로 표시하여 사용자가 직관적으로 파악할 수 있습니다.

BlackPoint-Xr에서 이러한 선형 설비에 대한 화살표 표시에 대한 심벌 표시에 대한 API에 대해 정리하겠습니다.

BlackPoint-Xr은 선형 설비에 대한 심벌을 StrokeSymbol이라는 타입으로 정의합니다. 아래의 코드는 선형 설비에 대한 레이어의 StrokeSymbol 객체를 인자로 넘겨주면 선형의 형상을 연속된 화살표로 표시해 주는 SetFlowLineStyle 함수 코드입니다.

위의 함수는 2개의 인자를 받는데요. 첫번째는 연관된 Activity의 getResources()로부터 쉽게 얻을 수 있는 객체인 res 인자와 앞서 언급한 StrokeSymbol 타입의 symbol입니다. res 인자가 필요한 이유는 연속된 화살표의 크기를 단말기의 해상도나 dpi와 상관없이 일정한 크기로 표시되도록 하기 위함인데.. 3번과 4번의 width와 height을 얻기 위해 사용됩니다. 이 width와 height는 연속된 화살표를 구성하는 단일 화살표의 너비와 높이에 대한 Pixel 값입니다. Utility.px 함수는 다음과 같습니다.

즉, 위의 px라는 정적 함수는 dp 단위를 px 단위로 변환해 줍니다. 아시겠지만, 안드로이드에서 레이아웃이나 그래픽 요소의 표현 단위는 최대한 px가 아닌 dp로 해줘야 합니다.

다시 SetFlowLineStyle 함수로 돌아가서 6번~13번 코드가 화살표의 형상을 구성하는 코드입니다. 즉, 앞서 구한 width와 height 값을 통해 화살표 모양의 Path를 구성하게 되는데요. 패스의 구성 좌표의 지정은 아래의 화면을 참고하면 쉽게 이해할 수 있습니다.

이렇게 만들어진 Path 객체를 14번 코드에서 PathDashPathEffect 객체의 생성에 사용하고 이를 StrokeSymbol의 Paint 객체에 설정해 주기만 하면 됩니다.

[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를 상속받은 것들입니다. 비록 개발자가 클래스를 직접 파생받아 구현하는 번거로운 방식같지만, 상당한 유연성을 제공하는 방식입니다. 이제 실행해 보면 아래와 같은 실행 결과를 살펴볼 수 있습니다.