3 poin oleh GN⁺ 2023-08-28 | 1 komentar | Bagikan ke WhatsApp
  • Saat menambahkan perpindahan x,y dalam satuan meter ke koordinat lintang/bujur, jika jarak perpindahan tidak lebih dari beberapa km dan bukan dekat kutub, perhitungan cepat bisa dilakukan hanya dengan rumus pendekatan sederhana
  • Perhitungan dasarnya adalah menganggap 111.111 m pada arah y sebagai 1 derajat lintang, dan 111111 * cos(latitude) m pada arah x sebagai 1 derajat bujur; jadi perpindahan 100 m ke utara bisa dihitung dengan menambahkan 100 / 111111 derajat
  • Ide yang sama juga bisa dihitung dengan menganggap bumi sebagai bola dengan jari-jari R=6378137, menggunakan dLat=dn/R, dLon=de/(R*cos(lat)); pada lintang 51 derajat dengan dn=100, de=100, hasilnya latO=51.00089832, lonO=0.001427437
  • Jika kebutuhan akurasi dalam 10 m dan offset hingga 1 km, rumus yang lebih kompleks seperti Aviation Formulary bisa digunakan, tetapi pendekatan bidang datar sederhana juga diperkirakan memberi galat kurang dari 50 m pada offset 1 km
  • Jika perlu menangani efek perubahan panjang 1 derajat menurut lintang, lebih aman memakai rumus meters per degree, atau mengonversi ke sistem koordinat proyeksi lokal, menambahkan perpindahan, lalu mengubahnya kembali ke lintang/bujur

Untuk perpindahan jarak kecil, pendekatan 111.111 m/derajat sudah memadai

  • Untuk perpindahan kecil, perubahan lintang/bujur dapat dihitung dengan pendekatan berikut
    • arah y 111.111 m ≈ 1 derajat lintang
    • arah x 111111 * cos(latitude) m ≈ 1 derajat bujur
  • Koordinat baru kira-kira didapat seperti ini
    • lat_new = lat + dy / 111111
    • lon_new = lon + dx / (111111 * cos(latitude))
  • Pada cos(latitude), gunakan satuan yang sesuai dengan lingkungan eksekusi
    • Jika lingkungan membutuhkan radian, perlu konversi latitude * pi / 180
  • Pendekatan ini cocok bila perpindahan tidak terlalu besar, tidak berada tepat dekat kutub, dan akurasi yang dibutuhkan tidak terlalu tinggi

Dasar angka 111.111 m dan rentang galatnya

  • Nilai 111.111 terhubung dengan definisi historis meter
    • karena Prancis awalnya mendefinisikan meter sebagai 10^7 per bagian dari jarak yang diukur sepanjang meridian Paris dari khatulistiwa ke kutub utara
    • 10^7 / 90 = 111.111,1 m setara dengan 1 derajat lintang
  • Dalam verifikasi komentar, saat x,y masing-masing 1.400 m dan perpindahan total 2 km dibandingkan dengan perhitungan UTM, hasilnya cocok dengan galat tidak lebih dari 8,6 m
    • lintang terburuk pada kondisi tersebut adalah 81 derajat
    • galat tetap di bawah 10 m hingga melewati 89,6 derajat
  • Rumus sederhana ini mencerminkan efek bahwa bujur makin menyempit saat mendekati kutub melalui cos(latitude)
    • karena jarak sebenarnya untuk 1 derajat bujur mengecil, perpindahan meter yang sama pada arah x dikonversi menjadi perubahan bujur yang lebih besar di lintang tinggi

Perhitungan yang sama dengan memakai jari-jari bumi

  • Perhitungan yang sama juga bisa dinyatakan dengan rumus berbasis jari-jari bumi
//Position, decimal degrees
lat = 51.0
lon = 0.0

//Earth’s radius, sphere
R=6378137

//offsets in meters
dn = 100
de = 100

//Coordinate offsets in radians
dLat = dn/R
dLon = de/(R*Cos(Pi*lat/180))

