Mysql
 sql >> база данни >  >> RDS >> Mysql

Най-бързият начин за намиране на разстояние между две широчини/дълги точки

  • Създайте своите точки с помощта на Point стойности на Geometry типове данни в MyISAM маса. От Mysql 5.7.5, InnoDB таблиците вече поддържат и SPATIAL индекси.

  • Създайте SPATIAL индекс на тези точки

  • Използвайте MBRContains() за да намерите стойностите:

      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)
    

, или в MySQL 5.1 и по-горе:

    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
                    )

Това ще избере всички точки приблизително в рамките на полето (@lat +/- 10 km, @lon +/- 10km) .

Това всъщност не е кутия, а сферичен правоъгълник:сегмент от сферата, обвързан с географска ширина и дължина. Това може да се различава от обикновен правоъгълник на Земя на Франц Йосиф , но доста близо до него на повечето населени места.

  • Приложете допълнително филтриране, за да изберете всичко в кръга (не квадрата)

  • Възможно е да приложите допълнително фино филтриране, за да отчетете разстоянието на големия кръг (за големи разстояния)



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL подреждане по брой

  2. MySQL - АКТУАЛИЗИРАНЕ на няколко реда с различни стойности в една заявка

  3. MySQL избира бързо 10 произволни реда от 600K реда

  4. MySQL и JDBC с rewriteBatchedStatements=true

  5. Хибернация:Автоматично създаване/актуализиране на db таблиците въз основа на класове на обекти