Mysql
 sql >> Database >  >> RDS >> Mysql

Confronto delle coordinate nel database

Il modo migliore per gestire le ricerche di prossimità è iniziare con una sorta di approssimazione del rettangolo di delimitazione, quindi passare da lì a una distanza reale tra le persone di un grande cerchio.

Finché le tue latitudini non sono troppo vicine ai poli, un'approssimazione sciatta ma praticabile per la distanza tra due punti è questa (in SQLish):

GREATEST(ABS(lat1-lat2),ABS(long1-long2))

Se vuoi essere più preciso e sai che tieni solo alle persone che si trovano all'interno, diciamo, a 10 km l'uno dall'altro, puoi utilizzare una ricerca rettangolo di delimitazione come questa.

WHERE latitude_from_table
    BETWEEN latpoint  - (10.0 / 111.045)
        AND latpoint  + (10.0 / 111.045)
  AND longitude_from_table
    BETWEEN longpoint - (10.0 / (111.045 * COS(RADIANS(latpoint))))
        AND longpoint + (10.0 / (111.045 * COS(RADIANS(latpoint))))

Funziona perché ci sono 111.045 km in un grado di latitudine. I termini del coseno nei limiti di longitudine tengono conto del fatto che le linee di latitudine sono più vicine tra loro quando ci si avvicina ai poli. Ciò ti consente di sfruttare gli indici MySQL sulle colonne latitude_from_table e longitude_from_table.

Una volta ottenuta la prossimità del riquadro di delimitazione, è possibile applicare una formula per la distanza del cerchio massimo. Ecco il background su questo. http://www.plumislandmedia.net/mysql/harsine-mysql- loc-più vicino/

Per il tipo di applicazione che stai considerando, la virgola mobile IEEE-488 a 32 bit offre molta precisione per le tue coordinate. Se i punti che stai guardando sono molto vicini tra loro (meno di un km o giù di lì) vuoi usare la formula Vincenty (http://www.plumislandmedia.net/mysql/vicenty-great-circle-distance-formula/ ) piuttosto che la più comune cosiddetta formula haversine (http://www.plumislandmedia.net/mysql/stored-function-haversine-distance-computation/ ).

Se il numero di persone supera i 300.000, potresti prendere in considerazione l'utilizzo dello schema di indicizzazione geospaziale MySQL. Funziona solo con le tabelle MyISAM, ma è molto veloce nel fare ricerche nel rettangolo di delimitazione. Vedere qui. http://www.plumislandmedia.net/mysql/harsine-mysql- loc-più vicino/