ฉันจะคำนวณค่าเฉลี่ยระหว่างจุดละติจูดและลองจิจูดหลายจุดได้อย่างไร
ฉันควรคำนวณเลขคณิตความหมายของทั้ง lat และ lng หรือไม่?
ฉันจะคำนวณค่าเฉลี่ยระหว่างจุดละติจูดและลองจิจูดหลายจุดได้อย่างไร
ฉันควรคำนวณเลขคณิตความหมายของทั้ง lat และ lng หรือไม่?
คำตอบ:
สำหรับค่าเฉลี่ยแบบง่ายคุณไม่ต้องการเฉลี่ยพิกัดลองจิจูดและละติจูด สิ่งนี้อาจทำงานได้ดีในละติจูดที่ต่ำกว่า แต่เมื่อละติจูดที่สูงขึ้นมันจะเริ่มให้ผลลัพธ์ที่ไม่ดีและพังทลายลงมาใกล้ขั้ว
วิธีที่ฉันใช้สำหรับสิ่งนี้คือการแปลงพิกัดลองจิจูด / ละติจูดเป็นพิกัดคาร์ทีเซียน 3d (x, y, z) หาค่าเฉลี่ยเหล่านี้ (เพื่อให้เวกเตอร์คาร์ทีเซียน) แล้วแปลงกลับมาอีกครั้ง โปรดทราบว่าคุณอาจไม่จำเป็นต้องทำให้เวกเตอร์เป็นปกติดังนั้นกระบวนการเฉลี่ยจริงอาจเป็นผลรวมอย่างง่าย
แก้ไขนี่คือรหัสc #ของฉัน:
ต่อไปนี้แปลงพิกัดคาร์ทีเซียนเป็นละติจูด / ลองจิจูด (เป็นองศา): ลบRAD2DEG
ค่าคงที่สำหรับเรเดียน
Latitude = MPUtility.RAD2DEG * Math.Atan2(z, Math.Sqrt(x * x + y * y));
Longitude = MPUtility.RAD2DEG * Math.Atan2(-y, x);
และที่นี่เราคำนวณพิกัดคาร์ทีเซียนจากละติจูด / ลองจิจูด (ระบุเป็นเรเดียน):
private void CalcCartesianCoord()
{
_x = Math.Sin(LatitudeRadians) * Math.Cos(LongitudeRadians);
_y = Math.Sin(LatitudeRadians) * Math.Sin(LongitudeRadians);
_z = Math.Cos(LatitudeRadians);
}
ทั้งสองถูกตัดและวางจากโค้ดจริงดังนั้นการผสมผสานขององศาและเรเดียน มีคุณสมบัติที่นี่ซึ่งทำการแปลงบางส่วน (เช่นLatitudeRadians
เป็นคุณสมบัติที่ส่งคืนค่าเรเดียน)
โปรดทราบว่าการเพิ่มประสิทธิภาพเป็นไปได้เช่นการคำนวณไซน์ที่ซ้ำกัน นอกจากนี้การคำนวณตรีโกณมิติอาจแคชถ้าคุณเรียกพวกเขามาก
ตัวเลือกการจัดกลุ่ม : ฉันคิดว่าคำที่เป็นแนวคิดที่ครอบคลุมการดำเนินการประเภทนี้คือ "การจัดกลุ่ม" การหาค่าเฉลี่ยนั้นง่ายที่สุดในการนำมาใช้และทำงานได้ดีสำหรับจุดประสงค์ส่วนใหญ่ ครั้งเดียวที่ฉันจะใช้อย่างอื่นคือถ้าคุณกังวลเกี่ยวกับค่าผิดปกติ [แก้ไข] -> หรือขั้วหรือดาต้าไลน์ระหว่างประเทศ [แก้ไข] -> โดยเฉลี่ยในขณะที่มันจะให้อะไรบางอย่างที่ดูใกล้กับศูนย์กลางของกลุ่มออกไปเล็กน้อยเพราะการฉายภาพไม่ถูกต้องที่เกิดจากความจริงที่ว่าองศา lat lng ไม่ได้อยู่ในระยะเดียวกัน ห่างกันกม. / ไมล์ พื้นที่ที่คุณใหญ่กว่าค่าเฉลี่ยยิ่งการบิดเบือน
นี่คือการเปรียบเทียบตัวเลือกการจัดกลุ่มน้อย
ค่าเฉลี่ย (ง่ายเร็วที่สุดไม่ถูกต้อง): เพียงรวมค่า lat และหารด้วยจำนวนและทำแบบเดียวกันกับค่า lng อย่าลืมมองหาโอเวอร์โฟลว์หากคุณใช้ Int32 ในบางระบบ (โดยเฉพาะ c #) จะโอเวอร์โฟลว์กลับไปที่ตัวเลขต่ำ คุณสามารถหลีกเลี่ยงข้อผิดพลาดเหล่านี้โดยใช้ความแม่นยำจุดลอยตัวสำหรับผลรวมสะสมของคุณ ปัญหาอย่างหนึ่งของวิธีนี้ก็คือผู้ผิดกฎหมายสามารถเอียงตำแหน่งของคุณได้ [แก้ไข] -> อีกอย่างคือคณิตศาสตร์ที่อยู่ใกล้กับเสาและบรรทัดวันที่สากลนั้นไม่ค่อยดีเท่าไหร่
เพื่อนบ้านที่ใกล้ที่สุด (ยากขึ้นช้าลงไม่เอนเอียง น้อยกว่า)โดยเฉลี่ยคุณสามารถไปยังที่ตั้ง lat lng จริงด้วยระยะทางเฉลี่ยที่เล็กที่สุดสำหรับเพื่อนบ้านทั้งหมด นี่เหมือนกับการเอา "ค่ามัธยฐาน" ข้อเสียคือมันมีราคาแพงเพราะคุณเปรียบเทียบทุกจุดกับทุก ๆ จุดและคำนวณระยะห่างระหว่างพวกมัน ตัวอย่างเช่นการจัดกลุ่ม 10,000 คะแนนจะต้องใช้การคำนวณระยะทาง 100 ล้าน .. ไม่ช้าเลย แต่มันก็ไม่ได้ดี
กริดเซลล์ (ต้องการการตั้งค่าเพิ่มเติมเล็กน้อยเร็วกว่าไม่เอนเอียงนอก)คล้ายกับเพื่อนบ้านที่ใกล้ที่สุด แต่เร็วกว่ามาก คุณสามารถเลือกระดับความแม่นยำตามอำเภอใจได้กล่าวคือ. 01 deg lat lng (ซึ่งประมาณ 1 กิโลเมตรโดยประมาณที่ lattitudes ที่มีประชากร) และจัดกลุ่มคะแนนของคุณเป็น. 01 x .01 degree buckets จากนั้นคุณสามารถเลือกถังที่มีคะแนนมากที่สุดในนั้นและใช้ค่าเฉลี่ยของคะแนนเหล่านั้นหรือทำการวิเคราะห์เพื่อนบ้านที่ใกล้ที่สุดในจุดเหล่านั้น ฉันใช้วิธีนี้กับชุดข้อมูลที่มีขนาดใหญ่มาก (หลายร้อยพันล้านรายการ) และพบว่ามันมีความสมดุลที่ดีระหว่างความแม่นยำและความเร็ว
นูนฮัลล์เซ็นทรอยด์ (ยาก, ช้า, เรียบร้อย): คุณยังสามารถวาดวงรอบจุดของคุณเพื่อกำหนดรูปร่างที่ครอบคลุมพวกมันทั้งหมด ( ดูวิกิพีเดีย ) แล้วคำนวณจุดกึ่งกลางของรูปร่างนี้ ฟังก์ชั่นเซนทรอยด์ทั่วไปไม่ได้มีน้ำหนักอยู่ตรงกลางดังนั้นคุณจะต้องทำการวิเคราะห์แบบเพื่อนบ้านที่ใกล้เคียงที่สุดโดยใช้จุดตัวอย่างในรูปร่างของคุณจนกว่าคุณจะพบจุดที่อยู่ห่างจากขอบมากที่สุด วิธีนี้น่าสนใจมากกว่าเพราะตัวเรือนูนมากกว่าอัลกอริธึมการค้นหาศูนย์กลางที่ไม่รวดเร็วและแม่นยำโดยเฉพาะ .. แต่รูปร่างฮัลล์อาจมีแอปพลิเคชั่นที่เป็นประโยชน์อื่น ๆ กับข้อมูลของคุณ
ไม่แน่ใจว่าคุณกำลังพยายามทำอะไร แต่จุดที่ละติจูดนั้นคือค่าเฉลี่ยของความยาวของชุดจุดเดิมและลองจิจูดคือค่าเฉลี่ยของลองจิจูดของชุดจุดเดิมจะเป็นจุดเฉลี่ยของชุดจุดเดิม [อัพเดท]: ในข้างต้นเฉลี่ยคือค่าเฉลี่ยเลขคณิต