เอกสาร / Core / การคำนวณบนพื้นผิวโลก

การคำนวณบนพื้นผิวโลก (Spherical)

เรามีการคำนวณทางภูมิศาสตร์ เช่น ระยะทาง ทิศทาง พื้นที่ และการประมาณค่า ให้ใช้งานบน 3 แพลตฟอร์มด้วยชื่อและผลลัพธ์เหมือนกัน เนื่องจากไม่พึ่งพายูทิลิตี้ของแต่ละ Map SDK ค่าตัวเลขจึงไม่เปลี่ยนแปลงเมื่อสลับผู้ให้บริการ การตรวจจับการแตะภายใน SDK และการวาดเส้นทางวงกลมใหญ่ก็ใช้การคำนวณนี้ทั้งหมด

ELLIPSOID
WGS84
SEMI-MAJOR
6,378,137 m
FLATTENING
1 / 298.257…
UNIT
เมตร / องศา
แพลตฟอร์ม

01 · การคำนวณพื้นฐาน

ฟังก์ชันที่ใช้บ่อยถูกรวบรวมไว้ใน Spherical ระยะทางจะถูกส่งกลับเป็นเมตร ทิศทางเป็นองศาโดยมีทิศเหนือจริงเป็น 0 และพื้นที่เป็นตารางเมตร อาร์กิวเมนต์คือพิกัดโดยตรง ไม่ขึ้นกับการฉายภาพหรือการซูม

ฟังก์ชัน
คำอธิบาย
computeDistanceBetween
ระยะทางระหว่างสองจุด (เมตร)
computeHeading
ทิศทางจากจุดเริ่มต้นไปยังจุดสิ้นสุด (-180 ถึง 180 องศา)
computeOffset
พิกัดปลายทางเมื่อระบุระยะทางและทิศทางจากจุดเริ่มต้น ใช้สำหรับสร้างวงกลมและวงแหวน
computeOffsetOrigin
คำนวณจุดเริ่มต้นย้อนกลับจากจุดสิ้นสุด ระยะทาง และทิศทาง
computeLength
ความยาวทั้งหมดตามลำดับพิกัด (เมตร) ใช้สำหรับแสดงระยะทางของเส้นทาง
computeArea / computeSignedArea
พื้นที่ที่ล้อมรอบด้วยลำดับพิกัดปิด (ตารางเมตร) ค่าที่มีเครื่องหมายสามารถใช้ตรวจสอบทิศทางการหมุนได้
interpolate
การประมาณค่าตามสัดส่วนระหว่างสองจุดบนเส้นทางวงกลมใหญ่
Planar.interpolate
การประมาณค่าตามสัดส่วนระหว่างสองจุดด้วยเส้นตรงของละติจูดและลองจิจูด (วิธีการของโมเดล Planar) หากข้ามเส้นวันเปลี่ยนจะใช้เส้นทางที่สั้นที่สุด
com.mapconductor.core.spherical
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)

02 · โมเดลทรงกลมและโมเดลทรงรี

มีระดับความแม่นยำ 2 ระดับสำหรับการคำนวณทางภูมิศาสตร์ ได้แก่ โมเดลทรงกลมที่ถือว่าโลกเป็นทรงกลมที่สมบูรณ์ และโมเดล geodetic ที่ถือว่าโลกเป็นทรงรี WGS84 เลือกใช้ตามความเหมาะสม

ค่าคงที่ทั้งสองอย่างอิงจาก WGS84 (รัศมีเส้นศูนย์สูตร 6,378,137 เมตร ความแบน 1/298.257223563) เนื่องจากแพลตฟอร์มทั้ง 3 ใช้ค่าคงที่และสูตรเหมือนกัน หากป้อนข้อมูลเหมือนกันจะได้ค่าเหมือนกัน

Spherical

โมเดลทรงกลม (เร็วพอ แม่นยำพอ)

การใช้งาน: การแสดงระยะทาง · แอซิมัท · การสร้างวง · พื้นที่ · การตรวจจับแตะ

ระยะทางโดย haversine, แอซิมัทและการประมาณค่าโดยตรีโกณมิติทรงกลม สำหรับระยะทางระดับหลายร้อยกิโลเมตร ความคลาดเคลื่อนเกือบไม่มีผลต่อการใช้งานจริง และมีต้นทุนการคำนวณต่ำ

WGS84Geodesic

โมเดลทรงรี (เส้นทางภูมิศาสตร์)

การใช้งาน: เส้นทางบินระยะไกล · ระยะทาง แอซิมัท และพื้นที่ที่แม่นยำ

คำนวณเส้นทางภูมิศาสตร์บนทรงรี WGS84 (โดยใช้วิธีการแก้ปัญหาแบบวนซ้ำประเภท Vincenty) มีโครงสร้างเมธอดเหมือนกับ Spherical ดังนั้นหากเป็นทรงกลมให้ใช้ Spherical ส่วน WGS84 ให้ใช้ WGS84Geodesic โดยไม่ต้องเปลี่ยนการเรียก พื้นที่จะคำนวณโดย authalic (ทรงรี)

