Bagaimana cara mengubah lintang atau bujur menjadi meter?

127

Jika saya memiliki pembacaan garis lintang atau bujur dalam format NMEA standar, apakah ada cara / rumus mudah untuk mengonversi hasil pembacaan tersebut menjadi meter, yang kemudian dapat saya terapkan di Java (J9)?

Sunting: Ok sepertinya apa yang ingin saya lakukan tidak mungkin dengan mudah , namun yang sebenarnya ingin saya lakukan adalah:

Katakanlah saya memiliki garis lintang dan bujur titik dan lintang dan bujur pengguna apakah ada cara mudah untuk membandingkannya untuk memutuskan kapan harus memberi tahu pengguna bahwa mereka berada dalam jarak yang cukup dekat dari titik jalan? Saya menyadari masuk akal adalah subjek tetapi apakah ini mudah dilakukan atau masih terlalu matematika-y?

Adam Taylor
sumber
2
Apakah maksud Anda UTM? en.wikipedia.org/wiki/…
Adrian Archer
1
Apa yang Anda maksud dengan mengubah lintang / bujur menjadi meter? meter dari mana? Apakah Anda sedang mencari cara untuk menghitung jarak di sepanjang permukaan bumi dari satu koordinat ke koordinat lainnya?
Baltimark
2
Tentukan "titik jalan". Definisikan "masuk akal". Apakah ini yang benar-benar ingin Anda ketahui: "bagaimana Anda menghitung jarak antara dua titik berdasarkan garis lintang dan bujurnya?"
Baltimark
2
Saya menemukan pertanyaan ini yang ingin melakukan kueri SQL tentang lintang dan bujur dan menemukan artikel hebat ini dengan beberapa kode Java di bagian bawah. Mungkin menarik bagi Anda juga.
Kristof Van Landschoot

Jawaban:

173

Berikut adalah fungsi javascript:

function measure(lat1, lon1, lat2, lon2){  // generally used geo measurement function
    var R = 6378.137; // Radius of earth in KM
    var dLat = lat2 * Math.PI / 180 - lat1 * Math.PI / 180;
    var dLon = lon2 * Math.PI / 180 - lon1 * Math.PI / 180;
    var a = Math.sin(dLat/2) * Math.sin(dLat/2) +
    Math.cos(lat1 * Math.PI / 180) * Math.cos(lat2 * Math.PI / 180) *
    Math.sin(dLon/2) * Math.sin(dLon/2);
    var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));
    var d = R * c;
    return d * 1000; // meters
}

Penjelasan: https://en.wikipedia.org/wiki/Haversine_formula

Rumus haversine menentukan jarak lingkaran besar antara dua titik pada sebuah bola berdasarkan bujur dan lintangnya.

bh-
sumber
2
Bagi mereka yang mencari perpustakaan untuk mengkonversi antara wgs dan utm: github.com/urbanetic/utm-converter
Aram Kocharyan
3
Akan sangat berterima kasih jika seseorang dapat menambahkan beberapa komentar penjelasan pada kode di atas. Terima kasih sebelumnya!
Ravindranath Akila
Menemukan ini yang tampaknya diadopsi oleh komentar ini. Tautan juga mengatakannya berdasarkan artikel ini tentang perhitungan jarak. Jadi setiap pertanyaan yang belum terjawab harus ditemukan di tautan asli. :)
Joachim
Bagaimana cara menambahkan ketinggian ke dalam perhitungan ini?
dangalg
62

Mengingat Anda sedang mencari rumus sederhana, ini mungkin cara paling sederhana untuk melakukannya, dengan asumsi bahwa Bumi adalah bola dengan keliling 40075 km.

Panjang 1 ° lintang = selalu 111,32 km dalam meter

Panjang dalam meter 1 ° garis bujur = 40075 km * cos (garis lintang) / 360

