Perhitungan sederhana untuk bekerja dengan jarak lat / lon dan km?

119

Apakah ada penghitungan sederhana yang dapat saya lakukan yang akan mengubah km menjadi nilai yang dapat saya tambahkan ke pelampung lintang atau bujur untuk menghitung kotak pembatas untuk penelusuran? Tidak perlu akurat sepenuhnya.

Misalnya: jika saya diberi garis lintang / bujur untuk London, Inggris (51.5001524, -0.1262362) dan saya ingin menghitung garis lintang 25 km timur / barat dari titik itu, dan berapa lon akan menjadi 25 km di utara / selatan itu titik, apa yang harus saya lakukan untuk mengubah 25km menjadi desimal untuk ditambahkan ke nilai di atas?

Saya mencari aturan umum, yaitu: 1km == +/- 0.XXX

Edit:

Penelusuran asli saya untuk "lat lon" tidak memberikan hasil ini:

Bagaimana cara menghitung kotak pembatas untuk lokasi lintang / bujur tertentu?

Jawaban yang diterima tampaknya cukup untuk kebutuhan saya.

Phillip B Oldham
sumber

Jawaban:

221

Perkiraan konversinya adalah:

  • Lintang: 1 derajat = 110.574 km
  • Bujur: 1 derajat = 111,320 * cos (lintang) km

Ini tidak sepenuhnya benar untuk perataan kutub Bumi - untuk itu Anda mungkin menginginkan rumus yang lebih rumit menggunakan ellipsoid referensi WGS84 (model yang digunakan untuk GPS). Tetapi kesalahan tersebut mungkin dapat diabaikan untuk tujuan Anda.

Sumber: http://en.wikipedia.org/wiki/Latitude

Perhatian : Ketahuilah bahwa koordinat garis lintang dinyatakan dalam derajat, sedangkan cosfungsi di sebagian besar bahasa (semua?) Biasanya menerima radian, oleh karena itu diperlukan konversi derajat ke radian .

Jim Lewis
sumber
Apakah yang Anda maksud cos (bujur) dalam rumus kedua?
Odys
1
Bagaimana Anda mendapatkan ini? Saya melewatkan sesuatu, dapatkah Anda menjelaskan lebih lanjut tentang perhitungan Garis Bujur? Ty
Odys
5
@Odys: Jika Anda membandingkan dua titik yang terletak pada garis bujur yang sama (utara / selatan), keduanya terletak pada lingkaran besar dan faktor konversinya hanyalah keliling kutub bumi dibagi 360 derajat. Tetapi ini berbeda untuk pengukuran timur-barat, karena (kecuali untuk ekuator) Anda tidak mengukur di sepanjang "lingkaran besar", sehingga "keliling" pada garis lintang tertentu lebih kecil. Dan faktor koreksinya ternyata adalah kosinus garis lintang.
Jim Lewis
17
Penjelasan saya: cos(0°) = 1=> Oleh karena itu tidak ada faktor koreksi yang diterapkan dalam melakukan perhitungan di ekuator. Garis bujur adalah yang terluas di sana. cos(90°) = 0=> Di kutub, bujur bertemu di satu titik. Tidak ada jarak yang bisa dihitung.
Jenny O'Reilly
4
@Stijn: Anda perlu mengonversi dari derajat ke radian sebelum memanggil Math.cos ().
Jim Lewis
5

Jika Anda menggunakan Java, Javascript atau PHP, maka ada perpustakaan yang akan melakukan perhitungan ini dengan tepat, menggunakan beberapa trigonometri yang sangat rumit (tapi tetap cepat):

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

skaffman
sumber
Situs tersebut sekarang memiliki perpustakaan.
lini
2
Tautannya rusak!
chatzich
Untuk PHP, Anda dapat menggunakan garpu ini: github.com/dvdoug/PHPCoord
dearsina
1

http://www.jstott.me.uk/jcoord/ - gunakan perpustakaan ini

            LatLng lld1 = new LatLng(40.718119, -73.995667);
            LatLng lld2 = new LatLng(51.499981, -0.125313);
            Double distance = lld1.distance(lld2);
            Log.d(TAG, "Distance in kilometers " + distance);
Nikhil Dinesh
sumber
1

Terima kasih Jim Lewis atas jawabannya yang luar biasa dan saya ingin mengilustrasikan solusi ini dengan fungsi saya di 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)
    }

Dalam fungsi ini untuk mengubah jarak saya menggunakan rumus berikut:

latDistance / 110.574
longDistance / (111.320 * cos(lat / .pi / 180))
Serj Kultenko
sumber
Saya pikir itu harus "lat * pi / 180"
magamig
1

Mengapa tidak menggunakan kueri geospasial yang dirumuskan dengan benar ???

Berikut adalah halaman referensi server SQL di ST Berisi fungsi geospasial:

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

atau jika Anda tidak ragu untuk menggunakan konversi kotak dan radian, Anda dapat selalu menggunakan fungsi jarak untuk mencari titik-titik yang Anda butuhkan:

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

Harus ada fungsi serupa untuk hampir semua database di luar sana.

Jika Anda telah menerapkan pengindeksan geospasial dengan benar, pencarian Anda akan jauh lebih cepat daripada pendekatan yang Anda gunakan

George Karadov
sumber
1
Harap luangkan waktu sejenak untuk membaca bantuan pengeditan di pusat bantuan . Pemformatan di Stack Overflow berbeda dengan situs lain.
Dharman