2015-07-31 12 views
5

Desidero scrivere una vista geospaziale che effettui ricerche per il seguente documento entro un raggio di un miglio da una data latitudine e longitudine. Come faccio a fare questo?Ricerca di documenti entro un determinato raggio con 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

Intendi risolvere il seguente problema: date due coppie di coordinate (latitudine, longitudine), calcola la distanza?o ho capito che hai torto – supinf

+0

voglio scrivere una geoSpatialview, che restituisce report entro 1miglia di distanza – rash

+0

Per riferimento, vedere la documentazione di Python sull'uso dell'API geospaziale: http://pythonhosted.org/couchbase/api/views.html # viste geospaziali –

risposta

1

Controllare il punto di vista GeoSpatial documentazione Couchbase: http://docs.couchbase.com/4.0/views/spatial-views.html

Un approccio che si potrebbe prendere è quello di indicizzare tutti i documenti con un rettangolo di 1 miglio intorno alla loro posizione.

Quindi si dovrebbe interrogare quella vista con start_range e end_range allo stesso intervallo, che sarebbe solo la posizione del documento sopra. Questo ti restituirebbe tutti i documenti in cui il punto rientra nella sua casella di delimitazione di 1 miglio.

È possibile utilizzare GeoJSON per riquadri di delimitazione più precisi, sfortunatamente non hanno un cerchio nelle Specifiche, quindi a seconda di quanto avanzato si è creato il riquadro di delimitazione, è possibile ottenere risultati che non si trovano esattamente a un miglio dal proprio posizione della query.

+0

Come posso indicizzare i documenti con un riquadro di delimitazione di 1 miglio intorno alla loro posizione? – rash

3

Poiché è possibile utilizzare solo le query di selezione-box con Couchbase viste spaziali, si dovrà dividere la query distanza in due fasi:

  1. Query Couchbase per le coordinate che rientrano in un riquadro che corrisponde al tuo raggio .
  2. Filtra le coordinate restituite dal n. 1 oltre il raggio specificato.

Per il primo passo, avrete bisogno di scrivere un vista spaziale come segue:

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

Nota: questa è la versione 3.0 Couchbase della vista, in Couchbase 4 non lo fai bisogno di emettere il meta.id e doc.location nel valore più.

Ora, dato un punto di partenza (lat, lon) e raggio r, è necessario calcolare un rettangolo di selezione [LAT1, lon1, Lat2, lon2] per interrogare la vista per un elenco di documenti le cui coordinate potenzialmente rientrano nel raggio desiderato. La query del riquadro di delimitazione in Couchbase specifica le coordinate in basso a sinistra e in alto a destra.

Successivamente, nella propria applicazione, scorrere tutti i risultati e verificare se si trovano effettivamente nella distanza R del punto di partenza.

A seconda della precisione necessaria, è possibile ipotizzare che la Terra sia piatta e fare i calcoli su un piano 2D, che sarà impreciso ma non terribilmente così per una distanza di 1 miglio. In alternativa, utilizzare le formule effettivamente accurate per calcolare tutto, come descritto in questo eccellente articolo: http://janmatuschek.de/LatitudeLongitudeBoundingCoordinates

O meglio ancora, è possibile utilizzare una libreria di geolocalizzazione per la lingua di propria scelta per calcolare il riquadro di delimitazione e le distanze. Ecco uno per C# e uno per Java.

+1

Si noti che l'ordine per specificare le caselle di delimitazione in Couchbase corrisponde a 'lon, lat' non' lat, lon'! –

+0

@David: - Grazie per la spiegazione, ma posso ottenere qualsiasi collegamento che spieghi con il codice – rash

+0

così devo scrivere query per ottenere tutto il lat, lon da couchbase e quindi scrivere un codice in python per filtrare per raggio, ho ragione ? – rash