MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

Trova i punti vicino a LineString in mongodb ordinati per distanza

Come hai detto, Mongo attualmente non supporta nient'altro che Point . Ti sei imbattuto nel concetto di pugile da strada? 1 Era molto popolare qualche anno fa su Google Maps. Data la linea che hai tracciato, trova le fermate che si trovano all'interno di dist(x) . È stato creato creando una serie di riquadri di delimitazione attorno a ciascun punto della linea e cercando i punti che rientrano nel bucket.

Mi sono imbattuto nella tua domanda dopo aver appena realizzato che Mongo funziona solo con i punti, il che è ragionevole suppongo.

Ho già alcune opzioni su come farlo (si espandono su ciò che @mnemosyn dice nel commento). Con il set di dati su cui sto lavorando, è tutto lato client, quindi potrei usare il routeboxer, ma vorrei implementarlo lato server per motivi di prestazioni. Ecco i miei suggerimenti:

  1. interrompi la LineString giù nei suoi insiemi di coordinate individuali e ricerca $near utilizzando ciascuno di questi, combina i risultati ed estrai un set unico. Esistono algoritmi per semplificare una linea complessa, riducendo il numero di punti, ma una semplice è facile da scrivere.

  2. fare come sopra, ma come una procedura/funzione memorizzata. Non ho giocato con le funzioni memorizzate di Mongo e non so quanto bene funzionino con i driver, ma questo potrebbe essere più veloce della prima opzione sopra in quanto non dovrai fare viaggi di andata e ritorno e a seconda della macchina che le tue istanze di Mongo sono ospitate, i calcoli potrebbero essere più veloci di microsecondi.

  3. Implementare l'approccio routeboxer lato server (è stato fatto in PHP), quindi utilizzare uno dei 2 precedenti per trovare le fermate che sono $within i riquadri di delimitazione risultanti. Diamine, dal momento che il metodo routeboxer restituisce rettangoli, sarebbe possibile unire tutti questi rettangoli in un poligono che copre il percorso e fare semplicemente un $within su quello. (Cosa ha suggerito @mnemosyn).

  4. MODIFICA: Ci ho pensato ma me ne sono dimenticato, ma potrebbe essere possibile ottenere alcuni dei risultati precedenti utilizzando il framework di aggregazione.

È qualcosa su cui lavorerò presto (si spera), renderò open source i miei risultati in base ai quali finirò per iniziare.

MODIFICA: Devo menzionare però che 1 e 2 hanno il difetto che se hai 2 punti in una linea che sono distanti 2 km e vuoi punti che si trovano entro 1,8 km dalla tua linea, ovviamente perderai tutti i punti tra quella parte della tua linea. La soluzione è iniettare punti sulla tua linea quando la semplifichi (lo so, supera l'obiettivo di ridurre i punti quando ne aggiungi di nuovi).

Il difetto con 3 quindi è che non sarà sempre accurato poiché è probabile che alcuni punti all'interno del tuo poligono abbiano una distanza maggiore del tuo limite, anche se la differenza non sarebbe una percentuale significativa del tuo limite.

[1 ] Google maps utils routeboxer