sql >> Databáze >  >> NoSQL >> MongoDB

Jak získat všechny kruhy, ve kterých je bod obsažen?

Je to možné pomocí MongoDB $geoIntersects Operátor geoprostorového dotazu.

Pokud tedy máte sbírku polygonů GeoJson a chcete zjistit všechny polygony, které se protínají s vaším daným bodem, musíte spustit následující:

db.places.find( { <locationFieldOfYourDocuments> :
                  { $geoIntersects :
                    { $geometry :
                      { type : "Point" ,
                        coordinates: [long, lat]
                } } } } )

Ve výše uvedeném příkazu loc je atribut každého dokumentu, který obsahuje souřadnice polygonu GeoJson. Také se ujistěte, že máte 2dsphere index nad <locationFieldOfYourDocuments> .

Nyní, abych vyřešil váš původní problém, použiji trochu javascriptu. Možná existují lepší řešení, ale ne podle mých znalostí.

Řekněme, že všechny vaše kruhy jsou uloženy v Circles sbírka. Dotázal bych se této kolekce a načetl každý kruh jeden po druhém a pak provedl průnik s jinou kolekcí, která by obsahovala jeden bod, který by byl ten, na který byste se chtěli zeptat, zda se protíná s kruhy nebo ne. Nechte tedy bod uložit do SinglePoint kolekce.

Skript by vypadal...

db.Intersections.remove({}); // emptying the output collection
var circleCursor = db.Circles.find();
while (circleCursor.hasNext()) {
    var circle = circleCursor.next();
    var coord = circle.location;
    var radiusInRadians = circle.radius * conversionFactorForRadius;
    var intersect = db.SinglePoint.find({loc :
                                         { $geoWithin :
                                           {$centerSphere : [coord], radiusInRadians}
                                         }});
    if (intersect.hasNext()) {db.Intersections.add(circle)} // this will add all intersecting circles to Intersections collection
}

Jediné, co musíte udělat, je uložit tento skript do souboru (myScript.js) a zavolat:

mongo DBName pathTomyScript.js

Tím uložíte všechny kružnice, které se protínají s vaším vstupním bodem, do kolekce Průsečíky. Všechny výše uvedené kolekce by měly být v databázi DBName.




  1. MongoDB dostupná připojení

  2. Oznámení Redis:Získejte klíč a hodnotu po vypršení platnosti

  3. Výplň v SQL

  4. Otázky týkající se Redis a Node.js a Socket.io