Najlepszym sposobem radzenia sobie z wyszukiwaniem bliskości jest rozpoczęcie od pewnego rodzaju przybliżenia prostokąta ograniczającego, a następnie przejście do rzeczywistej odległości wielkiego okręgu między ludźmi.
Dopóki twoje szerokości geograficzne nie są zbyt blisko biegunów, niechlujne, ale wykonalne przybliżenie odległości między dwoma punktami jest następujące (w SQLish):
GREATEST(ABS(lat1-lat2),ABS(long1-long2))
Jeśli chcesz być bardziej precyzyjny i wiesz, że zależy Ci tylko na ludziach, którzy znajdują się w odległości, powiedzmy, 10 km od siebie, możesz użyć wyszukiwania w prostokątach ograniczających, jak to.
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))))
To działa, ponieważ na jednym stopniu szerokości geograficznej jest 111,045 km. Cosinusy w granicach długości geograficznej wyjaśniają fakt, że linie szerokości geograficznej są bliżej siebie, gdy zbliżasz się do biegunów. Dzięki temu możesz wykorzystać indeksy MySQL w kolumnach latitude_from_table i longitude_from_table.
Po zbliżeniu się do ramki ograniczającej można zastosować wzór na odległość wielkiego okręgu. Oto tło. http://www.plumislandmedia.net/mysql/haversine-mysql- najbliższy-loc/
Dla rodzaju aplikacji, którą bierzesz pod uwagę, 32-bitowy zmiennoprzecinkowy IEEE-488 jest dużą precyzją dla twoich współrzędnych. Jeśli punkty, na które patrzysz, są bardzo blisko siebie (mniej niż kilometr), użyj wzoru Vincenty (http://www.plumislandmedia.net/mysql/vicenty-great-circle-distance-formula/ ) zamiast bardziej popularnej tak zwanej formuły haversine (http://www.plumislandmedia.net/mysql/stored-function-haversine-distance-computation/ ).
Jeśli Twoja liczba osób znacznie przekracza 300 000, możesz rozważyć użycie schematu indeksowania geoprzestrzennego MySQL. Działa tylko z tabelami MyISAM, ale jest bardzo szybki w wyszukiwaniu prostokątów ograniczających. Spójrz tutaj. http://www.plumislandmedia.net/mysql/haversine-mysql- najbliższy-loc/