Menghitung rata-rata koordinat lintang dan bujur

19

Bagaimana saya bisa menghitung rata-rata antara beberapa titik lintang dan bujur?

Haruskah saya menghitung rata-rata Aritmatika untuk lat dan lng?

aneuryzm
sumber
3
Saya pikir kesesuaian rata-rata tergantung pada kasus penggunaan Anda. Jika Anda hanya mengelompokkan lokasi restoran kota untuk peta web, yakin rata-rata akan berfungsi sebagian besar waktu. Namun Anda akan mendapatkan bug di beberapa tempat .. untuk prototipe atau aplikasi berbiaya rendah mungkin tidak masalah. Namun, jika Anda melakukan sesuatu yang lebih serius atau mencakup area yang luas maka Anda mungkin perlu mempertimbangkan nuansa proyeksi.
Glenn
1
Bagaimana poin-poin ini dikumpulkan? Alih-alih bertanya bagaimana cara rata-rata koordinat, mungkin bertanya apakah rata-rata adalah cara yang tepat untuk mengkompensasi kesalahan pengukuran. Ebook ini memiliki banyak definisi kesalahan.
Kirk Kuykendall
Hanya sebuah catatan bahwa ada beberapa kasus tepi di mana 'titik rata-rata' tidak terdefinisi dengan baik: misalnya di mana saja di sepanjang garis khatulistiwa dapat menjadi "rata-rata" dari kutub N. dan S.
Dan S.

Jawaban:

15

Untuk rata-rata sederhana, Anda tidak ingin rata-rata koordinat bujur dan lintang. Ini mungkin bekerja cukup baik di lintang yang lebih rendah, tetapi pada lintang yang lebih tinggi akan mulai memberikan hasil yang buruk dan benar-benar rusak di dekat kutub.

Metode yang saya gunakan untuk jenis hal ini adalah untuk mengkonversi koordinat garis bujur / lintang ke koordinat kartesius 3d (x, y, z). Rata-rata ini (untuk memberikan vektor kartesius), dan kemudian konversikan kembali. Perhatikan bahwa Anda mungkin tidak perlu menormalkan vektor, sehingga proses rata-rata sebenarnya bisa menjadi jumlah yang sederhana.


Edit, ini kode saya :

Yang berikut ini mengonversi koordinat kartesius ke lintang / bujur (dalam derajat): Hapus RAD2DEGkonstanta untuk radian.

Latitude = MPUtility.RAD2DEG * Math.Atan2(z, Math.Sqrt(x * x + y * y));
Longitude = MPUtility.RAD2DEG * Math.Atan2(-y, x);

Dan di sini kita menghitung koordinat kartesius dari lintang / bujur (ditentukan dalam radian):

private void CalcCartesianCoord()
{
    _x = Math.Sin(LatitudeRadians) * Math.Cos(LongitudeRadians);
    _y = Math.Sin(LatitudeRadians) * Math.Sin(LongitudeRadians);
    _z = Math.Cos(LatitudeRadians); 
}

Keduanya dipotong & disisipkan dari kode nyata, karenanya campuran derajat dan radian. Ada properti di sini yang melakukan beberapa konversi (mis. LatitudeRadiansAdalah properti yang mengembalikan nilai radian).

Perhatikan bahwa pengoptimalan dimungkinkan: kalkulasi sinus duplikat, misalnya. Juga perhitungan trigonometri mungkin dapat di-cache jika Anda sering memanggilnya.