Ben
sumber
2
Bagaimana cara kerja persamaan garis bujur? dengan garis lintang 90 derajat Anda akan mengharapkannya untuk ditampilkan di dekat 111km; tapi malah menunjukkan 0; demikian pula, nilai yang dekat dengannya juga dekat 0.
Reece
9
Garis lintang adalah 0 ° di ekuator dan 90 ° di kutub (bukan sebaliknya). Untuk ekuator, rumusnya memberikan 40075 km * cos (0 °) / 360 = 111 km. Untuk kutub, rumusnya memberikan 40075 * cos (90 °) / 360 = 0 km.
Ben
Saya pikir pendekatan ini sederhana terutama karena pertanyaannya tidak menanyakan jarak yang tepat antara dua titik, melainkan jika mereka "cukup dekat". Dengan rumus ini kami dengan mudah memeriksa apakah pengguna berada dalam kotak yang berpusat di titik jalan . Jauh lebih mudah untuk memeriksa persegi daripada lingkaran.
Ben
29

Untuk memperkirakan jarak pendek antara dua koordinat, saya menggunakan rumus dari http://en.wikipedia.org/wiki/Lat-lon :

m_per_deg_lat = 111132.954 - 559.822 * cos( 2 * latMid ) + 1.175 * cos( 4 * latMid);
m_per_deg_lon = 111132.954 * cos ( latMid );

.

Dalam kode di bawah ini saya meninggalkan angka mentah untuk menunjukkan hubungannya dengan rumus dari wikipedia.

double latMid, m_per_deg_lat, m_per_deg_lon, deltaLat, deltaLon,dist_m;

latMid = (Lat1+Lat2 )/2.0;  // or just use Lat1 for slightly less accurate estimate


m_per_deg_lat = 111132.954 - 559.822 * cos( 2.0 * latMid ) + 1.175 * cos( 4.0 * latMid);
m_per_deg_lon = (3.14159265359/180 ) * 6367449 * cos ( latMid );

deltaLat = fabs(Lat1 - Lat2);
deltaLon = fabs(Lon1 - Lon2);

dist_m = sqrt (  pow( deltaLat * m_per_deg_lat,2) + pow( deltaLon * m_per_deg_lon , 2) );

Entri wikipedia menyatakan bahwa jarak calcs berada dalam 0,6m untuk 100km longitudinal dan 1cm untuk 100km latitudinally tetapi saya belum memverifikasi ini karena mendekati akurasi itu baik-baik saja untuk penggunaan saya.

JJones
sumber
3
Perhatikan bahwa pada tahun 2017, halaman Wikipedia memiliki rumus lain (tampaknya sudah disempurnakan).
Gorka Llona
3
Ya, rumus di Wikipedia sedikit berbeda, tetapi tampaknya rumus Wikipedia lainnya didasarkan pada hasil yang sama dari jawaban SO yang hebat ini , di mana seseorang benar-benar melakukan perhitungan.
not2qubit
10

Garis lintang dan garis bujur menentukan titik, bukan jarak, jadi pertanyaan Anda agak tidak masuk akal. Jika Anda bertanya tentang jarak terpendek antara dua titik (lintang, bujur), lihat artikel Wikipedia tentang jarak lingkaran besar.

John Feminella
sumber
9
Dia berbicara tentang konversi referensial sehingga jawaban Anda tidak langsung (tidak ada pelesetan)
Paulo Neves
1
Dan untuk referensi panduan konversi untuk transformasi datum posisi GPS. www.microem.ru/pages/u_blox/tech/dataconvert/GPS.G1-X-00006.pdf
Paulo Neves
2
Ia ingin mengetahui berapa derajat per meter agar ia dapat menemukan jarak antara 2 titik. Bacalah yang tersirat.
theAnonymous
1
dan jawaban Anda jauh lebih tidak masuk akal
jerinho.com
7

Ada banyak alat yang akan memudahkan hal ini. Lihat jawaban monjardin untuk detail lebih lanjut tentang apa yang terlibat.

Namun, melakukan ini tidak selalu sulit. Sepertinya Anda menggunakan Java, jadi saya akan merekomendasikan untuk mencari sesuatu seperti GDAL . Ini menyediakan pembungkus java untuk rutinitas mereka, dan mereka memiliki semua alat yang diperlukan untuk mengkonversi dari Lat / Lon (koordinat geografis) ke UTM (sistem koordinat yang diproyeksikan) atau beberapa proyeksi peta yang masuk akal lainnya.