FALLBACK

ถ้าไม่ลู่เข้าจะย้อนกลับไปใช้ทรงกลม

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

03 · สะพานเชื่อมต่อกับหน้าจอ

ชุดฟังก์ชันสำหรับแปลงปริมาณตามเกณฑ์หน้าจอ เช่น "หนึ่งนิ้ว" หรือ "ระยะขอบ 16px" บนแผนที่ให้เป็นระยะทางทางภูมิศาสตร์ การแปลงคำนึงถึงการซูมและละติจูด จึงไม่เปลี่ยนความรู้สึกเมื่อระดับการซูมหรือสถานที่เปลี่ยนไป

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

รูป · ขั้นตอนที่ใช้สำหรับการตรวจจับการแตะ

01

แปลงค่าการตั้งค่า "ขนาดนิ้ว" (หน่วยตรรกะ) เป็นพิกเซลหน้าจอ

02

ด้วย calculateMetersPerPixel จะแปลงเป็นระยะทางการยอมรับ (เมตร) ณ การซูมและละติจูดปัจจุบัน

03

ใช้ระยะทางการยอมรับนั้นเพื่อตรวจสอบระยะห่างจากเส้นหรือรูปทรงโดยใช้พิกัดภูมิศาสตร์ตามที่เป็น

ขั้นตอนนี้ทำให้การกดเส้นไม่เปลี่ยนแปลงเมื่อซูม และให้การตรวจจับเหมือนกันในทุกผู้ให้บริการ

04 · การคำนวณสำหรับเส้นและรูปทรง

ชุดฟังก์ชันเพื่อให้การวาดและการตรวจจับ polylines และ polygons มีผลลัพธ์เหมือนกันในทุกผู้ให้บริการ สิ่งที่ใช้ภายใน SDK ถูกเผยแพร่ให้ใช้งานได้เช่นกัน

ฟังก์ชัน
คำอธิบาย
WGS84Geodesic.createInterpolatePoints
เติมเต็มพิกัดในแต่ละช่วงตามเส้นทางทางภูมิศาสตร์ สร้างลำดับพิกัดสำหรับเอนจินที่ไม่สามารถวาดเส้นโค้งโดยตรงได้
Planar.createInterpolatePoints
แทรกค่าพิกัดตามเส้นตรงของพิกัดละติจูดและลองจิจูด ชื่อเหมือนกัน แตกต่างกันที่เนมสเปซเท่านั้น
WGS84Geodesic.pointOnLineOrNull
ส่งคืนจุดใกล้สุดภายในระยะที่ระบุสำหรับส่วนของเส้นบนเส้นทางภูมิศาสตร์ ใช้สำหรับการตรวจสอบการแตะที่เส้นโค้ง
Planar.pointOnLineOrNull
ตรวจสอบว่าอยู่ภายในระยะที่ระบุหรือไม่สำหรับส่วนของเส้นตรง
splitByMeridian
แบ่งลำดับพิกัดที่ข้ามเส้นเมริเดียน 180 องศาที่ขอบเขต เป็นฟังก์ชันระดับบนสุดที่ไม่ขึ้นกับเนมสเปซ
closestPointOnSegment
หาจุดที่ใกล้ที่สุดบนส่วนของเส้น ฟังก์ชันนี้ก็เป็นฟังก์ชันระดับบนสุดเช่นกัน

createInterpolatePoints และ pointOnLineOrNull ถูกเตรียมไว้ด้วยชื่อเดียวกันทั้งใน WGS84Geodesic และ Planar ผู้เรียกสามารถสลับระหว่างโมเดล geodesic และโมเดลเส้นตรงได้โดยเพียงแค่เปลี่ยน namespace

CONSISTENCY

อินพุตเหมือนกัน ผลลัพธ์เหมือนกัน

การนำไปใช้ใน Kotlin, Swift และ TypeScript เขียนด้วยสูตรเดียวกันและใช้ค่าคงที่เดียวกัน ระยะทางหรือพื้นที่ที่แสดงระหว่างแพลตฟอร์มจะไม่คลาดเคลื่อน

PUBLIC API

ใช้ได้จากแอปพลิเคชันด้วย

ฟังก์ชันการคำนวณหลักไม่ใช่ฟังก์ชันภายในเท่านั้น แต่เป็น API สาธารณะ สามารถใช้ในตรรกะของแอปได้โดยตรง เช่น การแสดงระยะทางเส้นทาง การคำนวณรัศมี หรือการตรวจจับการแตะแบบกำหนดเอง ฟังก์ชันทั้งหมดที่ระบุในหน้านี้มีอยู่ในทั้ง 3 แพลตฟอร์ม

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