menang
sumber
1
poin bagus. Saya tidak percaya saya lupa menyebutkan bahwa .. rata-rata di dekat kutub dan garis tanggal telah menggigit saya sebelumnya.
Glenn
3
(+1) Masalahnya tidak terbatas pada kutub dan + -180 derajat meridian: ketika garis lintang dari titik-titik yang dirata-rata sangat bervariasi, rata-rata lurus koordinat lat / lon sama dengan menggunakan proyeksi Plate Carree, yang memperkenalkan distorsi metrik variabel yang meningkat dengan garis lintang. Tidak ada masalah numerik tetapi rata-rata hanya di lokasi yang salah. Untuk alasan ini perhitungan lat / lon yang disarankan dalam jawaban @ Glenn jarang diterima kecuali untuk daerah non-kutub yang relatif kecil.
whuber
@ dinanti terima kasih, dapatkah Anda menyarankan beberapa cuplikan kode (Java) atau tutorial yang bagus untuk melakukan ini?
aneuryzm
1
Perhitungannya ada di en.wikipedia.org/wiki/Spherical_coordinates di bawah 'Cartesian Coordinates'. (Implementasi saya adalah C # dan sebagian dioptimalkan - ditambah saya mengetik ini di dokter gigi !!)
winwaed
1
Saya pikir untuk kasus penggunaan teknik yang tepat Anda sangat benar. Namun, kecuali diperlukan ketelitian ekstrim, rata-rata WGS84 lat, koordinat lng di kota dan bahkan wilayah bekerja sangat baik dan memberikan hasil yang dapat diterima akurat untuk sebagian besar penggunaan di mana rata-rata akan digunakan.
Glenn
3

Opsi Clustering : Saya pikir kata buzz konseptual yang mencakup jenis operasi ini adalah "clustering". Rata-rata sejauh ini adalah yang paling sederhana untuk diterapkan dan berfungsi dengan baik untuk sebagian besar tujuan. Satu-satunya waktu saya akan menggunakan sesuatu yang lain adalah jika Anda khawatir tentang outlier [Sunting] -> atau kutub atau dateline internasional. [Sunting] -> juga rata-rata, sementara itu akan memberi Anda sesuatu yang terlihat dekat dengan pusat cluster, akan sedikit turun karena ketidakakuratan proyeksi yang disebabkan oleh kenyataan bahwa derajat lat lng tidak selalu jarak yang sama terpisah dalam km / mil. Semakin besar area yang Anda rata-rata semakin distorsi.

Berikut ini adalah perbandingan beberapa opsi pengelompokan

Rata-rata (mudah, tercepat, tidak akurat): jumlahkan nilai lat & bagi dengan jumlah dan lakukan hal yang sama untuk nilai lng. Pastikan untuk melihat overflow jika Anda menggunakan Int32 beberapa sistem (terutama c #) akan secara diam-diam meluap kembali ke angka yang rendah. Anda dapat menghindari kesalahan ini dengan menggunakan presisi floating point untuk akumulator jumlah Anda. Salah satu masalah dengan metode ini adalah outlier dapat membuat miring lokasi Anda. [Sunting] -> Yang lain adalah matematika di dekat kutub dan garis tanggal internasional tidak rata-rata dengan baik dan akan membuat lokasi menjadi buruk.

Tetangga Terdekat (sedikit lebih keras, lebih lambat, tidak bias outlier) Daripada rata-rata Anda bisa pergi dengan lokasi lat lng sebenarnya dengan jarak rata-rata terkecil ke semua tetangganya. Ini seperti mengambil "median". Sisi buruknya adalah ini mahal secara komputasi karena Anda membandingkan setiap titik dengan setiap titik lainnya dan menghitung jarak di antara mereka. Sebagai contoh, pengelompokan 10.000 poin akan membutuhkan 100 juta perhitungan jarak .. tidak terlalu lambat tapi pasti tidak berskala baik.

Grid Cell (membutuhkan sedikit pengaturan ekstra, jauh lebih cepat, tidak bias outlier) Ini mirip dengan tetangga terdekat tetapi jauh lebih cepat. Anda dapat memilih tingkat presisi yang sewenang-wenang, misalnya 0,01 lg lat lng (sekitar 1 km kira-kira pada populasi lattitudes) dan kelompokkan poin Anda ke dalam ember 0,01 x 0,01 derajat. Anda kemudian dapat memilih ember dengan poin terbanyak di dalamnya dan mengambil rata-rata poin tersebut atau menjalankan analisis tetangga terdekat hanya pada titik-titik tersebut. Saya banyak menggunakan metode ini dengan kumpulan data yang sangat besar (ratusan miliar catatan) dan menemukan keseimbangan yang baik antara presisi dan kecepatan.

Convex Hull Centroid (hasil keras, lebih lambat, rapi): Anda juga bisa menggambar sebuah band di sekitar titik Anda untuk menentukan bentuk yang mencakup semuanya ( lihat wikipedia ), dan kemudian menghitung titik tengah dari bentuk ini. Fungsi centroid yang tipikal tidak ditimbang pusat sehingga Anda perlu melakukan semacam analisis terbalik tetangga terdekat menggunakan titik sampel di dalam bentuk Anda sampai Anda menemukan yang terjauh dari tepinya. Metode ini benar-benar lebih menarik karena convex hull itu sendiri daripada algoritma pencarian pusat aktual yang tidak cepat dan tidak terlalu tepat .. tetapi bentuk lambung mungkin memiliki aplikasi lain yang berguna dengan data Anda.

Glenn
sumber
@winwaed membuat poin bagus tentang rata-rata koordinat di dekat kutub dan saya juga akan menambahkan garis tanggal internasional. Misalnya jika Anda memiliki satu titik di satu sisi dan satu di sisi lain Anda mendapatkan beberapa rata-rata buruk (dan juga kotak terikat). Ini jarang muncul, tetapi ketika melakukannya sungguh menyebalkan untuk melakukan debug
Glenn
@whuber membuat poin bagus tentang center drifting saat Anda sedang. Sementara rata-rata akan memberi Anda sesuatu yang terlihat dekat dengan pusat cluster, akan sedikit lebih buruk karena ketidakakuratan proyeksi yang disebabkan oleh fakta bahwa derajat lat lng tidak selalu jarak yang sama selain dalam km / mil. Semakin besar area yang Anda rata-rata semakin distorsi.
Glenn
0

Tidak yakin apa yang ingin Anda capai, tetapi titik yang garis lintangnya merupakan rata-rata lattitudes dari set titik asli dan garis bujur adalah rata-rata dari garis bujur dari set titik asli, akan menjadi titik rata-rata dari set titik asli. [UPDATE]: Di atas, rata-rata adalah rata-rata aritmatika.

GuillaumeC
sumber
Dalam jawaban Anda, avg = Berarti aritmatika?
aneuryzm
1
Ya benar. Itu yang saya maksudkan maaf karena kurang jelas. Saya memperbarui jawabannya. Tapi saya tidak yakin saya membawa sesuatu yang sangat berguna ke meja di sini ...
GuillaumeC