UTM itu bagus, karena meternya, sangat mudah digunakan. Namun, Anda perlu mendapatkan zona UTM yang sesuai agar berfungsi dengan baik. Ada beberapa kode sederhana yang tersedia melalui googling untuk menemukan zona yang sesuai untuk pasangan lintang / bujur.

Reed Copsey
sumber
7

Bumi adalah permukaan yang sangat tidak beraturan, jadi tidak ada rumus sederhana untuk melakukan ini dengan tepat. Anda harus hidup dengan model perkiraan bumi, dan memproyeksikan koordinat Anda ke sana. Model yang biasanya saya lihat digunakan untuk ini adalah WGS 84 . Inilah yang biasanya digunakan perangkat GPS untuk memecahkan masalah yang sama persis.

NOAA memiliki beberapa perangkat lunak yang dapat Anda unduh untuk membantu hal ini di situs web mereka .

TED
sumber
6

Berikut adalah versi R dari fungsi bh- , untuk berjaga-jaga:

measure <- function(lon1,lat1,lon2,lat2) {
    R <- 6378.137                                # radius of earth in Km
    dLat <- (lat2-lat1)*pi/180
    dLon <- (lon2-lon1)*pi/180
    a <- sin((dLat/2))^2 + cos(lat1*pi/180)*cos(lat2*pi/180)*(sin(dLon/2))^2
    c <- 2 * atan2(sqrt(a), sqrt(1-a))
    d <- R * c
    return (d * 1000)                            # distance in meters
}
Rodrigo
sumber
2

Satu mil laut (1852 meter) didefinisikan sebagai satu menit busur bujur di ekuator. Namun, Anda perlu menentukan proyeksi peta (lihat juga UTM ) di mana Anda bekerja agar konversi benar-benar masuk akal.

Hakim Maygarden
sumber
1
Tidak, mil laut ditentukan oleh standar internasional ( v en.wikipedia.org/wiki/Nautical_mile ) menjadi 1852m. Hubungannya dengan pengukuran busur di permukaan bola seperti Bumi sekarang bersifat historis dan perkiraan.
Kinerja Tinggi Mark
1
    'below is from
'http://www.zipcodeworld.com/samples/distance.vbnet.html
Public Function distance(ByVal lat1 As Double, ByVal lon1 As Double, _
                         ByVal lat2 As Double, ByVal lon2 As Double, _
                         Optional ByVal unit As Char = "M"c) As Double
    Dim theta As Double = lon1 - lon2
    Dim dist As Double = Math.Sin(deg2rad(lat1)) * Math.Sin(deg2rad(lat2)) + _
                            Math.Cos(deg2rad(lat1)) * Math.Cos(deg2rad(lat2)) * _
                            Math.Cos(deg2rad(theta))
    dist = Math.Acos(dist)
    dist = rad2deg(dist)
    dist = dist * 60 * 1.1515
    If unit = "K" Then
        dist = dist * 1.609344
    ElseIf unit = "N" Then
        dist = dist * 0.8684
    End If
    Return dist
End Function
Public Function Haversine(ByVal lat1 As Double, ByVal lon1 As Double, _
                         ByVal lat2 As Double, ByVal lon2 As Double, _
                         Optional ByVal unit As Char = "M"c) As Double
    Dim R As Double = 6371 'earth radius in km
    Dim dLat As Double
    Dim dLon As Double
    Dim a As Double
    Dim c As Double
    Dim d As Double
    dLat = deg2rad(lat2 - lat1)
    dLon = deg2rad((lon2 - lon1))
    a = Math.Sin(dLat / 2) * Math.Sin(dLat / 2) + Math.Cos(deg2rad(lat1)) * _
            Math.Cos(deg2rad(lat2)) * Math.Sin(dLon / 2) * Math.Sin(dLon / 2)
    c = 2 * Math.Atan2(Math.Sqrt(a), Math.Sqrt(1 - a))
    d = R * c
    Select Case unit.ToString.ToUpper
        Case "M"c
            d = d * 0.62137119
        Case "N"c
            d = d * 0.5399568
    End Select
    Return d
