2015-07-31 15 views
5

Chcę zapisać widok geoprzestrzenny, który wyszukuje następujący dokument w promieniu jednej mili od podanej szerokości i długości geograficznej. Jak mam to zrobic?Wyszukiwanie dokumentów w określonym promieniu za pomocą Couchbase

{ 
    "agree_allowed":true, 
    "assigned_by":"", 
    "assigned_to":"", 
    "comments_allowed":true, 
    "location": { 
    "coordinates": [ 
     "-74.168868", 
     "40.854655" 
    ], 
    "type": "Point" 
    }, 
    "subscribed":{ 
     "user_cfd29b81f0263a380507":true, 
     "user_cfd29b81f0263a3805010":true 
    }, 
    "type":"report", 
    "user_id":"user_cfd29b81f0263a380507", 
    "username":"test17" 
} 
+1

Czy chcesz rozwiązać następujący problem: podać dwie pary współrzędnych (szerokości i długości geograficznej), obliczyć odległość?czy rozumiem cię źle – supinf

+0

Chcę napisać geoSpatialview, który zwraca raporty w odległości 1 mil od odległości – rash

+0

Aby uzyskać odniesienie zobacz dokumentację Pythona na temat korzystania z interfejsu API geoprzestrzennego: http://pythonhosted.org/couchbase/api/views.html # widoki geoprzestrzenne –

Odpowiedz

1

Zapoznaj się z dokumentacją geoprzestrzennych widoków w Couchbase: http://docs.couchbase.com/4.0/views/spatial-views.html

Jedno podejście można podjąć jest indeks wszystkich dokumentów z obwiedni 1 mil wokół ich lokalizacji.

Następnie należy wysłać zapytanie do tego widoku, w którym zakres_początkowy i zakres_ końcowy ma taki sam zakres, który byłby po prostu lokalizacją powyższego dokumentu. To by zwróciło ci wszystkie dokumenty, w których punkt mieści się w granicach 1 milowej ramki granicznej.

Możesz użyć GeoJSON do dokładniejszych obwiedni, niestety nie mają one krąg w Specyfikacjach, więc w zależności od stopnia zaawansowania ramki ograniczającej możesz uzyskać wyniki, które nie są dokładnie w odległości jednej mili od Twojej lokalizacja zapytania.

+0

Jak mogę indeksować dokumenty za pomocą ramki ograniczającej 1 milę wokół ich lokalizacji? – rash

3

ponieważ można używać tylko zapytania obwiedni z Couchbase widoków przestrzennych, trzeba będzie podzielić zapytanie na odległość do dwóch etapach:

  1. Zapytanie Couchbase dla współrzędnych, które mieszczą się w obrębie obwiedni, który pasuje do Twojego promień .
  2. Przefiltruj współrzędne zwracane przez # 1, które są większe niż określony promień.

Na pierwszym etapie, trzeba napisać widok przestrzenny, co następuje:

function(doc, meta) 
{ 
    if (doc.location) 
    emit(doc.location, [meta.id, doc.location]); 
} 

Uwaga: jest to Couchbase 3.0 wersja widzenia w Couchbase 4 nie robić musisz wyemitować meta.id i doc.location w wartości już.

Teraz, biorąc pod uwagę punkt wyjścia (szer) i promień r, trzeba obliczyć obwiednię [lat1, lon1, lat2, lon2] do kwerendy widoku na liście dokumenty, których współrzędne potencjalnie mieszczą się w pożądanym promieniu. Zapytanie o ramce ograniczającej w Couchbase określa współrzędne dolnego-lewego i górnego-prawego.

Następnie, we wniosku należy powtórzyć wszystkie wyniki i sprawdzić, czy rzeczywiście mieszczą się one w odległości R od punktu początkowego.

W zależności od wymaganej dokładności, możesz założyć, że Ziemia jest płaska i po prostu wykonać obliczenia na płaszczyźnie 2D, która będzie niedokładna, ale nie strasznie, na odległość 1 mila. Lub alternatywnie, używaj właściwie dokładnych wzorów do obliczenia wszystkiego, jak opisano w tym doskonałym artykule: http://janmatuschek.de/LatitudeLongitudeBoundingCoordinates

Albo jeszcze lepiej, możesz użyć biblioteki geolokalizacyjnej dla wybranego języka, aby obliczyć prostokąt ograniczający i odległości. Oto jeden dla C# i jeden dla Java.

+1

Zauważ, że kolejność określania ramek granicznych w Couchbase faktycznie 'lon, lat' nie' lat, lon'! –

+0

@ David: - Dzięki za wyjaśnienie, ale czy mogę uzyskać link, który objaśnia kod – rash

+0

, więc muszę napisać zapytanie, aby uzyskać wszystkie lat, lon z couchbase, a następnie napisać kod w pythonie, aby filtrować dla promienia, mam rację ? – rash

Powiązane problemy