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

Il modo più veloce per trovare la distanza tra due punti Lat/Long

  • Crea i tuoi punti usando Point valori di Geometry tipi di dati in MyISAM tavolo. A partire da Mysql 5.7.5, InnoDB le tabelle ora supportano anche SPATIAL indici.

  • Crea un SPATIAL indice su questi punti

  • Usa MBRContains() per trovare i valori:

      SELECT  *
      FROM    table
      WHERE   MBRContains(LineFromText(CONCAT(
              '('
              , @lon + 10 / ( 111.1 / cos(RADIANS(@lat)))
              , ' '
              , @lat + 10 / 111.1
              , ','
              , @lon - 10 / ( 111.1 / cos(RADIANS(@lat)))
              , ' '
              , @lat - 10 / 111.1 
              , ')' )
              ,mypoint)
    

o, in MySQL 5.1 e oltre:

    SELECT  *
    FROM    table
    WHERE   MBRContains
                    (
                    LineString
                            (
                            Point (
                                    @lon + 10 / ( 111.1 / COS(RADIANS(@lat))),
                                    @lat + 10 / 111.1
                                  ),
                            Point (
                                    @lon - 10 / ( 111.1 / COS(RADIANS(@lat))),
                                    @lat - 10 / 111.1
                                  ) 
                            ),
                    mypoint
                    )

Questo selezionerà tutti i punti approssimativamente all'interno della casella (@lat +/- 10 km, @lon +/- 10km) .

Questa in realtà non è una scatola, ma un rettangolo sferico:segmento della sfera legato a latitudine e longitudine. Può differire da un rettangolo semplice nella Franz Joseph Land , ma abbastanza vicino ad esso nella maggior parte dei luoghi abitati.

  • Applica un filtro aggiuntivo per selezionare tutto all'interno del cerchio (non il quadrato)

  • Eventualmente applicare un ulteriore filtro fine per tenere conto della distanza del cerchio grande (per grandi distanze)