MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Encontre pontos perto de LineString no mongodb ordenados por distância


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:

  1. quebrar a LineString 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.

  2. 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.

  3. 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).

  4. 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