sql >> Databasteknik >  >> NoSQL >> MongoDB

Hitta punkter nära LineString i mongodb sorterade efter avstånd

Som du nämnde stöder Mongo för närvarande inget annat än Point . Har du stött på konceptet med en ruttboxare? 1 Det var väldigt populärt för några år sedan på Google Maps. Med tanke på linjen som du har ritat, hitta hållplatser som ligger inom dist(x) . Det gjordes genom att skapa en serie avgränsande rutor runt varje punkt på linjen och söka efter punkter som faller inom hinken.

Jag snubblade över din fråga efter att jag precis insett att Mongo bara fungerar med poäng, vilket är rimligt antar jag.

Jag har redan några alternativ för hur man gör det (de utökar vad @mnemosyn säger i kommentaren). Med datamängden som jag arbetar med är allt på klientsidan, så jag skulle kunna använda routeboxern, men jag skulle vilja implementera den på serversidan av prestandaskäl. Här är mina förslag:

  1. bryt LineString ner i sina individuella koordinatuppsättningar och fråga efter $near använd var och en av dessa, kombinera resultaten och extrahera en unik uppsättning. Det finns algoritmer där ute för att förenkla en komplex linje genom att minska antalet punkter, men en enkel är lätt att skriva.

  2. gör samma sak som ovan, men som en lagrad procedur/funktion. Jag har inte lekt med Mongos lagrade funktioner, och jag vet inte hur bra de fungerar med drivrutiner, men det här kan vara snabbare än det första alternativet ovan eftersom du inte behöver göra rundresor, och beroende på vilken maskin som din instans(er) av Mongo är värd, beräkningar kan vara snabbare med mikrosekunder.

  3. Implementera routeboxer-tillvägagångssättet på serversidan (har gjorts i PHP), och använd sedan någon av ovanstående 2 för att hitta hållplatser som är $within de resulterande begränsningsrutorna. För fan, eftersom routeboxer-metoden returnerar rektanglar, skulle det vara möjligt att slå samman alla dessa rektanglar till en polygon som täcker din rutt, och bara göra en $within på det. (Vad @mnemosyn föreslog).

  4. EDIT: Jag tänkte på det här men glömde bort det, men det kan vara möjligt att uppnå något av ovanstående med hjälp av aggregeringsramverket.

Det är något som jag kommer att arbeta med snart (förhoppningsvis), jag kommer att öppna källkod för mina resultat baserat på vilket jag slutar med.

EDIT: Jag måste dock nämna att 1 och 2 har felet att om du har 2 punkter på en linje som är säg 2 km från varandra, och du vill ha punkter som är inom 1,8 km från din linje, kommer du uppenbarligen att missa alla punkter mellan den delen av din linje. Lösningen är att injicera poäng på din linje när du förenklar den (jag vet, överträffar målet att minska poäng när du lägger till nya igen).

Felet med 3 är då att det inte alltid kommer att vara korrekt eftersom vissa punkter inom din polygon sannolikt har ett avstånd som är större än din gräns, även om skillnaden inte skulle vara en betydande procentandel av din gräns.

[1 ] google maps utils routeboxer



  1. Hur lägger man till schemametod i mongoose?

  2. MongoDB Capped Collection tar inte bort dokument

  3. Hur hittar man nscanned i mongoose?

  4. mongodb $matcha operation i $lookup för att jämföra objectId fungerar inte som förväntat