Como você mencionou, o Mongo atualmente não suporta nada além de
Point
. Você já se deparou com o conceito de um boxer de rota? 1 Foi muito popular alguns anos atrás no Google Maps. Dada a linha que você desenhou, encontre paradas que estejam dentro de dist(x)
. Isso foi feito criando uma série de caixas delimitadoras em torno de cada ponto na linha e procurando por pontos que se enquadram no bucket. Me deparei com sua pergunta depois de perceber que o Mongo só funciona com pontos, o que é razoável, suponho.
Eu já tenho algumas opções de como fazer (eles expandem o que @mnemosyn diz no comentário). Com o conjunto de dados em que estou trabalhando, está tudo no lado do cliente, então eu poderia usar o routeboxer, mas gostaria de implementá-lo no lado do servidor por motivos de desempenho. Aqui estão minhas sugestões:
-
quebrar aLineString
para baixo em seus conjuntos de coordenadas individuais e consulte$near
usando cada um deles, combine resultados e extraia um conjunto único. Existem algoritmos para simplificar uma linha complexa, reduzindo o número de pontos, mas um simples é fácil de escrever.
-
faça o mesmo que acima, mas como um procedimento/função armazenado. Eu não brinquei com as funções armazenadas do Mongo e não sei o quão bem elas funcionam com drivers, mas isso pode ser mais rápido do que a primeira opção acima, pois você não precisará fazer ida e volta e, dependendo da máquina que suas instâncias do Mongo estão hospedadas, os cálculos podem ser mais rápidos em microssegundos.
-
Implemente a abordagem do routeboxer no lado do servidor (foi feito em PHP) e, em seguida, use um dos 2 acima para encontrar paradas que são$within
as caixas delimitadoras resultantes. Heck, como o método routeboxer retorna retângulos, seria possível mesclar todos esses retângulos em um polígono cobrindo sua rota e apenas fazer um$within
naquilo. (O que @mnemosyn sugeriu).
-
EDITAR: Eu pensei nisso, mas esqueci, mas pode ser possível alcançar alguns dos itens acima usando a estrutura de agregação.
É algo em que estarei trabalhando em breve (espero), abrirei meu(s) resultado(s) com base no que eu acabar seguindo.
EDITAR: Devo mencionar, porém, que 1 e 2 têm a falha de que, se você tiver 2 pontos em uma linha que estão separados por 2 km e quiser pontos que estejam a 1,8 km de sua linha, obviamente perderá todos os pontos entre essa parte de sua linha. A solução é injetar pontos em sua linha ao simplificá-la (eu sei, bate o objetivo de reduzir pontos ao adicionar novos de volta).
A falha com 3, então, é que nem sempre será preciso, pois alguns pontos dentro do seu polígono provavelmente terão uma distância maior que o seu limite, embora a diferença não seja uma porcentagem significativa do seu limite.
[1 ] google maps utils routeboxer