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