Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Cara Tercepat untuk Menemukan Jarak Antara Dua Titik Lintang/Bujur

  • Buat poin Anda menggunakan Point nilai Geometry tipe data di MyISAM meja. Mulai Mysql 5.7.5, InnoDB tabel sekarang juga mendukung SPATIAL indeks.

  • Buat SPATIAL indeks pada titik-titik ini

  • Gunakan MBRContains() untuk menemukan nilai:

      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)
    

, atau, di MySQL 5.1 dan di atasnya:

    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
                    )

Ini akan memilih semua titik kira-kira di dalam kotak (@lat +/- 10 km, @lon +/- 10km) .

Ini sebenarnya bukan kotak, tetapi persegi panjang bulat:garis lintang dan garis bujur yang terikat segmen bola. Ini mungkin berbeda dari persegi panjang polos di Franz Joseph Land , tetapi cukup dekat dengannya di sebagian besar tempat berpenghuni.

  • Terapkan pemfilteran tambahan untuk memilih semua yang ada di dalam lingkaran (bukan persegi)

  • Mungkin menerapkan pemfilteran halus tambahan untuk memperhitungkan jarak lingkaran besar (untuk jarak yang jauh)



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Apa yang Harus Diperiksa jika Pemanfaatan Memori MySQL Tinggi?

  2. kueri pemilihan mysql dalam array serial

  3. Kesalahan membuat tabel:Anda memiliki kesalahan dalam sintaks SQL Anda di dekat 'order( order_id INT UNSIGNED NOT NULL AUTO_INCREMENT, user_id ' di baris 1

  4. Bagaimana saya bisa menonaktifkan sementara batasan kunci asing di MySQL?

  5. Temukan catatan dari satu tabel yang tidak ada di tabel lain