2009-06-25 17 views
7

Nel mio DB, memorizzo un punto centrale, insieme a un raggio (in metri).Un rovescio della formula di Haversine per MySQL?

Sto cercando di passare in un lat/lng, e quindi i valori mysql che ho memorizzato creano un cerchio per dirmi se il mio punto in cui sono passato è all'interno di quella cerchia. C'è qualcosa che mi permetterebbe di fare questo, simile al forumla haversine (che presuppone che il mio punto fosse già nel db).

Haversine Formula: (3959 * Acos (cos (radianti (40)) * cos (radianti (lat)) * cos (radianti (long) - radianti (-110)) + sin (radianti (40)) * sin (radianti (long)))

db:

circleLatCenter, circleLngCenter, Raggio

passando> select id da foo dove lat, lng a (far funzionare cerchio: circleLat, circleLng, raggio)

risposta

2

Ho fatto ricerche geografiche simili calcolando il riquadro di delimitazione tramite una grande distanza di cerchio e interrogando il database per quello. Hai ancora bisogno di un altro passaggio nella tua applicazione per "arrotondare gli angoli" dal riquadro di delimitazione al cerchio.

Quindi, dato un database di punti, un punto di ricerca (X, Y) e una distanza D, trovare tutti i punti all'interno di D di (X, Y):

  1. Compute deltaX, che è il punto se hai spostato la distanza D lungo l'asse Y.
  2. DeltaY calcolato, che è il punto se si sposta la distanza D lungo l'asse X.
  3. calcolare la casella di delimitazione: (X-deltaX, Y-DeltaY), (X + deltaX, Y + DeltaY) del database
  4. Query di punti di utilizzare SQL operatore BETWEEN: SELECT * FROM tabella WHERE X tra X-deltaX E X + deltaX AND Y TRA Y-deltaY AND Y + deltaY
  5. Post-processare l'elenco di punti restituiti, calcolando la distanza effettiva del grande cerchio, per rimuovere i punti agli angoli del quadrato che non si trovano all'interno del cerchio della distanza.

Come scorciatoia, ho tipicamente calcolare gradi-per-miglio sia lat e lon (all'equatore, poiché il miglio gradi-per-è differente ai poli per lon), e derivano deltaX e deltaY come (D * gradi-lat-per-mile) o gradi-lon-per-mile. La differenza tra l'equatore e il polo non ha molta importanza, dal momento che sto già calcolando la distanza effettiva dopo la query SQL.

CRONACA - 0,167,469 mila a 0,014,564 mila gradi-lon-per-miglio, e 0,014,483 mila gradi-lat-per-miglio

+0

faccio lo stesso, (primo passo con un quadrato poi arrotondamento angolo con ipotenusa lunghezza) Ma avete trovato un modo migliore per farlo che da quando hai scritto questo post? –

-1

So che questo è un post da lungo tempo morto, ma, nel caso qualcuno lo capiti, non è necessario creare una "formula di reverse haversine". La formula di Haversine indica la distanza tra il punto a e il punto b. È necessaria la distanza tra il punto b e il punto a, per il calcolo.Questi sono lo stesso valore.

SELECT *, 
(3959 * acos(cos(radians(40)) * cos(radians(`circleLatCenter`)) * cos(radians(`circleLngCenter`) - radians(-110)) + sin(radians(40)) * sin(radians(`circleLngCenter`))) as `haversine` 
FROM `table` WHERE 1=1 
HAVING `haversine` < `Radius` 
+0

L'uso di "acos()" significa che non è un calcolo haversine, è la "legge sferica dei coseni". –

Problemi correlati