2013-04-07 16 views
16

Jestem nowy w funkcjach geolokalizacji mongodb.Mongodb: Sprawdź, czy punkt znajduje się wewnątrz zapisanego wielokąta.

Zapisałem kilka wielokątów reprezentujących granice państw w bazie danych wraz z nazwą kraju. Teraz chciałbym sprawdzić, w jakim kraju znajduje się punkt. Na przykład, jeśli daję własną geolokalizację, chciałbym uzyskać kraj, w którym się znajduję.

Czy istnieje sposób, aby to zrobić z mongodb? Może z geoWithin?

Dziękuję

+0

Proszę zaznaczyć to odpowiedź: http://stackoverflow.com/questions/ 12095965/mongodb-how-can-i-check-if-a-point-is-included-in-a-polygon i http://stackoverflow.com/questions/10774427/how-to-find-ifa-a- punkt-istnieje-w-który-wielokąt. Wygląda na to, że oba są istotne i mają rozwiązanie. – brotherofken

+2

Potrzebuję tego samego. @brotherofken: pytanie jest dokładnie odwrotne: muszę przeszukać wielokąt (przechowywany na mongodb) zawierający punkt parametru. Nie mogę znaleźć żadnego przykładu w tym kierunku. –

+0

Muszę znaleźć, jeśli punkt znajduje się wewnątrz zamkniętego koła. Jakieś wskazówki, jak to osiągnąć? –

Odpowiedz

4

Tak, można użyć $geoWithin do kontroli, pod warunkiem zdefiniowania krajów jako wielokąty używając GeoJSON. W tym celu spróbuj this GitHub repo.

+1

Dziękuję za wielokąty, ale mam bardziej precyzyjny zestaw, nie pamiętam, skąd go mam. Czy sądzisz, że będę musiał powtórzyć te wszystkie wielokąty, aby znaleźć punkt, w którym monografia GeoWithin pomaga mi uniknąć tego rodzaju cofania? – SkinyMonkey

+0

$ geoWithin działa z jednym wielokątem. – Sim

+1

geoWithin zwraca wszystkie funkcje * wewnątrz * wieloboku. geoIntersects zwraca funkcję, która * przecina * z funkcją (w tym przypadku punkt). Dlatego w tym przypadku geoIntersects daje dokładnie to, czego potrzebujesz w jednym zapytaniu, podczas gdy musisz mieć uruchomiony GeoWithin z każdym wielokątem, który posiadasz. –

5

Do tego celu należy użyć $geoIntersects.

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

Tak, $ geoIntersects działa. Oto odnośnik: [MongoDB $ geoIntersects] (http://docs.mongodb.org/manual/reference/operator/query/geoIntersects/) – Adam

6

Musisz przechowywać dane o lokalizacji jak tego schematu:

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

a następnie wysłać $geoIntersects odpytuje

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

Jakiś powód, dla którego w tablicy istnieje tablica o współrzędnych? Co dla nas zrobi kolejny zestaw współrzędnych? np. [[[1,1], ...], [[2,2] ...]] –

+0

może jeden wielokąt może być umieszczony wewnątrz innego –

+0

Yup, dowiedziałem się jakiś czas temu, że następne elementy tablicy określają wielokąty, które "wycinają" zewnętrzną. https://developers.google.com/maps/documentation/javascript/examples/layer-data-simple –

Powiązane problemy