การคำนวณบนพื้นผิวโลก (Spherical)
เรามีการคำนวณทางภูมิศาสตร์ เช่น ระยะทาง ทิศทาง พื้นที่ และการประมาณค่า ให้ใช้งานบน 3 แพลตฟอร์มด้วยชื่อและผลลัพธ์เหมือนกัน เนื่องจากไม่พึ่งพายูทิลิตี้ของแต่ละ Map SDK ค่าตัวเลขจึงไม่เปลี่ยนแปลงเมื่อสลับผู้ให้บริการ การตรวจจับการแตะภายใน SDK และการวาดเส้นทางวงกลมใหญ่ก็ใช้การคำนวณนี้ทั้งหมด
01 · การคำนวณพื้นฐาน
ฟังก์ชันที่ใช้บ่อยถูกรวบรวมไว้ใน Spherical ระยะทางจะถูกส่งกลับเป็นเมตร ทิศทางเป็นองศาโดยมีทิศเหนือจริงเป็น 0 และพื้นที่เป็นตารางเมตร อาร์กิวเมนต์คือพิกัดโดยตรง ไม่ขึ้นกับการฉายภาพหรือการซูม
val meters = Spherical.computeDistanceBetween(from, to)
val heading = Spherical.computeHeading(from, to)
// วางมาร์กเกอร์ขอบวงกลมในแปดทิศ
val ring = (0 until 8).map { i ->
Spherical.computeOffset(center, 3_000.0, i * 45.0)
}
val routeMeters = Spherical.computeLength(routePoints)
val areaSqMeters = Spherical.computeArea(polygonPoints)let meters = Spherical.computeDistanceBetween(from: from, to: to)
let heading = Spherical.computeHeading(from: from, to: to)
let ring = (0..<8).map { i in
Spherical.computeOffset(origin: center, distance: 3_000.0, heading: Double(i) * 45.0)
}
let routeMeters = Spherical.computeLength(routePoints)import { computeDistanceBetween, computeOffset, computeLength } from '@mapconductor/js-sdk-core';
const meters = computeDistanceBetween(from, to);
// วงแหวนห่างจากจุดกึ่งกลาง 3 กม. ทุก 45 องศา
const ring = Array.from({ length: 8 }, (_, i) =>
computeOffset({ origin: center, distance: 3000, heading: i * 45 }));
const routeMeters = computeLength(routePoints);02 · โมเดลทรงกลมและโมเดลทรงรี
มีระดับความแม่นยำ 2 ระดับสำหรับการคำนวณทางภูมิศาสตร์ ได้แก่ โมเดลทรงกลมที่ถือว่าโลกเป็นทรงกลมที่สมบูรณ์ และโมเดล geodetic ที่ถือว่าโลกเป็นทรงรี WGS84 เลือกใช้ตามความเหมาะสม
ค่าคงที่ทั้งสองอย่างอิงจาก WGS84 (รัศมีเส้นศูนย์สูตร 6,378,137 เมตร ความแบน 1/298.257223563) เนื่องจากแพลตฟอร์มทั้ง 3 ใช้ค่าคงที่และสูตรเหมือนกัน หากป้อนข้อมูลเหมือนกันจะได้ค่าเหมือนกัน
โมเดลทรงกลม (เร็วพอ แม่นยำพอ)
ระยะทางโดย haversine, แอซิมัทและการประมาณค่าโดยตรีโกณมิติทรงกลม สำหรับระยะทางระดับหลายร้อยกิโลเมตร ความคลาดเคลื่อนเกือบไม่มีผลต่อการใช้งานจริง และมีต้นทุนการคำนวณต่ำ
โมเดลทรงรี (เส้นทางภูมิศาสตร์)
คำนวณเส้นทางภูมิศาสตร์บนทรงรี WGS84 (โดยใช้วิธีการแก้ปัญหาแบบวนซ้ำประเภท Vincenty) มีโครงสร้างเมธอดเหมือนกับ Spherical ดังนั้นหากเป็นทรงกลมให้ใช้ Spherical ส่วน WGS84 ให้ใช้ WGS84Geodesic โดยไม่ต้องเปลี่ยนการเรียก พื้นที่จะคำนวณโดย authalic (ทรงรี)
ถ้าไม่ลู่เข้าจะย้อนกลับไปใช้ทรงกลม
โซลูชันแบบวนซ้ำของทรงรีอาจไม่ลู่เข้าสำหรับจุดสองจุดที่ใกล้ตรงข้ามกันมาก ในกรณีนี้จะสลับไปใช้ผลลัพธ์จากโมเดลทรงกลมโดยอัตโนมัติ ดังนั้นจะไม่มีการคืนค่า 0 หรือ NaN ไม่จำเป็นต้องเขียนการจัดการข้อยกเว้นที่ฝั่งผู้เรียก
03 · สะพานเชื่อมต่อกับหน้าจอ
ชุดฟังก์ชันสำหรับแปลงปริมาณตามเกณฑ์หน้าจอ เช่น "หนึ่งนิ้ว" หรือ "ระยะขอบ 16px" บนแผนที่ให้เป็นระยะทางทางภูมิศาสตร์ การแปลงคำนึงถึงการซูมและละติจูด จึงไม่เปลี่ยนความรู้สึกเมื่อระดับการซูมหรือสถานที่เปลี่ยนไป
รูป · ขั้นตอนที่ใช้สำหรับการตรวจจับการแตะ
แปลงค่าการตั้งค่า "ขนาดนิ้ว" (หน่วยตรรกะ) เป็นพิกเซลหน้าจอ
ด้วย calculateMetersPerPixel จะแปลงเป็นระยะทางการยอมรับ (เมตร) ณ การซูมและละติจูดปัจจุบัน
ใช้ระยะทางการยอมรับนั้นเพื่อตรวจสอบระยะห่างจากเส้นหรือรูปทรงโดยใช้พิกัดภูมิศาสตร์ตามที่เป็น
ขั้นตอนนี้ทำให้การกดเส้นไม่เปลี่ยนแปลงเมื่อซูม และให้การตรวจจับเหมือนกันในทุกผู้ให้บริการ
04 · การคำนวณสำหรับเส้นและรูปทรง
ชุดฟังก์ชันเพื่อให้การวาดและการตรวจจับ polylines และ polygons มีผลลัพธ์เหมือนกันในทุกผู้ให้บริการ สิ่งที่ใช้ภายใน SDK ถูกเผยแพร่ให้ใช้งานได้เช่นกัน
createInterpolatePoints และ pointOnLineOrNull ถูกเตรียมไว้ด้วยชื่อเดียวกันทั้งใน WGS84Geodesic และ Planar ผู้เรียกสามารถสลับระหว่างโมเดล geodesic และโมเดลเส้นตรงได้โดยเพียงแค่เปลี่ยน namespace
อินพุตเหมือนกัน ผลลัพธ์เหมือนกัน
การนำไปใช้ใน Kotlin, Swift และ TypeScript เขียนด้วยสูตรเดียวกันและใช้ค่าคงที่เดียวกัน ระยะทางหรือพื้นที่ที่แสดงระหว่างแพลตฟอร์มจะไม่คลาดเคลื่อน
ใช้ได้จากแอปพลิเคชันด้วย
ฟังก์ชันการคำนวณหลักไม่ใช่ฟังก์ชันภายในเท่านั้น แต่เป็น API สาธารณะ สามารถใช้ในตรรกะของแอปได้โดยตรง เช่น การแสดงระยะทางเส้นทาง การคำนวณรัศมี หรือการตรวจจับการแตะแบบกำหนดเอง ฟังก์ชันทั้งหมดที่ระบุในหน้านี้มีอยู่ในทั้ง 3 แพลตฟอร์ม