MongoDB
 sql >> база данни >  >> NoSQL >> MongoDB

Намерете точки близо до LineString в mongodb, сортирани по разстояние

Както споменахте, Mongo в момента не поддържа нищо друго освен Point . Срещали ли сте понятието боксьор на маршрут? 1 Беше много популярен преди няколко години в Google Maps. Предвид линията, която сте начертали, намерете спирки, които са в рамките на dist(x) . Това беше направено чрез създаване на поредица от ограничаващи полета около всяка точка от линията и търсене на точки, които попадат в кофата.

Попаднах на въпроса ви, след като току-що разбрах, че Mongo работи само с точки, което предполагам, че е разумно.

Вече имам няколко опции как да го направя (те разширяват това, което @mnemosyn казва в коментара). С набора от данни, върху който работя, всичко е от страна на клиента, така че мога да използвам routeboxer, но бих искал да го внедря от страна на сървъра от съображения за производителност. Ето моите предложения:

  1. прекъснете LineString надолу в неговите индивидуални координатни набори и потърсете $near използвайки всеки от тях, комбинирайте резултатите и извлечете уникален набор. Съществуват алгоритми за опростяване на сложна линия чрез намаляване на броя на точките, но простият е лесен за писане.

  2. направете същото като по-горе, но като съхранена процедура/функция. Не съм си играл със съхранените функции на Mongo и не знам колко добре работят с драйвери, но това може да е по-бързо от първата опция по-горе, тъй като няма да се налага да правите обиколки и в зависимост от машината, която вашият екземпляр(и) на Mongo е(са) хостван(и), изчисленията могат да бъдат по-бързи с микросекунди.

  3. Приложете подхода на routeboxer от страна на сървъра (направено е в PHP) и след това използвайте едно от горните 2, за да намерите спирки, които са $within получените ограничаващи кутии. По дяволите, тъй като методът routeboxer връща правоъгълници, би било възможно да обедините всички тези правоъгълници в един полигон, покриващ вашия маршрут, и просто да направите $within на това. (Какво предложи @mnemosyn).

  4. РЕДАКТИРАНЕ: Мислех за това, но го забравих, но може да е възможно да се постигнат някои от горните с помощта на рамката за агрегиране.

Това е нещо, върху което скоро ще работя (надявам се), ще отворя резултата(ите) си, въз основа на които ще се спра.

РЕДАКТИРАНЕ: Трябва да спомена обаче, че 1 и 2 имат недостатъка, че ако имате 2 точки в линия, които са на разстояние да кажем 2 км една от друга, и искате точки, които са в рамките на 1,8 км от вашата линия, очевидно ще пропуснете всички точки между тази част от вашата линия. Решението е да инжектирате точки във вашата линия, когато я опростявате (знам, надхвърля целта за намаляване на точките, когато добавяте нови обратно).

Недостатъкът на 3 тогава е, че не винаги ще бъде точен, тъй като някои точки във вашия многоъгълник е вероятно да имат разстояние, по-голямо от вашето ограничение, въпреки че разликата няма да бъде значителен процент от вашето ограничение.

[1 ] google maps utils routeboxer



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Запитване за масиви от вложени обекти

  2. Агрегирайте и актуализирайте MongoDB

  3. Грешка:документът за операция за актуализиране трябва да съдържа атомарни оператори, когато се изпълнява updateOne

  4. mongodb, реплики и грешка:{ $err :not master and slaveOk=false, code :13435 }

  5. Избутване на стойности в масив от база данни на mongodb през водна линия (sails js).