문서 / 기본 / 폴리곤

폴리곤

외주의 좌표열과, 임의의 수의 구멍(holes)을 가지는 면입니다. 칠과 선의 스타일을 곁들여 지도 뷰에 놓기만 하면, 영역의 표시나 마스크 표현을 할 수 있습니다. 구멍의 취급은 지도 SDK마다 버릇이 있지만, MapConductor는 어느 프로바이더에서도 같은 겉모습이 되도록 맞춰 놓았습니다.

POINTS
GeoPoint[]
HOLES
GeoPoint[][]
FILL / STROKE
color · width
GEODESIC
true / false
플랫폼

01 · 폴리곤의 상태

PolygonState가 하나의 면을 나타냅니다. 외주・구멍・칠・선・탭 핸들러를 가지며, 프로퍼티를 바꿔 쓰면 형태는 그 자리에서 갱신됩니다. 정점 마커를 드래그해 형태를 편집하는 UI도, 좌표열을 교체하기만 하면 만들 수 있습니다.

PolygonPageViewModel.kt · Jetpack Compose
val polygonState =
    PolygonState(
        points = outerRing,
        holes = listOf(holeA, holeB),
        strokeColor = Color.Red,
        strokeWidth = 3.dp,
        fillColor = Color(0x4D0064E6),
        onClick = { event -> viewModel.onPolygonClick(event) },
    )

Polygon(polygonState)

// 정점도 구멍도 다시 쓰기만 하면 갱신된다
polygonState.holes = nextHoles
프로퍼티
설명
points
외주의 좌표열. 닫는 처리는 내부에서 하므로, 마지막에 시작점을 반복할 필요가 없습니다.
holes
구멍의 좌표열의 배열. 여러 개 지정할 수 있고, 겹쳐 있어도 상관없습니다.
fillColor
칠의 색. 알파로 투명도를 지정합니다.
strokeColor / strokeWidth
외주와 구멍의 윤곽선의 색과 굵기. 굵기는 논리 단위이며, 단말의 해상도에 관계없이 같은 겉모습이 됩니다.
geodesic
변을 대권 코스(측지선)로 이을지 여부. 광역의 영역에서 효과가 있습니다.
zIndex · extra
겹침 순서와, 임의의 부수 데이터.
onClick
탭 핸들러. 면의 상태와 탭된 좌표를 받습니다.

02 · 구멍(holes)과 겹침의 결합

구멍은 외주에서 빼내는 영역입니다. 마스크 표현에서는 「보여 주고 싶은 곳」을 구멍으로 여러 개 두는 일이 자주 있는데, 그때 구멍끼리 겹치는 것은 자연스럽게 일어납니다.

많은 지도 SDK는 겹치는 구멍을 그대로 넘기면 겹친 부분에 윤곽선을 그려 버려, 구멍과 구멍의 경계가 보이고 맙니다. MapConductor는 넘겨받은 구멍을 결합한 뒤에 그리기 때문에, 겹침은 하나의 구멍으로 다뤄지고 여분의 선은 나오지 않습니다.

그림 · 겹치는 두 개의 구멍(삼각형)을 넘겼을 때
RAW SDK
겹침이 그대로 전달되어, 겹친 부분에 윤곽선이 나타납니다. 구멍이 2개라는 것이 보이게 됩니다.
MAPCONDUCTOR
구멍을 결합한 뒤에 그립니다. 겹침은 하나의 구멍이 되고, 바깥 형태만 윤곽선으로 남습니다.
앱 쪽 지정은 같고, 넘기는 구멍의 좌표열도 같습니다. 결합은 상태를 만드는 시점에 이루어지므로, 정점을 드래그해 겹침이 늘거나 줄어도 그대로 따라갑니다.
겹치는 구멍을 그대로 넘기기
// 겹치는 구멍은 그대로 넘겨도 된다. 내부에서 하나로 결합된다
PolygonState(
    points = outerRing,
    holes =
        listOf(
            triangleA, // ← 여기가 겹친다
            triangleB,
        ),
    fillColor = Color(0xCC787880),
)

03 · 어느 프로바이더에서도 같게 보인다

구멍의 겹침 외에도, 면의 렌더링에는 엔진마다 차이가 나기 쉬운 곳이 있습니다. MapConductor는 그것들을 내부에서 흡수해, 같은 PolygonState에서 같은 그림이 되도록 하고 있습니다.

HOLE UNION

겹치는 구멍을 결합한다

구멍끼리의 겹침은, 상태를 만드는 단계에서 하나의 영역으로 결합됩니다. 윤곽선이 겹침 부분에 나타나는 일도, 칠이 이중이 되는 일도 없습니다.

GEODESIC

곡선을 그릴 수 없는 엔진에도 같은 형태를

대권 코스를 직접 그릴 수 없는 엔진에는, 변을 잘게 분할한 좌표열로 변환한 뒤 넘깁니다. 광역의 영역에서도 형태가 일치합니다.

ANTIMERIDIAN

날짜변경선을 넘는 면

경도 180도를 넘는 면은 경계에서 분할해 넘깁니다. 지구를 반대로 횡단하는 칠이 되는 엔진에서도 올바른 쪽이 칠해집니다.

HIT TEST

탭 판정도 공통

탭 판정은 공통 로직으로 하며, 구멍의 안쪽은 탭에 반응하지 않습니다. 엔진이 구멍을 고려하는지 여부와 관계없이, 보이는 그대로의 판정이 됩니다.

04 · 탭

onClick은 면의 상태와, 탭된 좌표를 받습니다. 칠이나 extra에서 데이터를 꺼내 상세를 표시하는 것이 정석적인 사용법입니다.

event.state

탭된 면의 상태. 칠 색이나 extra에서 데이터를 꺼낼 수 있습니다.

event.clicked

탭된 지리 좌표.

구멍은 반응하지 않는다

구멍의 안쪽을 탭해도, 그 면의 이벤트는 발화하지 않습니다. 보이는 칠 부분만이 대상입니다.

PolygonClickPageViewModel.kt
fun onPolygonClicked(event: PolygonEvent) {
    markerState = MarkerState(
        position = event.clicked,
        icon = DefaultMarkerIcon(fillColor = event.state.fillColor),
    )
}

면이 겹쳐 있는 경우에는 위(zIndex가 큰 쪽)가 우선됩니다. 넓은 영역을 여러 면 놓아도, 표시 범위 밖의 면은 판정에서 제외됩니다.

관련 페이지