การคำนวณพิกัดละติจูดและลองจิจูดโดยเฉลี่ย


19

ฉันจะคำนวณค่าเฉลี่ยระหว่างจุดละติจูดและลองจิจูดหลายจุดได้อย่างไร

ฉันควรคำนวณเลขคณิตความหมายของทั้ง lat และ lng หรือไม่?


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

1
คะแนนสะสมเหล่านี้เป็นอย่างไร แทนที่จะถามว่าจะหาค่าเฉลี่ยพิกัดได้อย่างไรอาจถามว่าการหาค่าเฉลี่ยเป็นวิธีที่เหมาะสมในการชดเชยข้อผิดพลาดในการวัดหรือไม่ ebook นี้ มีคำจำกัดความของข้อผิดพลาดมากมาย
Kirk Kuykendall

เพียงแค่ทราบว่ามีบางกรณีขอบที่ 'จุดเฉลี่ย' ไม่ได้กำหนดไว้อย่างดี: เช่นที่ใดก็ได้ตามเส้นศูนย์สูตรอาจเป็น "ค่าเฉลี่ย" ของเสาเอ็นและเอส
Dan S.

คำตอบ:


15

สำหรับค่าเฉลี่ยแบบง่ายคุณไม่ต้องการเฉลี่ยพิกัดลองจิจูดและละติจูด สิ่งนี้อาจทำงานได้ดีในละติจูดที่ต่ำกว่า แต่เมื่อละติจูดที่สูงขึ้นมันจะเริ่มให้ผลลัพธ์ที่ไม่ดีและพังทลายลงมาใกล้ขั้ว

วิธีที่ฉันใช้สำหรับสิ่งนี้คือการแปลงพิกัดลองจิจูด / ละติจูดเป็นพิกัดคาร์ทีเซียน 3d (x, y, z) หาค่าเฉลี่ยเหล่านี้ (เพื่อให้เวกเตอร์คาร์ทีเซียน) แล้วแปลงกลับมาอีกครั้ง โปรดทราบว่าคุณอาจไม่จำเป็นต้องทำให้เวกเตอร์เป็นปกติดังนั้นกระบวนการเฉลี่ยจริงอาจเป็นผลรวมอย่างง่าย


แก้ไขนี่คือรหัสของฉัน:

ต่อไปนี้แปลงพิกัดคาร์ทีเซียนเป็นละติจูด / ลองจิจูด (เป็นองศา): ลบ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เป็นคุณสมบัติที่ส่งคืนค่าเรเดียน)

โปรดทราบว่าการเพิ่มประสิทธิภาพเป็นไปได้เช่นการคำนวณไซน์ที่ซ้ำกัน นอกจากนี้การคำนวณตรีโกณมิติอาจแคชถ้าคุณเรียกพวกเขามาก


1
จุดที่ดี ฉันไม่อยากจะเชื่อว่าฉันลืมที่จะพูดถึงว่า .. การหาค่าเฉลี่ยใกล้เสาและเส้นวันทำให้ฉันมาก่อน
เกล็น

3
(+1) ปัญหาไม่ได้ถูก จำกัด อยู่ที่เสาและ + -180 องศาเมริเดียน: เมื่อละติจูดของคะแนนที่จะเฉลี่ยแตกต่างกันไปมากการเฉลี่ยพิกัดละติจูด / ลองจิจูดตรงนั้นเท่ากับการใช้การฉายภาพ Plate Carree ซึ่ง แนะนำการบิดเบือนของตัวชี้วัดตัวแปรที่เพิ่มขึ้นด้วยละติจูด ไม่มีปัญหาเกี่ยวกับตัวเลข แต่ค่าเฉลี่ยอยู่ในตำแหน่งที่ไม่ถูกต้อง ด้วยเหตุนี้การคำนวณ lat / lon ที่แนะนำในคำตอบของ @ Glenn จึงไม่ค่อยเป็นที่ยอมรับยกเว้นบริเวณที่มีขนาดค่อนข้างเล็ก
whuber

@winwaed ขอบคุณคุณช่วยแนะนำบางโค้ด (Java) โค้ดหรือแบบฝึกหัดที่ดีในการทำเช่นนี้ได้หรือไม่?
aneuryzm

