sql >> Database >  >> NoSQL >> MongoDB

Zoek punten in de buurt van LineString in mongodb gesorteerd op afstand

Zoals je al zei, ondersteunt Mongo momenteel niets anders dan Point . Ben je het concept van een routebokser al tegengekomen? 1 Het was een paar jaar geleden erg populair op Google Maps. Gegeven de lijn die je hebt getekend, zoek je haltes binnen dist(x) . Dit werd gedaan door een reeks begrenzingsvakken rond elk punt in de lijn te maken en te zoeken naar punten die binnen de bucket vallen.

Ik kwam je vraag tegen nadat ik me net realiseerde dat Mongo alleen met punten werkt, wat redelijk is, neem ik aan.

Ik heb al een paar opties om het te doen (ze gaan verder op wat @mnemosyn in de opmerking zegt). Met de dataset waar ik aan werk, is het allemaal aan de clientzijde, dus ik zou de routeboxer kunnen gebruiken, maar ik zou het om prestatieredenen aan de serverzijde willen implementeren. Dit zijn mijn suggesties:

  1. breek de LineString in zijn individuele coördinatensets en zoek naar $near gebruik elk van deze, combineer resultaten en extraheer een unieke set. Er zijn algoritmen om een ​​complexe lijn te vereenvoudigen door het aantal punten te verminderen, maar een eenvoudige is gemakkelijk te schrijven.

  2. doe hetzelfde als hierboven, maar als een opgeslagen procedure/functie. Ik heb niet gespeeld met de opgeslagen functies van Mongo, en ik weet niet hoe goed ze werken met stuurprogramma's, maar dit zou sneller kunnen zijn dan de eerste optie hierboven, omdat je geen retourvluchten hoeft te doen, en afhankelijk van de machine die uw instantie(s) van Mongo wordt (worden) gehost, berekeningen kunnen microseconden sneller zijn.

  3. Implementeer de routeboxer-benadering server-side (is gedaan in PHP), en gebruik vervolgens een van de bovenstaande 2 om haltes te vinden die $within zijn de resulterende begrenzingsvakken. Heck, aangezien de routeboxer-methode rechthoeken retourneert, zou het mogelijk zijn om al deze rechthoeken samen te voegen tot één polygoon die uw route bedekt, en gewoon een $within te doen op dat. (Wat @mnemosyn suggereerde).

  4. BEWERKEN: Ik heb hieraan gedacht, maar was het vergeten, maar het is misschien mogelijk om een ​​deel van het bovenstaande te bereiken met behulp van het aggregatieraamwerk.

Het is iets waar ik binnenkort (hopelijk) aan ga werken, ik zal mijn resultaat(en) open source maken op basis waarvan ik uiteindelijk ga.

BEWERKEN: Ik moet echter vermelden dat 1 en 2 de fout hebben dat als je 2 punten in een lijn hebt die zeg 2 km uit elkaar liggen, en je wilt punten die binnen 1,8 km van je lijn liggen, je natuurlijk alle punten tussen dat deel mist van uw lijn. De oplossing is om punten op uw lijn te injecteren wanneer u deze vereenvoudigt (ik weet het, verslaat het doel om punten te verminderen bij het toevoegen van nieuwe).

De fout met 3 is dan dat het niet altijd nauwkeurig zal zijn, aangezien sommige punten binnen uw polygoon waarschijnlijk een grotere afstand hebben dan uw limiet, hoewel het verschil geen significant percentage van uw limiet zou zijn.

[1 ] google maps utils routeboxer



  1. Celery beat + redis met wachtwoord gooit Geen Auth-uitzondering

  2. Hoe start ik Mongo DB vanuit Windows?

  3. $geoNear (geaggregeerde pijplijn) retourneert niet de juiste documenten

  4. Mongoose-tekst zoeken met AND-operator