//OffsetPosition, decimal degrees
latO = lat + dLat * 180/Pi
lonO = lon + dLon * 180/Pi
  • Contoh ini menghasilkan nilai berikut
latO = 51,00089832
lonO = 0,001427437
  • Metode ini hampir sama dengan pendekatan 111.111 m/derajat, dengan perbedaan bahwa ia memakai nilai berbasis jari-jari yang lebih dekat ke 111.319,5 m
  • Perpindahan x harus mendekati arah timur-barat yang sebenarnya, dan perpindahan y harus mendekati arah utara-selatan
    • jika easting/northing pada sistem proyeksi lokal mengalami rotasi, komponen itu harus lebih dulu diubah ke komponen timur-barat dan utara-selatan

Pilihan saat membutuhkan akurasi lebih tinggi

  • Rumus “lat/long given radial and distance” dari Aviation Formulary dapat digunakan untuk menghitung lintang/bujur baru dari jarak dan azimut
    • untuk lingkungan embedded yang ingin meminimalkan penggunaan fungsi trigonometri, ini bisa terasa agak rumit
    • parameter jarak diperlakukan sebagai nilai radian dalam bentuk distance / earth radius
  • Cara lain adalah memproyeksikan dulu ke sistem koordinat bidang yang sesuai untuk wilayah tersebut, lalu menambahkan offset
flat_coordinate = latlon_to_utm(original_coordinate)
new_flat_coordinate = flat_coordinate + (x,y)
result_coordinate = utm_to_latlon(new_flat_coordinate)
  • Metode ini tidak harus memakai UTM; sistem koordinat bidang apa pun yang cocok untuk wilayah tersebut dapat digunakan
  • Namun, jika perpindahan melewati batas zona UTM hingga masuk ke zona UTM lain, metode ini sulit diterapkan secara langsung

Contoh implementasi per bahasa dan rumus presisi menurut lintang

  • Contoh Python menjadikan langsung pendekatan 111.111 m/derajat sebagai fungsi
from math import cos, radians

def meters_to_lat_lon_displacement(m, origin_latitude):
    lat = m / 111111
    lon = m / (111111 * cos(radians(origin_latitude)))
    return lat, lon
  • Contoh R juga melakukan perhitungan yang sama
deg2rad = function(deg) {(deg * pi) / (180)}

meters_to_lat_lon_displacement = function(m, origin_latitude){
  lat = m / 111111
  lon = m / (111111 * cos((deg2rad(origin_latitude))))
  return(list(lat=lat,lon=lon))
}
  • Rumus meters per degree yang lebih akurat menurut lintang dapat ditulis seperti berikut
meters_per_degree_lat = (111132.92 - 559.82 * np.cos(2 * lat0_rad) +
                             1.175 * np.cos(4 * lat0_rad) - 0.0023 * np.cos(6 * lat0_rad))

meters_per_degree_lon = (111412.84 * np.cos(lat0_rad) -
                            93.5 * np.cos(3 * lat0_rad) + 0.118 * np.cos(5 * lat0_rad))
  • Rumus presisi ini mencerminkan bahwa panjang 1 derajat lintang dan 1 derajat bujur terus berubah menurut lintang
  • Contoh Swift menggunakan bentuk yang menghitung jari-jari bumi menurut lintang, lalu memperoleh CLLocationCoordinate2D baru dari jarak dan azimut