End Function
Private Function deg2rad(ByVal deg As Double) As Double
    Return (deg * Math.PI / 180.0)
End Function
Private Function rad2deg(ByVal rad As Double) As Double
    Return rad / Math.PI * 180.0
End Function
dbasnett.dll
sumber
Saya melihat tautannya penuh dengan rusak.
tshepang
1

Untuk mengonversi lintang dan bujur dalam representasi x dan y Anda perlu memutuskan jenis proyeksi peta yang akan digunakan. Bagi saya, Elliptical Mercator tampaknya sangat baik. Di sini Anda dapat menemukan implementasi (di Java juga).

Megamozg
sumber
0

Jika jaraknya cukup dekat, Anda bisa menganggapnya sebagai koordinat pada bidang datar. Ini berfungsi, katakanlah, jalan atau tingkat kota jika akurasi sempurna tidak diperlukan dan yang Anda butuhkan hanyalah tebakan kasar tentang jarak yang terlibat untuk membandingkan dengan batas sewenang-wenang.


sumber
3
Tidak, itu tidak berhasil! Jarak x dalam m berbeda untuk nilai garis lintang yang berbeda. Di ekuator Anda mungkin lolos, tetapi semakin dekat Anda ke kutub, ellipsoid Anda akan semakin ekstrem.
RickyA
3
Meskipun komentar Anda masuk akal, itu tidak menjawab pertanyaan pengguna tentang mengubah perbedaan derajat lintang / bujur menjadi meter.
JivanAmara
0

Berdasarkan jarak rata-rata derajat di Bumi.

1 ° = 111km;

Mengkonversi ini untuk radian dan membagi untuk meter, ambil angka ajaib untuk RAD, dalam meter: 0,000008998719243599958;

kemudian:

const RAD = 0.000008998719243599958;
Math.sqrt(Math.pow(lat1 - lat2, 2) + Math.pow(long1 - long2, 2)) / RAD;
Jaykon
sumber
3
akhirnya, jawaban langsung :)
Ben Hutchison
bagaimana jika lintang adalah -179 dan yang lainnya adalah 179, jarak x harus 2 derajat, bukan 358
OMGPOP
7
Jangan gunakan jawaban ini (untuk beberapa alasan, ini disukai). Tidak ada satu skala pun antara bujur dan jarak; bumi tidak datar.
CPBL
1
Saya percaya 111,1
Abel Callejo
6
Perhatikan bahwa satu derajat bujur sama dengan 111 km di khatulistiwa, tetapi lebih kecil untuk lintang lainnya. Ada rumus pendekatan sederhana untuk mencari panjang 1 ° bujur dalam km dalam fungsi lintang: 1 ° bujur = 40000 km * cos (lintang) / 360 (dan tentu saja ini memberikan 111 km untuk lintang = 90 °). Juga perhatikan bahwa 1 ° garis bujur hampir selalu berbeda dengan 1 ° garis lintang.
Ben
-1

Jika Anda menginginkan solusi sederhana, gunakan rumus Haversine seperti yang dijelaskan oleh komentar lain. Jika Anda memiliki aplikasi yang peka terhadap akurasi, ingatlah rumus Haversine tidak menjamin akurasi lebih baik dari 0,5% karena mengasumsikan bumi berbentuk bola. Untuk menganggap bahwa Bumi adalah bola oblate spheroid, pertimbangkan untuk menggunakan rumus Vincenty . Selain itu, saya tidak yakin radius apa yang harus kita gunakan dengan rumus Haversine: {Equator: 6.378.137 km, Polar: 6.356.752 km, Volumetric: 6.371.0088 km}.

Samuel Crawford Loveys
sumber
it is assuming the earth is a circle^^ Beberapa orang aneh melakukan ini saat ini ... tetapi yang Anda maksud mungkin lebih it is assuming the earth is a sphere;)
derHugo
-2

Anda perlu mengubah koordinat menjadi radian untuk melakukan geometri bola. Setelah dikonversikan, barulah Anda bisa menghitung jarak antara dua titik tersebut. Jarak kemudian dapat dikonversi ke ukuran apa pun yang Anda inginkan.

Arlie Winters
sumber