2013-04-07 12 views
16

Sono nuovo alle funzionalità di geolocalizzazione di mongodb.Mongodb: verifica se un punto si trova all'interno di un poligono memorizzato

Ho memorizzato alcuni poligoni che rappresentano i confini del paese in un database insieme al nome del paese. Ora quello che mi piacerebbe fare è controllare in quale paese si trova un punto. Ad esempio, se do la mia geolocalizzazione, vorrei ottenere il paese in cui sono.

C'è un modo per farlo con mongodb? Forse con geoWithin?

Grazie

+0

prega di consultare questo risponde: http://stackoverflow.com/questions/ 12095965/mongodb-how-can-i-check-if-a-point-is-contained-in-a-polygon e http://stackoverflow.com/questions/10774427/how-to-find-if-a- point-esiste-in-cui-poligono. Sembra che entrambi siano rilevanti e abbiano una soluzione. – brotherofken

+2

Ho bisogno dello stesso. @brotherofken: la domanda è esattamente inversa: ho bisogno di cercare quale poligono (memorizzato su mongodb) contiene un punto parametro. Non riesco a trovare alcun esempio in questa direzione. –

+0

Devo trovare se un punto si trova all'interno di un cerchio chiuso. Qualche vantaggio su come potrei conseguirlo? –

risposta

4

Sì, è possibile utilizzare $geoWithin per il controllo, a condizione che si definiscono i paesi come poligoni utilizzando GeoJSON. Per quello, prova this GitHub repo.

+1

Grazie per i poligoni ma ho ottenuto un set più preciso, non ricordo dove l'ho preso comunque. Pensi che dovrò iterare su tutti questi poligoni per trovare in quale punto è o mongodb geoWithin mi aiuta ad evitare questo tipo di backtracking? – SkinyMonkey

+0

$ geoWithin funziona con un singolo poligono. – Sim

+1

geoWithin restituisce tutte le funzioni * all'interno di * un poligono. geoIntersects restituisce la caratteristica che * si interseca * con una caratteristica (un punto, in questo caso). Pertanto, in questo caso, geoIntersects ti dà esattamente quello che vuoi in una query, mentre dovresti eseguire geoWithin con ogni poligono che hai. –

5

Devi usare $geoIntersects per quello.

db.features.find({mystoredpolygon:{$geoIntersects:{$geometry:{type:'Point', coordinates:[22,38]}}}}) 
+0

Sì, $ geoIntersects funziona. Ecco il link di riferimento: [MongoDB $ geoIntersects] (http://docs.mongodb.org/manual/reference/operator/query/geoIntersects/) – Adam

6

È necessario memorizzare i dati di localizzazione come questo schema:

{"loc": 
    {"coordinates":[ 
     [ 
     [1.0,1.0], 
     [1.0,10.0], 
     [10.0,10.0], 
     [10.0,1.0], 
     [1.0,1.0] 
     ] 
     ], 
    "type":"Polygon" 
    } 
} 

e quindi inviare $geoIntersects interroga

db.polygons.find({"loc":{"$geoIntersects":{"$geometry":{"type":"Point", "coordinates":[x, y]}}}} 
+0

Qualsiasi motivo per cui esiste una matrice all'interno di un array per le coordinate? Cosa aggiungerebbe un altro set di coordinate per noi? es. [[[1,1], ...], [[2,2] ...]] –

+0

forse un poligono può essere localizzato nell'altro –

+0

Yup, ho scoperto qualche tempo fa che i successivi elementi dell'array specificano poligoni che "ritagliano" quello esterno. https://developers.google.com/maps/documentation/javascript/examples/layer-data-simple –

Problemi correlati