Bagaimana saya bisa menghitung rata-rata antara beberapa titik lintang dan bujur?
Haruskah saya menghitung rata-rata Aritmatika untuk lat dan lng?
Bagaimana saya bisa menghitung rata-rata antara beberapa titik lintang dan bujur?
Haruskah saya menghitung rata-rata Aritmatika untuk lat dan lng?
Jawaban:
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 c # saya :
Yang berikut ini mengonversi koordinat kartesius ke lintang / bujur (dalam derajat): Hapus RAD2DEG
konstanta 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. LatitudeRadians
Adalah properti yang mengembalikan nilai radian).
Perhatikan bahwa pengoptimalan dimungkinkan: kalkulasi sinus duplikat, misalnya. Juga perhitungan trigonometri mungkin dapat di-cache jika Anda sering memanggilnya.
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.
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.