Както споменахте, Mongo в момента не поддържа нищо друго освен Point
. Срещали ли сте понятието боксьор на маршрут? 1 Беше много популярен преди няколко години в Google Maps. Предвид линията, която сте начертали, намерете спирки, които са в рамките на dist(x)
. Това беше направено чрез създаване на поредица от ограничаващи полета около всяка точка от линията и търсене на точки, които попадат в кофата.
Попаднах на въпроса ви, след като току-що разбрах, че Mongo работи само с точки, което предполагам, че е разумно.
Вече имам няколко опции как да го направя (те разширяват това, което @mnemosyn казва в коментара). С набора от данни, върху който работя, всичко е от страна на клиента, така че мога да използвам routeboxer, но бих искал да го внедря от страна на сървъра от съображения за производителност. Ето моите предложения:
-
прекъснете
LineString
надолу в неговите индивидуални координатни набори и потърсете$near
използвайки всеки от тях, комбинирайте резултатите и извлечете уникален набор. Съществуват алгоритми за опростяване на сложна линия чрез намаляване на броя на точките, но простият е лесен за писане. -
направете същото като по-горе, но като съхранена процедура/функция. Не съм си играл със съхранените функции на Mongo и не знам колко добре работят с драйвери, но това може да е по-бързо от първата опция по-горе, тъй като няма да се налага да правите обиколки и в зависимост от машината, която вашият екземпляр(и) на Mongo е(са) хостван(и), изчисленията могат да бъдат по-бързи с микросекунди.
-
Приложете подхода на routeboxer от страна на сървъра (направено е в PHP) и след това използвайте едно от горните 2, за да намерите спирки, които са
$within
получените ограничаващи кутии. По дяволите, тъй като методът routeboxer връща правоъгълници, би било възможно да обедините всички тези правоъгълници в един полигон, покриващ вашия маршрут, и просто да направите$within
на това. (Какво предложи @mnemosyn). -
РЕДАКТИРАНЕ: Мислех за това, но го забравих, но може да е възможно да се постигнат някои от горните с помощта на рамката за агрегиране.
Това е нещо, върху което скоро ще работя (надявам се), ще отворя резултата(ите) си, въз основа на които ще се спра.
РЕДАКТИРАНЕ: Трябва да спомена обаче, че 1 и 2 имат недостатъка, че ако имате 2 точки в линия, които са на разстояние да кажем 2 км една от друга, и искате точки, които са в рамките на 1,8 км от вашата линия, очевидно ще пропуснете всички точки между тази част от вашата линия. Решението е да инжектирате точки във вашата линия, когато я опростявате (знам, надхвърля целта за намаляване на точките, когато добавяте нови обратно).
Недостатъкът на 3 тогава е, че не винаги ще бъде точен, тъй като някои точки във вашия многоъгълник е вероятно да имат разстояние, по-голямо от вашето ограничение, въпреки че разликата няма да бъде значителен процент от вашето ограничение.
[1 ] google maps utils routeboxer