เอกสาร / Core / GeoPoint และช่วง

GeoPoint และช่วง (GeoRectBounds)

MapConductor มีประเภทพิกัดเพียงประเภทเดียวคือ GeoPoint คุณไม่จำเป็นต้องยุ่งเกี่ยวกับ LatLng, CLLocationCoordinate2D หรือ LngLat เฉพาะของผู้ให้บริการ ช่วงสี่เหลี่ยมจัดการโดย GeoRectBounds และแสดงด้วยสองจุด: ตะวันตกเฉียงใต้และตะวันออกเฉียงเหนือ ทั้งสองมีโครงสร้างสมาชิกเหมือนกันบนทั้ง 3 แพลตฟอร์ม

ANDROID
com.mapconductor.core.features
iOS
MapConductorCore
REACT
@mapconductor/js-sdk-core
แพลตฟอร์ม

01 · GeoPoint

ค่าที่ไม่เปลี่ยนแปลงที่มีสามส่วน: ละติจูด ลองจิจูด และความสูง คุณสามารถละเว้นความสูงได้ และในกรณีนั้นจะถือว่าเป็น 0 การเปรียบเทียบความเท่ากันและแฮชจะถูกกำหนดโดยเนื้อหาของละติจูดและลองจิจูด (และความสูง) ดังนั้นคุณสามารถใช้ค่านี้โดยตรงเป็นคีย์ในแผนที่หรือสำหรับการตรวจสอบความแตกต่างได้

สมาชิก
Type
คำอธิบาย
latitude
Double
ละติจูด (องศา) −90 ถึง 90
longitude
Double
ลองจิจูด (องศา) −180 ถึง 180
altitude
Double · 0.0
ความสูง (เมตร) ผู้ให้บริการ 3D เท่านั้นที่ตีความ
wrap()
GeoPoint
ส่งกลับพิกัดที่ลองจิจูดถูกพับข้ามเส้นแบ่งวันสากล
toUrlValue(precision)
String · 6
สตริง "latitud,longitud" ค่าเริ่มต้นคือทศนิยม 6 ตำแหน่ง

มีสามวิธีในการสร้าง: ตัวสร้าง, โรงงานที่ระบุลำดับของละติจูดและลองจิจูดอย่างชัดเจน และการแปลงจากประเภทพิกัดอื่น สำหรับลำดับลองจิจูด,ละติจูดซึ่งสับสนง่าย ได้มีการตั้งชื่อเพื่อให้แยกแยะได้

GeoPoint · Kotlin
val tokyo = GeoPoint(35.6812, 139.7671)
val haneda = GeoPoint.fromLatLong(35.548852, 139.784086)
val fromLngLat = GeoPoint.fromLongLat(139.7671, 35.6812)

// จากค่าใด ๆ ที่ implements GeoPointInterface
val copied = GeoPoint.from(anyPositionLike)

val url = tokyo.toUrlValue() // "35.681200,139.767100"

fromLatLng และ fromLatLong รวมถึง fromLngLat และ fromLongLat เป็นนามแฝงของสิ่งเดียวกัน คุณสามารถเลือกใช้สิ่งที่เหมาะสมกับการตั้งชื่อโค้ดที่มีอยู่ของคุณได้

02 · การทำให้เป็นมาตรฐานและความถูกต้อง

พิกัดจากข้อมูลภายนอกอาจอยู่นอกช่วง หรือมีลองจิจูดมากกว่า 360 องศา มี normalize สำหรับปรับให้อยู่ในช่วง และ isValid สำหรับตรวจสอบว่าอยู่ในช่วงหรือไม่

normalize()

จัดให้อยู่ในช่วง

ค่าละติจูดถูกตัดทอนให้อยู่ในช่วง −90~90 และลองจิจูดถูกรักษาระดับให้ −180~180 ลองจิจูด 200 จะกลายเป็น −160

isValid()

ตรวจสอบว่าอยู่ในช่วงหรือไม่

true เมื่อละติจูดอยู่ในช่วง −90~90 และลองจิจูดอยู่ในช่วง −180~180 เท่านั้น ใช้สำหรับการตรวจสอบเวลานำเข้า

Kotlin · ฟังก์ชันขยาย
// ให้มาในรูปฟังก์ชันส่วนขยายของ GeoPointInterface
val safe = raw.normalize()
if (!raw.isValid()) return

03 · GeoRectBounds

แสดงสี่เหลี่ยมผืนผ้าด้วยสองจุด: ตะวันตกเฉียงใต้และตะวันออกเฉียงเหนือ การใช้งานหลักคือเป็น "กล่องที่เติบโต" เมื่อเพิ่มจุด ช่วงที่ครอบคลุมทั้งหมดจะขยายออก เมื่อสร้างขึ้นใหม่จะว่างเปล่า (isEmpty) และ southWest กับ northEast จะยังไม่ได้ตั้งค่า

