sql >> Databáze >  >> RDS >> Mysql

Porovnání souřadnic v databázi

Nejlepší způsob, jak zacházet s prohledáváním blízkosti, je začít s nějakou aproximací ohraničujícího obdélníku a odtud přejít ke skutečné vzdálenosti mezi lidmi ve velkém kruhu.

Pokud vaše zeměpisné šířky nejsou příliš blízko pólů, nedbalá, ale funkční aproximace vzdálenosti mezi dvěma body je tato (v SQLish):

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

Pokud chcete být přesnější a víte, že vám záleží pouze na lidech, kteří jsou mezi sebou, řekněme, 10 km, můžete použít vyhledávání v ohraničujícím obdélníku, jako je tento.

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))))

Funguje to, protože v jednom stupni zeměpisné šířky je 111 045 km. Kosinové členy v hranicích zeměpisné délky odpovídají za skutečnost, že čáry zeměpisné šířky jsou blíže k sobě, když se přibližujete k pólům. To vám umožní využívat indexy MySQL ve sloupcích latitude_from_table a longitude_from_table.

Jakmile budete mít blízkost ohraničovacího rámečku, můžete použít vzorec vzdálenosti velkého kruhu. Tady je pozadí toho. http://www.plumislandmedia.net/mysql/haversine-mysql- nejbližší-loc/

Pro druh aplikace, o kterém uvažujete, je 32bitový IEEE-488 s pohyblivou řádovou čárkou dostatečně přesný pro vaše souřadnice. Pokud jsou body, na které se díváte, opravdu blízko u sebe (méně než km nebo tak), chcete použít vzorec Vincenty (http://www.plumislandmedia.net/mysql/vicenty-great-circle-distance-formula/ ) spíše než běžnější takzvaný vzorec haversine (http://www.plumislandmedia.net/mysql/stored-function-haversine-distance-computation/ ).

Pokud váš počet lidí přesáhne 300 000, možná budete chtít zvážit použití schématu geoprostorového indexování MySQL. Funguje pouze s tabulkami MyISAM, ale je to velmi rychle při vyhledávání ohraničujících obdélníků. Viz zde. http://www.plumislandmedia.net/mysql/haversine-mysql- nejbližší-loc/



  1. Provozování clusteru MariaDB Galera bez nástrojů pro orchestraci kontejnerů:Část první

  2. Přehled ukládání dotazů PostgreSQL do mezipaměti a vyrovnávání zátěže

  3. Jaká je nejlepší struktura databáze pro uchování vícejazyčných dat?

  4. Jak hledat konkrétní hodnotu ve všech tabulkách (PostgreSQL)?