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

Temukan semua kode pos dalam jarak tertentu dari kode pos

Berikut adalah sesuatu yang saya tulis beberapa waktu lalu yang mungkin mengarahkan Anda ke arah yang benar.

Saat Anda meminta VB.Net, yang benar-benar Anda butuhkan adalah kueri yang melakukan "Lingkaran Hebat Jarak " perhitungan untuk menentukan jarak antara dua titik yang diidentifikasi oleh garis lintang dan garis bujur.

Jadi, buat asumsi berikut:

  1. Data kode pos Anda ada dalam satu tabel.
  2. Tabel tersebut memiliki atribut untuk lintang dan bujur yang merupakan perkiraan centroid dari kode pos

Anda dapat menggunakan kueri LINQ ke SQL yang menghasilkan kumpulan hasil yang diinginkan menggunakan sesuatu seperti ini

Const EARTH_RADIUS As Single = 3956.0883313286095
Dim radCvtFactor As Single = Math.PI / 180
Dim zipCodeRadius As Integer = <Your Radius Value>

Dim zipQry = From zc In db.ZipCodes 
             Where zc.Zip = "<Your Zip Code>" _
             Select zc.Latitude, 
                    zc.Longitude, 
                    ZipLatRads = RadCvtFactor * zc.Latitude, 
                    ZipLonRads = RadCvtFactor * zc.Longitude
Dim zipRslt = zipQry.SingleOrDefault()
If zipRslt IsNot Nothing Then
    Dim zcQry = From zc In db.ZipCodes _
                Where zc.Latitude >= (zipRslt.Latitude - 0.5) And zc.Latitude <= (zipRslt.Latitude + 0.5) _
                And zc.Longitude >= (zipRslt.Longitude - 0.5) And (zc.Longitude <= zipRslt.Longitude + 0.5) _
                And Math.Abs(EARTH_RADIUS * (2 * Math.Atan2(Math.Sqrt(Math.Pow(Math.Sin(((RadCvtFactor * zc.Latitude) - zipRslt.ZipLatRads) / 2), 2) + _
                Math.Cos(zipRslt.ZipLatRads) * Math.Cos(RadCvtFactor * zc.Latitude) * _
                Math.Pow(Math.Sin(((RadCvtFactor * zc.Longitude) - zipRslt.ZipLonRads) / 2), 2)), _
                Math.Sqrt(1 - Math.Pow(Math.Sin(((RadCvtFactor * zc.Latitude) - zipRslt.ZipLatRads) / 2), 2) + _
                Math.Cos(zipRslt.ZipLatRads) * Math.Cos(RadCvtFactor * zc.Latitude) * _
                Math.Pow(Math.Sin((RadCvtFactor * zc.Longitude) / 2), 2))))) <= zipCodeRadius _
                Select zc
End If

Kelihatannya rumit, karena memang begitu. Ada orang yang jauh lebih pintar di sini di SO yang dapat menjelaskan algoritme. Saya hanya menerapkan ini dari beberapa kode SQL yang saya temukan di internet - saya tidak ingat dari mana. Penelusuran Google akan membawa Anda ke sana.

Kueri pertama (zipQry) mengembalikan lat dan lon dari kode pos awal dalam derajat dan radian. Hasil ini kemudian digunakan untuk mengeksekusi kueri kedua.

Bagian pertama dari klausa WHERE dalam kueri kedua:

Where zc.Latitude >= (zipRslt.Latitude - 0.5) And zc.Latitude <= (zipRslt.Latitude + 0.5) _
And zc.Longitude >= (zipRslt.Longitude - 0.5) And (zc.Longitude <= zipRslt.Longitude + 0.5) _

Hanya mempersempit daftar kode pos yang akan diperiksa, membuat kueri berjalan lebih cepat. Ini menambahkan jumlah yang sewenang-wenang ke lat dan lon sehingga Anda tidak memeriksa semua kode pos di Ohio saat mencari radius di California. Sisanya adalah bagian dari algoritma Great Circle Distance yang disebutkan di atas.

Ini mungkin bisa dilakukan dalam satu permintaan untuk efisiensi yang lebih besar, tetapi saya membutuhkannya dengan cara ini pada saat itu, alasannya sekarang hilang dari saya.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Tidak dapat terhubung:Koneksi terputus ke server MySQL saat 'membaca paket komunikasi awal', kesalahan sistem:0

  2. Data MySQL INSERT tidak disimpan dalam db yang benar, hanya sementara?

  3. Ubah tanggal 41014 Excel menjadi tanggal aktual dalam PHP atau JavaScript

  4. masukkan beberapa bidang menggunakan loop foreach

  5. pilih kueri untuk data kategori dengan hubungan induk anak