1
คณิตศาสตร์อยู่ที่en.wikipedia.org/wiki/Spherical_coordinatesภายใต้ 'Cartesian Coordinates' (การนำไปใช้ของฉันคือ C # และได้รับการปรับให้เหมาะสมบางส่วน - บวกฉันพิมพ์ข้อความนี้ที่ทันตแพทย์ !!)
winwaed

1
ฉันคิดว่ากรณีการใช้งานวิศวกรรมที่แม่นยำคุณถูกต้องมาก อย่างไรก็ตามหากจำเป็นต้องใช้ความแม่นยำสูงสุดพิกัดเฉลี่ย WGS84 lat, lng พิกัดในเมืองและแม้กระทั่งพื้นที่ในภูมิภาคทำงานได้ค่อนข้างดีและให้ผลลัพธ์ที่แม่นยำสำหรับการใช้งานส่วนใหญ่ที่จะใช้ค่าเฉลี่ย
เกล็น

3

ตัวเลือกการจัดกลุ่ม : ฉันคิดว่าคำที่เป็นแนวคิดที่ครอบคลุมการดำเนินการประเภทนี้คือ "การจัดกลุ่ม" การหาค่าเฉลี่ยนั้นง่ายที่สุดในการนำมาใช้และทำงานได้ดีสำหรับจุดประสงค์ส่วนใหญ่ ครั้งเดียวที่ฉันจะใช้อย่างอื่นคือถ้าคุณกังวลเกี่ยวกับค่าผิดปกติ [แก้ไข] -> หรือขั้วหรือดาต้าไลน์ระหว่างประเทศ [แก้ไข] -> โดยเฉลี่ยในขณะที่มันจะให้อะไรบางอย่างที่ดูใกล้กับศูนย์กลางของกลุ่มออกไปเล็กน้อยเพราะการฉายภาพไม่ถูกต้องที่เกิดจากความจริงที่ว่าองศา lat lng ไม่ได้อยู่ในระยะเดียวกัน ห่างกันกม. / ไมล์ พื้นที่ที่คุณใหญ่กว่าค่าเฉลี่ยยิ่งการบิดเบือน

นี่คือการเปรียบเทียบตัวเลือกการจัดกลุ่มน้อย

ค่าเฉลี่ย (ง่ายเร็วที่สุดไม่ถูกต้อง): เพียงรวมค่า lat และหารด้วยจำนวนและทำแบบเดียวกันกับค่า lng อย่าลืมมองหาโอเวอร์โฟลว์หากคุณใช้ Int32 ในบางระบบ (โดยเฉพาะ c #) จะโอเวอร์โฟลว์กลับไปที่ตัวเลขต่ำ คุณสามารถหลีกเลี่ยงข้อผิดพลาดเหล่านี้โดยใช้ความแม่นยำจุดลอยตัวสำหรับผลรวมสะสมของคุณ ปัญหาอย่างหนึ่งของวิธีนี้ก็คือผู้ผิดกฎหมายสามารถเอียงตำแหน่งของคุณได้ [แก้ไข] -> อีกอย่างคือคณิตศาสตร์ที่อยู่ใกล้กับเสาและบรรทัดวันที่สากลนั้นไม่ค่อยดีเท่าไหร่

เพื่อนบ้านที่ใกล้ที่สุด (ยากขึ้นช้าลงไม่เอนเอียง น้อยกว่า)โดยเฉลี่ยคุณสามารถไปยังที่ตั้ง lat lng จริงด้วยระยะทางเฉลี่ยที่เล็กที่สุดสำหรับเพื่อนบ้านทั้งหมด นี่เหมือนกับการเอา "ค่ามัธยฐาน" ข้อเสียคือมันมีราคาแพงเพราะคุณเปรียบเทียบทุกจุดกับทุก ๆ จุดและคำนวณระยะห่างระหว่างพวกมัน ตัวอย่างเช่นการจัดกลุ่ม 10,000 คะแนนจะต้องใช้การคำนวณระยะทาง 100 ล้าน .. ไม่ช้าเลย แต่มันก็ไม่ได้ดี

กริดเซลล์ (ต้องการการตั้งค่าเพิ่มเติมเล็กน้อยเร็วกว่าไม่เอนเอียงนอก)คล้ายกับเพื่อนบ้านที่ใกล้ที่สุด แต่เร็วกว่ามาก คุณสามารถเลือกระดับความแม่นยำตามอำเภอใจได้กล่าวคือ. 01 deg lat lng (ซึ่งประมาณ 1 กิโลเมตรโดยประมาณที่ lattitudes ที่มีประชากร) และจัดกลุ่มคะแนนของคุณเป็น. 01 x .01 degree buckets จากนั้นคุณสามารถเลือกถังที่มีคะแนนมากที่สุดในนั้นและใช้ค่าเฉลี่ยของคะแนนเหล่านั้นหรือทำการวิเคราะห์เพื่อนบ้านที่ใกล้ที่สุดในจุดเหล่านั้น ฉันใช้วิธีนี้กับชุดข้อมูลที่มีขนาดใหญ่มาก (หลายร้อยพันล้านรายการ) และพบว่ามันมีความสมดุลที่ดีระหว่างความแม่นยำและความเร็ว

นูนฮัลล์เซ็นทรอยด์ (ยาก, ช้า, เรียบร้อย): คุณยังสามารถวาดวงรอบจุดของคุณเพื่อกำหนดรูปร่างที่ครอบคลุมพวกมันทั้งหมด ( ดูวิกิพีเดีย ) แล้วคำนวณจุดกึ่งกลางของรูปร่างนี้ ฟังก์ชั่นเซนทรอยด์ทั่วไปไม่ได้มีน้ำหนักอยู่ตรงกลางดังนั้นคุณจะต้องทำการวิเคราะห์แบบเพื่อนบ้านที่ใกล้เคียงที่สุดโดยใช้จุดตัวอย่างในรูปร่างของคุณจนกว่าคุณจะพบจุดที่อยู่ห่างจากขอบมากที่สุด วิธีนี้น่าสนใจมากกว่าเพราะตัวเรือนูนมากกว่าอัลกอริธึมการค้นหาศูนย์กลางที่ไม่รวดเร็วและแม่นยำโดยเฉพาะ .. แต่รูปร่างฮัลล์อาจมีแอปพลิเคชั่นที่เป็นประโยชน์อื่น ๆ กับข้อมูลของคุณ


@winwaed ทำให้เป็นจุดที่ดีเกี่ยวกับค่าเฉลี่ยพิกัดใกล้เสาและฉันก็จะเพิ่มบรรทัดวันที่ระหว่างประเทศ ตัวอย่างเช่นหากคุณมีจุดหนึ่งอยู่ด้านหนึ่งและอีกจุดหนึ่งคุณจะได้รับค่าเฉลี่ยที่ไม่ดี (และมีกรอบ) สิ่งนี้เกิดขึ้นไม่บ่อยนัก แต่เมื่อมันเป็นความเจ็บปวดที่แท้จริงในการแก้ไขข้อบกพร่อง
Glenn

@whuber ทำให้จุดที่ดีเกี่ยวกับศูนย์ดริฟท์เมื่อคุณเฉลี่ย ในขณะที่ค่าเฉลี่ยจะให้บางสิ่งบางอย่างที่ดูใกล้กับศูนย์กลางของคลัสเตอร์ แต่จะปิดเล็กน้อยเพราะการฉายภาพไม่ถูกต้องซึ่งเกิดจากความจริงที่ว่าองศา lat lng ไม่ได้อยู่ห่างกันเป็นกิโลเมตรหรือไมล์ พื้นที่ที่คุณใหญ่กว่าค่าเฉลี่ยยิ่งการบิดเบือน
เกล็น

0

ไม่แน่ใจว่าคุณกำลังพยายามทำอะไร แต่จุดที่ละติจูดนั้นคือค่าเฉลี่ยของความยาวของชุดจุดเดิมและลองจิจูดคือค่าเฉลี่ยของลองจิจูดของชุดจุดเดิมจะเป็นจุดเฉลี่ยของชุดจุดเดิม [อัพเดท]: ในข้างต้นเฉลี่ยคือค่าเฉลี่ยเลขคณิต


ในคำตอบของคุณเฉลี่ย = เลขคณิตหมายความว่าอย่างไร
aneuryzm

1
ใช่ถูกต้อง. นั่นคือสิ่งที่ฉันหมายถึงขอโทษสำหรับการขาดความชัดเจน ฉันอัพเดตคำตอบแล้ว แต่ฉันไม่แน่ใจว่าฉันนำสิ่งที่มีประโยชน์มากไปที่ตารางที่นี่ ...
GuillaumeC
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.