ドキュメント / 基本 / ポリゴン

ポリゴン

外周の座標列と、任意の数の穴(holes)を持つ面です。塗りと線のスタイルを添えて地図ビューに置くだけで、エリアの表示やマスク表現ができます。穴の扱いは地図SDKごとに癖がありますが、MapConductor はどのプロバイダでも同じ見た目になるように揃えています。

POINTS
GeoPoint[]
HOLES
GeoPoint[][]
FILL / STROKE
color · width
GEODESIC
true / false
プラットフォーム

01 · ポリゴンの状態

PolygonState が1つの面を表します。外周・穴・塗り・線・タップハンドラを持ち、プロパティを書き換えれば形はその場で更新されます。頂点マーカーをドラッグして形を編集するような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 は渡された穴を結合してから描画するため、重なりは1つの穴として扱われ、余分な線は出ません。

図 · 重なり合う2つの穴(三角形)を渡したとき
RAW SDK
重なりがそのまま渡され、重なった部分に輪郭線が現れます。穴が2つあることが見えてしまいます。
MAPCONDUCTOR
穴を結合してから描画。重なりは1つの穴になり、外形だけが輪郭線として残ります。
アプリ側の指定は同じで、渡す穴の座標列も同じです。結合は状態を作る時点で行われるため、頂点をドラッグして重なりが増減する場合も追随します。
重なる穴をそのまま渡す
// 重なり合う穴をそのまま渡してよい。内部で1つの穴に結合される
PolygonState(
    points = outerRing,
    holes =
        listOf(
            triangleA, // ← 互いに重なっている
            triangleB,
        ),
    fillColor = Color(0xCC787880),
)

03 · どのプロバイダでも同じに見える

穴の重なりのほかにも、面の描画にはエンジンごとの差が出やすいところがあります。MapConductor はそれらを内部で吸収し、同じ PolygonState から同じ絵になるようにしています。

HOLE UNION

重なる穴を結合する

穴同士の重なりは、状態を作る段階で1つの領域に結合されます。輪郭線が重なり部分に現れることも、塗りが二重になることもありません。

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 の大きい方)が優先されます。広いエリアを何面も置いても、表示範囲外の面は判定から除外されます。

関連ページ