สมาชิก
คำอธิบาย
southWest / northEast
สองมุมของสี่เหลี่ยม ถ้าว่างเปล่าจะไม่ได้ตั้งค่า
center
จุดกึ่งกลาง คำนวณได้อย่างถูกต้องแม้กระทั่งสี่เหลี่ยมที่ข้ามเส้นแบ่งวันสากล
isEmpty
ว่ายังไม่มีจุดใดๆ อยู่ข้างในหรือไม่
extend(point)
ขยายสี่เหลี่ยมให้รวมจุดนั้นเข้าไป ลองจิจูดจะขยายไปทางที่สั้นที่สุด
contains(point)
ว่าจุดนั้นอยู่ภายในสี่เหลี่ยมหรือไม่
intersects(other)
ว่าสี่เหลี่ยมสองอันซ้อนทับกันหรือไม่ ใช้สำหรับการตัดสินไทล์และช่วงการดึงข้อมูล
union(other)
สี่เหลี่ยมใหม่ที่รวมทั้งสองสี่เหลี่ยมเข้าด้วยกัน
expandedByDegrees(lat, lon)
สี่เหลี่ยมใหม่ที่ขยายออกด้านนอกตามจำนวนที่ระบุในหน่วยองศา หากต้องการขยายในหน่วยเมตร ให้ใช้ expandBounds ของ Spherical
toSpan()
ส่งกลับความแตกต่างของละติจูดและลองจิจูดในรูปแบบ GeoPoint
toUrlValue(precision)
สตริง "suroeste,noreste" ค่าเริ่มต้นคือทศนิยม 6 ตำแหน่ง
GeoRectBounds · Kotlin
// สร้างขอบเขตที่ครอบคลุมเส้นทางทั้งหมด แล้วปรับกล้องให้พอดี
val bounds = GeoRectBounds()
routePoints.forEach { bounds.extend(it) }

mapViewState.fitBounds(bounds = bounds, padding = 48)

// ดึงข้อมูลกว้างกว่าพื้นที่ที่มองเห็นเล็กน้อย
val fetchArea = bounds.expandedByDegrees(latPad = 0.05, lonPad = 0.05)

04 · จุดที่ควรใช้ช่วง

GeoRectBounds ปรากฏในหลายส่วนของ API เนื่องจากเป็นประเภทเดียวกันหมด คุณสามารถนำช่วงที่สร้างขึ้นมาใช้ซ้ำได้

fitBounds()

ซูมกล้องให้เห็นทั้งช่วง padding คือระยะขอบหน้าจอ (พิกเซลเชิงตรรกะ)

GroundImageState

เมื่อวางภาพลงบนแผนที่ ให้ระบุตำแหน่งด้วยช่วง

CameraRestriction · restrictBounds

กำหนดช่วงที่กล้องไม่สามารถออกไปได้เป็นสี่เหลี่ยม (Android · React)

visibleRegion.bounds

MapCameraPosition ที่ได้รับใน onCameraMove มีช่วงที่แสดงอยู่ สามารถดึงข้อมูลเฉพาะของช่วงนั้นได้

expandBounds()

รุ่นที่ขยายเป็นหน่วยเมตร ดูหน้าการคำนวณทางภูมิศาสตร์

GeoJSON / ไทล์

ใช้ intersects เพื่อตัดสินใจการสร้างและการดึงไทล์ซ้ำ

การใช้งานในวิดีโอ · Android + MapLibreKotlin · Jetpack Compose
val spots = listOf(
    GeoPoint.fromLatLong(35.6586, 139.7454), // Tokyo Tower
    GeoPoint.fromLatLong(35.7101, 139.8107), // Skytree
    GeoPoint.fromLatLong(35.6852, 139.7528), // Imperial Palace
)

// Start from an empty rectangle and widen it one point at a time
val bounds = GeoRectBounds()
spots.forEach { bounds.extend(it) }

MapLibreMapView(state = mapViewState) {
    spots.forEachIndexed { i, point ->
        Marker(MarkerState(id = "spot-$i", position = point))
    }
}

Button(onClick = {
    // padding is screen margin in logical pixels; at 0 the outermost point hugs the edge
    if (!bounds.isEmpty) mapViewState.fitBounds(bounds, padding = 64)
}) {
    Text("Show all")
}
วิดีโอตัวอย่าง · ปรับให้พอดีกับช่วงด้วย fitBounds
ยังไม่ได้ถ่ายวิดีโอคำนวณช่วงที่รวมมาร์กเกอร์หลายตัว และแสดงให้เห็นว่ากล้องซูมเข้าด้วย fitBounds อย่างไร จุดสำคัญคือขั้นตอนระหว่างการเคลื่อนไหว

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