MongoDB
 sql >> Teknologi Basis Data >  >> NoSQL >> MongoDB

Temukan titik dekat LineString di mongodb diurutkan berdasarkan jarak

Seperti yang Anda sebutkan, Mongo saat ini tidak mendukung apa pun selain Point . Pernahkah Anda menemukan konsep petinju rute? 1 Itu sangat populer beberapa tahun yang lalu di Google Maps. Mengingat garis yang telah Anda gambar, temukan pemberhentian yang berada di dalam dist(x) . Itu dilakukan dengan membuat serangkaian kotak pembatas di sekitar setiap titik dalam garis, dan mencari titik-titik yang termasuk dalam ember.

Saya menemukan pertanyaan Anda setelah saya baru menyadari bahwa Mongo hanya bekerja dengan poin, yang menurut saya masuk akal.

Saya sudah memiliki beberapa opsi tentang cara melakukannya (mereka memperluas apa yang dikatakan @mnemosyn di komentar). Dengan dataset yang sedang saya kerjakan, semuanya ada di sisi klien, jadi saya bisa menggunakan routeboxer, tetapi saya ingin mengimplementasikannya di sisi server untuk alasan kinerja. Ini saran saya:

  1. pecahkan LineString ke dalam set koordinat individualnya, dan kueri untuk $near menggunakan masing-masing, menggabungkan hasil dan mengekstrak satu set unik. Ada algoritme di luar sana untuk menyederhanakan garis yang rumit, dengan mengurangi jumlah titik, tetapi yang sederhana mudah ditulis.

  2. lakukan hal yang sama seperti di atas, tetapi sebagai prosedur/fungsi tersimpan. Saya belum pernah bermain-main dengan fungsi tersimpan Mongo, dan saya tidak tahu seberapa baik mereka bekerja dengan driver, tetapi ini bisa lebih cepat daripada opsi pertama di atas karena Anda tidak perlu melakukan bolak-balik, dan tergantung pada mesin yang instance Mongo Anda dihosting, penghitungan bisa lebih cepat dalam hitungan mikrodetik.

  3. Menerapkan pendekatan routeboxer sisi server (telah dilakukan di PHP), dan kemudian gunakan salah satu dari 2 di atas untuk menemukan pemberhentian yang $within kotak pembatas yang dihasilkan. Heck karena metode routeboxer mengembalikan persegi panjang, dimungkinkan untuk menggabungkan semua persegi panjang ini menjadi satu poligon yang menutupi rute Anda, dan cukup lakukan $within pada itu. (Apa yang disarankan @mnemosyn).

  4. EDIT: Saya memikirkan hal ini tetapi melupakannya, tetapi mungkin saja untuk mencapai beberapa hal di atas menggunakan kerangka kerja agregasi.

Ini adalah sesuatu yang akan segera saya kerjakan (semoga), saya akan membuka sumber hasil saya berdasarkan yang akhirnya saya gunakan.

EDIT: Saya harus menyebutkan bahwa 1 dan 2 memiliki kekurangan bahwa jika Anda memiliki 2 titik dalam sebuah garis yang berjarak 2 km, dan Anda menginginkan titik yang berada dalam jarak 1,8 km dari garis Anda, Anda jelas akan kehilangan semua titik di antara bagian itu. dari baris Anda. Solusinya adalah dengan menyuntikkan poin ke baris Anda saat menyederhanakannya (saya tahu, itu mengalahkan tujuan mengurangi poin saat menambahkan yang baru kembali).

Kelemahan dengan 3 adalah bahwa itu tidak akan selalu akurat karena beberapa titik dalam poligon Anda cenderung memiliki jarak yang lebih besar dari batas Anda, meskipun perbedaannya tidak akan menjadi persentase yang signifikan dari batas Anda.

[1 ] google maps utils routeboxer



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Kueri untuk mendapatkan data X menit terakhir dengan Mongodb

  2. Cara terbaik untuk menyimpan tanggal/waktu di mongodb

  3. Bagaimana cara mendapatkan output kueri berwarna dan shell di MongoDB?

  4. DAPATKAN permintaan selalu default ke /(?:)/i - bagaimana saya bisa membuatnya 'tidak terdefinisi'? - Pertanyaan kedua tentang topik ini

  5. MongoDB:Menggabungkan Pencarian Teks dan Kueri Geospasial