1 komentar

 
GN⁺ 2023-08-28
Opini Hacker News
  • Meter didefinisikan ulang pada 1791 sebagai sepersepuluh juta dari kuadran meridian yang melewati Paris, yaitu panjang busur 90 derajat
    Jadi 1° ≡ 1/90 × 10^7 m = 111.111,111... m, dan keliling Bumi juga kira-kira 40 juta m, atau 40.000 km
    Definisi awal meter adalah pendulum detik, yaitu panjang pendulum dengan periode 2 detik; jika memasukkan T = 2, L = 1 ke T ≈ 2π√(L/g), maka 1 = π√(1/g), 1 = π²/g
    Karena itu g yang mendekati π² juga bukan sekadar kebetulan, dan 1 cm³ air sama dengan 1 g juga karena itu lama menjadi definisi gram

    • Detik adalah satuan yang lebih tua daripada redefinisi meter, dan karena berasal dari pembagian satu hari secara “rapi”, tampaknya masih ada sedikit unsur kebetulan
      Ketika meter didefinisikan lewat pendulum detik, ia sepenuhnya terikat pada definisi detik dan nilai g; ditulis sebagai rumus, 1 m = 1 s² × g / π²
      g ≈ π² muncul secara alami, tetapi keliling Bumi yang cukup dekat dengan 40.000 km sehingga meter bisa didefinisikan ulang sebagai pangkat 10 tanpa perubahan besar tampak seperti kebetulan
      https://en.wikipedia.org/wiki/Second#Fraction_of_solar_day
    • Satu integer 32-bit bisa merepresentasikan lintang atau bujur dengan akurasi kira-kira 1 cm :D
    • Meter sebenarnya juga mirip dengan 3 kaki Paris, sekitar 0,97 m
      3 kaki Inggris hanya sekitar 0,91 m
      Orang-orang saat itu bukan menurunkan satuan panjang yang paling prinsipil atau indah secara kosmis dari ruang hampa, melainkan lebih seperti mencoba mendefinisikan satuan yang sudah dipakai dengan cara selain “panjang batang yang ada di sana”
    • Rasanya enak kalau sistem koordinat GPS memakai kilometer saja
      Alih-alih 360 derajat, gunakan 40.000 km, dan untuk perhitungan sebenarnya pakai jarak nyata, sementara nilai pendekatannya sudah cukup dekat
      Dengan begitu, setidaknya bagi pengguna sistem metrik, tidak perlu konversi untuk mengubahnya menjadi jarak
      Masalah dengan satuan derajat adalah sulit diubah menjadi jarak yang berguna; trik seperti ini memang membantu, tetapi sejak awal lebih baik tidak perlu konversi
    • Prancis juga menerapkan desimalisasi pada sudut, jadi sebenarnya 1 gon = 100 km dan 1 km hanyalah 1 centigon
  • Satu mil laut, sekitar 6076 ft, tepat setara dengan 1 menit busur di ekuator Bumi
    Dari sudut pandang navigasi, saya berharap semua mil adalah mil laut
    Mil laut punya makna nyata; 5280 ft itu sebenarnya bermakna apa?

    • Alasan satu mil adalah 5280 ft karena panjangnya 80 chain
      Panjang chain adalah produk sampingan dari hukum pajak tanah Inggris yang memungut pajak berdasarkan acre
      Mil Romawi adalah 1000 langkah, yaitu 5000 ft, jadi yang itu sedikit lebih masuk akal
      https://en.wikipedia.org/wiki/Gunter%27s_chain
    • Sebagian besar “mil” lainnya diturunkan dari mil Romawi, dan berkembang cukup independen dari satuan Inggris seperti kaki, yard, inci, dan barleycorn, sehingga faktor konversinya menjadi aneh
      Mil Romawi aslinya adalah 5000 kaki Romawi
      Sebenarnya 1 nmi ≡ 1,852 km didefinisikan secara persis
      Dari definisi asli meter pun didapat 1/60 × 1/90 × 10^7 = 1851,85185185... m
      Ciri utama SI dan pendahulunya, MKS serta CGS, adalah sejak awal adanya konvertibilitas antar-satuan, sehingga ada relasi seperti 1 m ≡ 1 s ≡ 1 kg ≡ 1 N ≡ 1 Pa ≡ 1 J ≡ 1 A ≡ 1 C ≡ 1 V ≡ 1 Ω ≡ 1 F ≡ 1 W ≡ 1 Wb ≡ 1 T ≡ 1 H ≡ 1 Hz
      Di sini ≡ dipakai bukan sebagai ekuivalensi ketat, melainkan untuk secara longgar menunjuk faktor konversi
      Yang agak mendekati pengecualian dalam SI adalah kelvin, mol, kandela, dan satuan turunannya; dua yang pertama bisa ditangani dengan rapi lewat konstanta Boltzmann dan konstanta Avogadro
      Secara pribadi saya kurang senang kandela ada di SI
    • Menariknya, mil awalnya adalah 5000 ft yang tidak terlalu aneh
      Namun pada tahun 1500-an, Inggris mengubah mil menjadi 8 furlong agar perhitungan pengukuran pertanian saat itu jauh lebih mudah
      https://en.m.wikipedia.org/wiki/Furlong
    • Seandainya orang abad pertengahan mendefinisikan mil sebagai 5040 ft, itu akan bagus, karena bisa dibagi dengan 2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 14, 15, 16, 18, 20, 21, 24, 28, 30, 35, 36, 40, 42, 45, 48, 56, 60, 63, 70, 72, 80, 84, 90, 105, 112, 120, 126, 140, 144, 168, 180, 210, 240, 252, 280, 315, 336, 360, 420, 504, 560, 630, 720, 840, 1008, 1260, 1680, 2520
    • Saya penasaran apa arti nyata dalam “mil laut punya makna nyata”
      Rasanya seperti argumen bahwa satuan adat lebih baik karena 10 tidak bisa dibagi 3 hanya dengan bilangan bulat
      Jika lingkaran dibagi menjadi 360 busur, sepertinya satu busur itu dianggap punya makna tertentu pada jarak tertentu dari titik fokus
      Namun mengingat sekitar 2000 tahun lalu Yunani mengadopsi penggunaan 360 dari Babilonia, dan Babilonia sendiri mencapai angka itu dengan menyempurnakan pengukuran kasar jumlah hari dalam setahun yang dipakai dalam astronomi selama 2000 tahun sebelumnya, makna mil laut lebih dekat ke makna turunan dan kebetulan daripada “nyata”
      Selain itu, jika mempertimbangkan bahwa Bumi adalah sferoid pepat, panjang mil laut berubah bergantung pada lokasi
  • Saya sudah tinggal di AS lebih dari 10 tahun, tetapi masih belum terbiasa dengan sistem yard-pound, dan sepertinya akan tetap begitu
    Sama sekali tidak masuk akal
    Sistem metrik itu seperti emas murni: 1cm = 10mm, 1m = 100cm, 1km = 1000m, 1kg = 1000g, 1ton = 1000kg
    Sistem yard-pound seperti bilang “tunggu sebentar”, lalu jadinya 1in = ???, 1ft = 12in, 1yd = 3ft, 1mile = 5280ft, 1lb = 16oz, dan semacamnya
    Entah siapa yang menciptakan kegilaan seperti ini

    • Yang saya sadari setelah tinggal di AS adalah, kebanyakan orang Amerika tidak mengonversi antar-satuan kecuali benar-benar perlu
      Jadi masalahnya tidak sesering yang dibayangkan
      Bahkan ketika kebetulan ditampilkan dalam sistem metrik, terlihat bahwa mereka tidak mengonversi satuannya
      Misalnya menulis 1000mL alih-alih 1L, atau 3500g alih-alih 3.5kg
      Orang Eropa bisa bilang “yang ini 600m, yang itu 1.2km”, tetapi orang Amerika hampir tidak pernah bilang “yang ini 800 yard, yang itu 1 mil”
      Orang Eropa bisa bilang “saya harus membawa 4L air, jadi tasnya jadi 4kg lebih berat”
      Orang Amerika mungkin bisa bilang “botol saya 24 ons cair, jadi kira-kira 24 ons berat”, tetapi kalau galon, kemungkinan besar mereka hanya akan bilang beratnya sekitar satu galon
      Pada akhirnya, masalah konversi satuan tidak separah yang saya bayangkan, karena orang Amerika tidak berjalan-jalan sambil mengonversi satuan di setiap kalimat
    • Sepertinya cukup banyak orang yang tumbuh besar di AS pun tidak sepenuhnya memahami sistem ini
      Saya akan terkejut kalau lebih dari 50% populasi tahu ada berapa ons dalam satu cangkir air, atau satu mil itu berapa kaki
      Untungnya, di AS pun komunitas ilmiah memakai sistem metrik sebagai standar
    • Ada beberapa satuan perantara yang terlewat, dan kalau mengetahuinya, ini jadi sedikit lebih bisa dijelaskan
      Chain yang berasal dari alat ukur survei panjangnya 22 yard
      Satu chain juga sama dengan 4 rod, jadi satu rod menjadi 5½ yard, yang cukup aneh
      10 chain adalah satu furlong, dan 8 furlong adalah 1 mil
      Sebagai referensi, satu acre adalah 1 furlong × 1 chain
      Meski terlihat gila, di dalamnya ada semacam sistem
    • Memangnya inci harus dikonversi menjadi apa?
      Kenapa perlu mengonversi inci ke mil?
      Dalam hidup, tidak ada kebutuhan untuk mengubah inci, atau kaki dan inci, menjadi mil
    • Konversi satuan memang merepotkan, tetapi menurut saya yang paling buruk sebenarnya adalah penulisan panjang dengan pecahan
      Untuk pertukangan kayu atau kerajinan tangan, mungkin masuk akal secara asal-usul, tetapi bagaimana untuk penggunaan lain?
      Coba baca 2 3/16" pada penggaris yard-pound secepat membaca 5.6cm
      Ukuran sekrup juga terkena dampaknya
  • Jarak yang ditempuh cahaya dalam 1 nanodetik juga kira-kira 1 kaki

    • Sangat dekat dengan nilai sebenarnya
      Mengesankan :)
      Hasil $ units c ft/ns adalah * 0.98357106
    • Jarak yang ditempuh suara dalam 1 milidetik juga kira-kira 1 kaki
    • Kalau waktunya diubah dan 1 chrono didefinisikan sebagai waktu yang dibutuhkan cahaya untuk menempuh 1e9 m, itu rasanya keren
      1 kilochrono adalah 55 menit, dan cukup berguna dalam situasi seperti perjalanan luar angkasa ketika satuan tidak bisa bergantung pada hari Matahari
    • Jumlah detik dalam 1 tahun juga cukup dekat dengan π*10^7
    • 1 googol femtobarns juga kira-kira 1 square teraparsecs
  • Kalau Bumi adalah sferoid pepat, bukankah panjang busur sebenarnya untuk 1 derajat lintang berubah?
    Saya penasaran apakah “dapat diandalkan” hanya berarti “cukup dekat untuk dipakai”
    Sepertinya saya sudah terlalu lama tidak mengerjakan hal yang berhubungan dengan geografi sampai lupa hal yang dulu saya tahu

    • Dapat diandalkan berarti cukup dekat untuk dipakai, dan di wilayah yang banyak dihuni manusia, perkiraannya juga cukup akurat
      Kasus penggunaan saya saat mengetahui fakta ini juga saya tulis sedikit di sini: https://twitter.com/mholt6/status/1695685022710477043
      Kalaupun dalam kasus saya ada galat beberapa km, kemungkinan besar itu bukan di dekat wilayah kutub, dan kalau memang di kutub, cukup dianggap “oke, paham, kamu ada di titik kutub”
    • Diameter ekuator Bumi 43 km lebih besar daripada diameter kutubnya
      Orbit Bumi juga mirip
      Di sekolah kita belajar bahwa bentuknya elips, tetapi hampir tidak mendapatkan rasa tentang bentuk sebenarnya, dan kebanyakan gambar memberi kesan yang benar-benar keliru
    • Kalau hanya melihat judul tulisan, orang bisa mengira perubahan panjang 1 derajat lintang kurang dari 1 desimeter, tetapi tentu saja bukan begitu
      Meski begitu, untuk banyak tujuan praktis, ini cukup dekat
  • Tulisan ini juga memuat aturan praktis yang bagus bahwa 111,111 * cos(latitude) m adalah 1 derajat bujur
    Saya suka koreksinya
    Sebenarnya cukup memakai konstanta sederhana: 25° kira-kira 100,000m, 44° kira-kira 80,000m, 57° kira-kira 60,000m