MongoDB
 sql >> Baza danych >  >> NoSQL >> MongoDB

Znajdź punkty w pobliżu LineString w mongodb posortowane według odległości

Jak wspomniałeś, Mongo obecnie nie obsługuje niczego poza Point . Czy spotkałeś się z koncepcją boksera na trasie? 1 Był bardzo popularny kilka lat temu w Mapach Google. Biorąc pod uwagę narysowaną linię, znajdź przystanki w obrębie dist(x) . Dokonano tego poprzez utworzenie serii obwiedni wokół każdego punktu linii i wyszukanie punktów, które mieszczą się w wiadrze.

Natknąłem się na twoje pytanie po tym, jak właśnie zdałem sobie sprawę, że Mongo działa tylko z punktami, co, jak zakładam, jest rozsądne.

Mam już kilka opcji, jak to zrobić (rozwijają to, co mówi @mnemosyn w komentarzu). Z zestawem danych, nad którym pracuję, wszystko odbywa się po stronie klienta, więc mógłbym użyć routera, ale chciałbym go zaimplementować po stronie serwera ze względu na wydajność. Oto moje sugestie:

  1. przełam LineString w dół do indywidualnych zestawów współrzędnych i zapytanie o $near używając każdego z nich, połącz wyniki i wydobądź unikalny zestaw. Istnieją algorytmy do upraszczania złożonej linii poprzez zmniejszenie liczby punktów, ale prosty jest łatwy do napisania.

  2. wykonaj to samo, co powyżej, ale jako procedurę/funkcję składowaną. Nie bawiłem się przechowywanymi funkcjami Mongo i nie wiem, jak dobrze działają ze sterownikami, ale może to być szybsze niż pierwsza opcja powyżej, ponieważ nie będziesz musiał wykonywać podróży w obie strony i w zależności od maszyny, która Twoje instancje Mongo są hostowane, obliczenia mogą być szybsze o mikrosekundy.

  3. Zaimplementuj podejście routeboxer po stronie serwera (zostało zrobione w PHP), a następnie użyj jednego z powyższych 2, aby znaleźć przystanki, które są $within powstałe ramki ograniczające. Heck, ponieważ metoda routeboxer zwraca prostokąty, byłoby możliwe scalenie wszystkich tych prostokątów w jeden wielokąt obejmujący Twoją trasę i po prostu wykonanie $within Na tym. (Co zasugerował @mnemosyn).

  4. EDYTUJ: Myślałem o tym, ale zapomniałem o tym, ale możliwe jest osiągnięcie niektórych z powyższych za pomocą struktury agregacji.

To jest coś, nad czym będę wkrótce pracował (mam nadzieję), że udostępnię swoje wyniki, na podstawie których skończę.

EDYTUJ: Muszę jednak wspomnieć, że 1 i 2 mają tę wadę, że jeśli masz 2 punkty na linii, które są oddalone od siebie o 2 km, a chcesz punktów, które znajdują się w odległości 1,8 km od Twojej linii, oczywiście przeoczysz wszystkie punkty między tymi odcinkami swojej linii. Rozwiązaniem jest wstrzykiwanie punktów do linii podczas jej upraszczania (wiem, że pokonanie celu redukcji punktów przy dodawaniu nowych z powrotem).

Wadą w przypadku 3 jest to, że nie zawsze będzie ona dokładna, ponieważ niektóre punkty w obrębie wielokąta prawdopodobnie będą miały odległość większą niż twój limit, chociaż różnica nie byłaby znaczącym procentem twojego limitu.

[1 ] Google Maps używa routeboxer



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Instalowanie MongoDB na Raspberry Pi

  2. MongoDB - ogromna ilość wątków MongoCleaner

  3. Dokument aktualizacji Mongoose nie powiódł się z findByIdAndUpdate

  4. Lokalny SQLite a zdalna MongoDB

  5. Jak upuścić lub usunąć kolekcję w MongoDB?