Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Porównanie współrzędnych w bazie danych

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/



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. #1136 – Liczba kolumn nie odpowiada liczbie wartości w wierszu 1

  2. Czy można zdefiniować kolumnę sygnatury czasowej, która nie ma wartości null i nie ma wartości domyślnej ani specjalnego zachowania podczas aktualizacji?

  3. Do SHA512-zahaszuj hasło w bazie danych MySQL przez Pythona

  4. Konwersja instrukcji scalania do MYSQL przy użyciu duplikatu klucza

  5. Czy istnieje standardowa biblioteka puli połączeń mysql dla C?