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

Nejrychlejší způsob, jak najít vzdálenost mezi dvěma zeměpisnými/délkovými body

  • Vytvořte své body pomocí Point hodnoty Geometry datové typy v MyISAM stůl. Od Mysql 5.7.5, InnoDB tabulky nyní také podporují SPATIAL indexy.

  • Vytvořte SPATIAL index na těchto bodech

  • Použijte MBRContains() najít hodnoty:

      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)
    

nebo v MySQL 5.1 a výše:

    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
                    )

Tím vyberete všechny body přibližně v rámečku (@lat +/- 10 km, @lon +/- 10km) .

Toto ve skutečnosti není krabice, ale sférický obdélník:segment koule vázaný na zeměpisnou šířku a délku. Může se lišit od prostého obdélníku na Země Františka Josefa , ale na většině obydlených míst docela blízko.

  • Použijte další filtrování a vyberte vše uvnitř kruhu (ne čtverce)

  • Případně použijte další jemné filtrování pro zohlednění vzdálenosti velkého kruhu (pro velké vzdálenosti)



  1. Nerozlišují názvy funkcí v PostgreSQL velká a malá písmena?

  2. Část 2 – Jak uspořádat velký databázový diagram

  3. Automatické ladění Azure SQL Database

  4. Jak převést řetězec na datum v MySQL?