เอกสาร / พื้นฐาน / Polygon

Polygon

พื้นที่ที่มีลำดับพิกัดของเส้นรอบนอกและรูขุมขน (holes) ตามจำนวนที่ต้องการ เพียงวางลงในมุมมองแผนที่พร้อมสไตล์การเติมและเส้น ก็สามารถแสดงพื้นที่หรือแสดงผลแบบมาสก์ได้ การจัดการรูขุมขนแตกต่างกันไปในแต่ละแผนที่ SDK แต่ MapConductor ปรับให้ดูเหมือนกันในทุกผู้ให้บริการ

POINTS
GeoPoint[]
HOLES
GeoPoint[][]
FILL / STROKE
color · width
GEODESIC
true / false
แพลตฟอร์ม

01 · สถานะของ Polygon

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) และการซ้อนทับ

รู (hole) คือพื้นที่ที่ตัดออกจากเส้นรอบนอก ในการแสดงผลมาสก์ มักจะวาง "สถานที่ที่ต้องการให้เห็น" เป็นรูหลายๆ รู ซึ่งในเวลานั้นรูแต่ละรูมักจะซ้อนทับกันโดยธรรมชาติ

SDK แผนที่ส่วนใหญ่จะวาดเส้นขอบในส่วนที่ซ้อนทับหากส่งรูที่ซ้อนทับไปโดยตรง ทำให้เห็นเส้นแบ่งระหว่างรูแต่ละรู MapConductor จะรวมรูที่ส่งมาก่อนวาด ดังนั้นส่วนที่ซ้อนทับจะถูกจัดการเป็นรูเดียว และจะไม่มีเส้นส่วนเกินปรากฏขึ้น

ภาพ · เมื่อส่งรูสามเหลี่ยมสองรูที่ซ้อนกัน
RAW SDK
ส่วนที่ซ้อนกันถูกส่งต่อไปตรง ๆ และมีเส้นขอบพาดผ่าน จึงเห็นได้ว่ามีสองรู
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 มากกว่า) จะมีความสำคัญเหนือกว่า แม้จะวางพื้นที่หลายๆ แผ่นไว้ในพื้นที่กว้าง พื้นที่ที่อยู่นอกช่วงที่แสดงจะถูกแยกออกจากการตรวจจับ

หน้าที่เกี่ยวข้อง