การคำนวณอย่างง่ายสำหรับการทำงานกับ lat / lon และ km distance?


119

มีการคำนวณง่ายๆที่ฉันสามารถทำได้หรือไม่ซึ่งจะแปลง km เป็นค่าที่ฉันสามารถเพิ่มลงใน lat หรือ lon เพื่อคำนวณกรอบขอบเขตสำหรับการค้นหาได้หรือไม่ ไม่จำเป็นต้องถูกต้องสมบูรณ์

ตัวอย่างเช่น: ถ้าฉันได้ lat / lon สำหรับลอนดอนประเทศอังกฤษ (51.5001524, -0.1262362) และฉันต้องการคำนวณว่าละติจูดจะอยู่ห่างจากจุดนั้นไปทางตะวันออก / ตะวันตก 25 กม. เท่าใดและพื้นที่จะเท่ากับ 25 กม. เหนือ / ใต้ จุดฉันต้องทำอะไรเพื่อแปลง 25 กม. เป็นทศนิยมเพื่อเพิ่มค่าด้านบน

ฉันกำลังมองหากฎทั่วไปเช่น: 1km == +/- 0.XXX

แก้ไข:

การค้นหา "lat lon" เดิมของฉันไม่ได้ผลลัพธ์นี้:

จะคำนวณกล่องขอบเขตสำหรับตำแหน่ง lat / lng ที่กำหนดได้อย่างไร

คำตอบที่ยอมรับนั้นเพียงพอสำหรับความต้องการของฉัน


คำตอบ:


221

การแปลงโดยประมาณคือ:

  • ละติจูด: 1 องศา = 110.574 กม
  • ลองจิจูด: 1 องศา = 111.320 * cos (ละติจูด) กม

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

ที่มา: http://en.wikipedia.org/wiki/Latitude

ข้อควรระวัง : โปรดทราบว่าพิกัด latlong แสดงเป็นองศาในขณะที่cosฟังก์ชันในภาษาส่วนใหญ่ (ทั้งหมด?) ยอมรับเรเดียนดังนั้นจึงจำเป็นต้องมีการแปลงองศาเป็นเรเดียน


คุณหมายถึง cos (ลองจิจูด) ในสูตรที่สองหรือไม่?
Odys

1
คุณคิดอย่างไรกับเรื่องนี้? ฉันขาดอะไรไปช่วยอธิบายรายละเอียดเกี่ยวกับการคำนวณลองจิจูดได้ไหม Ty
Odys

5
@Odys: หากคุณกำลังเปรียบเทียบจุดสองจุดที่อยู่บนเส้นลองจิจูดเดียวกัน (เหนือ / ใต้) พวกมันอยู่บนวงกลมใหญ่และปัจจัยการแปลงเป็นเพียงเส้นรอบวงเชิงขั้วของโลกหารด้วย 360 องศา แต่จะแตกต่างกันสำหรับการวัดทางตะวันออก - ตะวันตกเนื่องจาก (ยกเว้นเส้นศูนย์สูตร) ​​คุณไม่ได้วัดตาม "วงกลมใหญ่" ดังนั้น "เส้นรอบวง" ที่ละติจูดที่ระบุจึงมีขนาดเล็กกว่า และปัจจัยการแก้ไขกลายเป็นโคไซน์ของละติจูด
Jim Lewis

17
คำอธิบายของฉัน: cos(0°) = 1=> ดังนั้นจึงไม่มีการใช้ปัจจัยการแก้ไขในการคำนวณที่เส้นศูนย์สูตร ลองจิจูดนั้นกว้างที่สุด cos(90°) = 0=> ที่ขั้วลองจิจูดพบกันในจุดเดียว ไม่มีระยะทางให้คำนวณ
Jenny O'Reilly

4
@Stijn: คุณต้องแปลงจากองศาเป็นเรเดียนก่อนที่จะเรียก Math.cos ()
Jim Lewis

5

หากคุณใช้ Java, Javascript หรือ PHP จะมีไลบรารีที่จะทำการคำนวณเหล่านี้อย่างแน่นอนโดยใช้ตรีโกณมิติที่ซับซ้อน (แต่ยังเร็ว):

http://www.jstott.me.uk/jcoord/


ขณะนี้ไซต์มีไลบรารี
midfield99

2
ลิงค์เสีย!
chatzich

สำหรับ PHP คุณสามารถใช้ส้อมนี้: github.com/dvdoug/PHPCoord
dearsina


1

น่าสนใจที่ฉันไม่เห็นการพูดถึงพิกัด UTM

https://en.wikipedia.org/wiki/Universal_Transverse_Mercator_coordinate_system

อย่างน้อยถ้าคุณต้องการเพิ่มกม. ในโซนเดียวกันควรตรงไปตรงมา (ใน Python: https://pypi.org/project/utm/ )

utm.from_latlon และ utm.to_latlon


ขอบคุณสำหรับลิงค์ไปยัง utm น่าตกใจที่ดูเหมือนจะไม่มีเอกสารประกอบเลย
Westworld

1

ขอบคุณJim Lewisสำหรับคำตอบที่ยอดเยี่ยมของเขาและฉันอยากจะอธิบายวิธีแก้ปัญหานี้ด้วยฟังก์ชันของฉันใน Swift:

func getRandomLocation(forLocation location: CLLocation, withOffsetKM offset: Double) -> CLLocation {
        let latDistance = (Double(arc4random()) / Double(UInt32.max)) * offset * 2.0 - offset
        let longDistanceMax = sqrt(offset * offset - latDistance * latDistance)
        let longDistance = (Double(arc4random()) / Double(UInt32.max)) * longDistanceMax * 2.0 - longDistanceMax

        let lat: CLLocationDegrees = location.coordinate.latitude + latDistance / 110.574
        let lng: CLLocationDegrees = location.coordinate.longitude + longDistance / (111.320 * cos(lat / .pi / 180))
        return CLLocation(latitude: lat, longitude: lng)
    }

ในฟังก์ชั่นนี้ในการแปลงระยะทางฉันใช้สูตรต่อไปนี้:

latDistance / 110.574
longDistance / (111.320 * cos(lat / .pi / 180))

ฉันคิดว่ามันควรจะเป็น "lat * pi / 180"
magamig

1

ทำไมไม่ใช้แบบสอบถามเชิงพื้นที่ที่มีสูตรถูกต้อง ???

นี่คือหน้าอ้างอิงเซิร์ฟเวอร์ SQL บนฟังก์ชันภูมิสารสนเทศ STContains:

https://docs.microsoft.com/en-us/sql/t-sql/spatial-geography/stcontains-geography-data-type?view=sql-server-ver15

หรือหากคุณไม่ต้องการใช้การแปลงกล่องและเรเดียนคุณ cna จะใช้ฟังก์ชันระยะทางเพื่อค้นหาจุดที่คุณต้องการเสมอ:

DECLARE @CurrentLocation geography; 
SET @CurrentLocation  = geography::Point(12.822222, 80.222222, 4326)

SELECT * , Round (GeoLocation.STDistance(@CurrentLocation ),0) AS Distance FROM [Landmark]
WHERE GeoLocation.STDistance(@CurrentLocation )<= 2000 -- 2 Km

ควรมีฟังก์ชันการทำงานที่คล้ายกันสำหรับฐานข้อมูลเกือบทุกแห่ง

หากคุณใช้การจัดทำดัชนีเชิงพื้นที่อย่างถูกต้องการค้นหาของคุณจะเร็วกว่าวิธีที่คุณใช้


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