Analisis & UjianCRM dan Platform DataAlat Pemasaran

Kira atau Soal Jarak Bulatan Besar Antara Titik Latitud dan Longitud Menggunakan Formula Haversine (Contoh PHP, JavaScript, Java, Python, MySQL, MSSQL)

Bulan ini saya telah memprogramkan sedikit sebanyak PHP and MySQL berkenaan dengan GIS. Mengintai jaring, saya sebenarnya sukar mencari beberapa daripadanya Pengiraan geografi untuk mencari jarak antara dua lokasi jadi saya ingin berkongsi di sini.

Peta Penerbangan Eropah Dengan Jarak Lingkaran yang Hebat

Cara mudah untuk mengira jarak antara dua titik adalah dengan menggunakan formula Pythagoras untuk mengira hipotenus segitiga (A² + B² = C²). Ini dikenali sebagai Jarak Euclidean.

Itu permulaan yang menarik tetapi ia tidak digunakan untuk Geografi kerana jarak antara garisan latitud dan longitud tidak sama jarak. Apabila anda semakin hampir dengan khatulistiwa, garisan latitud semakin terpisah. Jika anda menggunakan persamaan triangulasi mudah, ia mungkin mengukur jarak dengan tepat di satu lokasi dan salah di lokasi lain, kerana kelengkungan Bumi.

Jarak Bulatan Hebat

Laluan yang menempuh jarak jauh mengelilingi Bumi dikenali sebagai Jarak Bulatan Besar. Iaitu… jarak terpendek antara dua titik pada sfera berbeza daripada titik pada peta rata. Gabungkan itu dengan fakta bahawa garis latitud dan longitud tidak sama jarak… dan anda mempunyai pengiraan yang sukar.

Berikut adalah penjelasan video yang hebat tentang bagaimana Great Circles berfungsi.

Formula Haversine

Jarak menggunakan kelengkungan Bumi digabungkan dalam formula Haversine, yang menggunakan trigonometri untuk membenarkan kelengkungan Bumi. Apabila anda mencari jarak antara 2 tempat di Bumi (semasa burung gagak terbang), garis lurus sebenarnya ialah lengkok.

Ini terpakai dalam penerbangan udara – pernahkah anda melihat peta sebenar penerbangan dan mendapati ia melengkung? Itu kerana terbang dalam gerbang antara dua titik adalah lebih pendek daripada terus ke lokasi.

PHP: Hitung Jarak Antara 2 Titik Lintang dan Bujur

Berikut ialah formula PHP untuk mengira jarak antara dua titik (bersama-sama dengan penukaran Batu lwn Kilometer) yang dibundarkan kepada dua tempat perpuluhan.

function getDistanceBetweenPointsNew($latitude1, $longitude1, $latitude2, $longitude2, $unit = 'miles') {
  $theta = $longitude1 - $longitude2; 
  $distance = (sin(deg2rad($latitude1)) * sin(deg2rad($latitude2))) + (cos(deg2rad($latitude1)) * cos(deg2rad($latitude2)) * cos(deg2rad($theta))); 
  $distance = acos($distance); 
  $distance = rad2deg($distance); 
  $distance = $distance * 60 * 1.1515; 
  switch($unit) { 
    case 'miles': 
      break; 
    case 'kilometers' : 
      $distance = $distance * 1.609344; 
  } 
  return (round($distance,2)); 
}

Pembolehubah tersebut ialah:

  • $Latitud1 – pembolehubah untuk latitud lokasi pertama anda.
  • $Longitude1 – pembolehubah untuk longitud lokasi pertama anda
  • $Latitud2 – pembolehubah untuk latitud lokasi kedua anda.
  • $Longitude2 – pembolehubah untuk longitud lokasi kedua anda.
  • $unit – makhluk lalai batu. Ini boleh dikemas kini atau diluluskan sebagai kilometer.

Java: Kira Jarak Antara 2 Titik Latitud dan Longitud

public static double getDistanceBetweenPointsNew(double latitude1, double longitude1, double latitude2, double longitude2, String unit) {
    double theta = longitude1 - longitude2;
    double distance = 60 * 1.1515 * (180/Math.PI) * Math.acos(
        Math.sin(latitude1 * (Math.PI/180)) * Math.sin(latitude2 * (Math.PI/180)) + 
        Math.cos(latitude1 * (Math.PI/180)) * Math.cos(latitude2 * (Math.PI/180)) * Math.cos(theta * (Math.PI/180))
    );
    if (unit.equals("miles")) {
        return Math.round(distance, 2);
    } else if (unit.equals("kilometers")) {
        return Math.round(distance * 1.609344, 2);
    } else {
        return 0;
    }
}

Pembolehubah tersebut ialah:

  • garis lintang1 – pembolehubah untuk latitud lokasi pertama anda.
  • longitud1 – pembolehubah untuk longitud lokasi pertama anda
  • garis lintang2 – pembolehubah untuk latitud lokasi kedua anda.
  • longitud2 – pembolehubah untuk longitud lokasi kedua anda.
  • unit – makhluk lalai batu. Ini boleh dikemas kini atau diluluskan sebagai kilometer.

Javascript: Kira Jarak Antara 2 Titik Latitud dan Longitud

function getDistanceBetweenPoints(latitude1, longitude1, latitude2, longitude2, unit = 'miles') {
    let theta = longitude1 - longitude2;
    let distance = 60 * 1.1515 * (180/Math.PI) * Math.acos(
        Math.sin(latitude1 * (Math.PI/180)) * Math.sin(latitude2 * (Math.PI/180)) + 
        Math.cos(latitude1 * (Math.PI/180)) * Math.cos(latitude2 * (Math.PI/180)) * Math.cos(theta * (Math.PI/180))
    );
    if (unit == 'miles') {
        return Math.round(distance, 2);
    } else if (unit == 'kilometers') {
        return Math.round(distance * 1.609344, 2);
    }
}

Pembolehubah tersebut ialah:

  • garis lintang1 – pembolehubah untuk latitud lokasi pertama anda.
  • longitud1 – pembolehubah untuk longitud lokasi pertama anda
  • garis lintang2 – pembolehubah untuk latitud lokasi kedua anda.
  • longitud2 – pembolehubah untuk longitud lokasi kedua anda.
  • unit – makhluk lalai batu. Ini boleh dikemas kini atau diluluskan sebagai kilometer.

Python: Kira Jarak Antara 2 Titik Latitud dan Longitud

Bagaimanapun, berikut ialah formula Python untuk mengira jarak antara dua titik (bersama-sama dengan penukaran Batu lwn Kilometer) yang dibundarkan kepada dua tempat perpuluhan. Kredit kepada anak saya, Bill Karr yang merupakan seorang Saintis Data OpenINSIGHTS, untuk kod.

from numpy import sin, cos, arccos, pi, round

def rad2deg(radians):
    degrees = radians * 180 / pi
    return degrees

def deg2rad(degrees):
    radians = degrees * pi / 180
    return radians

def getDistanceBetweenPointsNew(latitude1, longitude1, latitude2, longitude2, unit = 'miles'):
    
    theta = longitude1 - longitude2
    
    distance = 60 * 1.1515 * rad2deg(
        arccos(
            (sin(deg2rad(latitude1)) * sin(deg2rad(latitude2))) + 
            (cos(deg2rad(latitude1)) * cos(deg2rad(latitude2)) * cos(deg2rad(theta)))
        )
    )
    
    if unit == 'miles':
        return round(distance, 2)
    if unit == 'kilometers':
        return round(distance * 1.609344, 2)

Pembolehubah tersebut ialah:

  • garis lintang1 – pembolehubah untuk lokasi pertama anda latitud.
  • longitud1 – pembolehubah untuk lokasi pertama anda longitud
  • garis lintang2 – pembolehubah untuk lokasi kedua anda latitud.
  • longitud2 – pembolehubah untuk lokasi kedua anda longitud.
  • unit – makhluk lalai batu. Ini boleh dikemas kini atau diluluskan sebagai kilometer.

MySQL: Mendapatkan Semua Rekod Dalam Julat Dengan Mengira Jarak Dalam Batu Menggunakan Latitud dan Longitud

Anda juga boleh menggunakan SQL untuk mengira semua rekod dalam jarak tertentu. Dalam contoh ini, saya akan menanyakan MyTable dalam MySQL untuk mencari semua rekod yang kurang daripada atau sama dengan pembolehubah $distance (dalam Batu) ke lokasi saya di $latitud dan $longitude:

Pertanyaan untuk mengambil semua rekod dalam spesifik jarak dengan mengira jarak dalam batu antara dua titik garis lintang dan garis bujur adalah:

$query = "SELECT *, (((acos(sin((".$latitude."*pi()/180)) * sin((`latitude`*pi()/180)) + cos((".$latitude."*pi()/180)) * cos((`latitude`*pi()/180)) * cos(((".$longitude."- `longitude`)*pi()/180)))) * 180/pi()) * 60 * 1.1515) as distance FROM `table` WHERE distance <= ".$distance."

Anda perlu menyesuaikannya:

  • $ bujur - ini adalah pemboleh ubah PHP di mana saya melewati garis bujur titik.
  • $ lintang - ini adalah pemboleh ubah PHP di mana saya melewati garis bujur titik.
  • $ jarak - ini adalah jarak yang anda mahu cari semua rekod kurang atau sama.
  • meja - ini adalah jadual ... anda pasti mahu menggantinya dengan nama jadual anda.
  • latitud - ini adalah medan lintang anda.
  • longitud - ini adalah bidang bujur anda.

MySQL: Mendapatkan Semua Rekod Dalam Julat Dengan Mengira Jarak Dalam Kilometer Menggunakan Latitud dan Longitud

Dan inilah pertanyaan SQL menggunakan kilometer di MySQL:

$query = "SELECT *, (((acos(sin((".$latitude."*pi()/180)) * sin((`latitude`*pi()/180)) + cos((".$latitude."*pi()/180)) * cos((`latitude`*pi()/180)) * cos(((".$longitude."- `longitude`) * pi()/180)))) * 180/pi()) * 60 * 1.1515 * 1.609344) as distance FROM `table` WHERE distance <= ".$distance."

Anda perlu menyesuaikannya:

  • $ bujur - ini adalah pemboleh ubah PHP di mana saya melewati garis bujur titik.
  • $ lintang - ini adalah pemboleh ubah PHP di mana saya melewati garis bujur titik.
  • $ jarak - ini adalah jarak yang anda mahu cari semua rekod kurang atau sama.
  • meja - ini adalah jadual ... anda pasti mahu menggantinya dengan nama jadual anda.
  • latitud - ini adalah medan lintang anda.
  • longitud - ini adalah bidang bujur anda.

Saya menggunakan kod ini dalam platform pemetaan perusahaan yang kami gunakan untuk sebuah kedai runcit dengan lebih dari 1,000 lokasi di seluruh Amerika Utara dan ia berfungsi dengan baik.

Jarak Geografi Pelayan Microsoft SQL: STDistance

Jika anda menggunakan Microsoft SQL Server, mereka menawarkan fungsi mereka sendiri, STJarak untuk mengira jarak antara dua titik menggunakan jenis data Geografi.

DECLARE @g geography;  
DECLARE @h geography;  
SET @g = geography::STGeomFromText('LINESTRING(-122.360 47.656, -122.343 47.656)', 4326);  
SET @h = geography::STGeomFromText('POINT(-122.34900 47.65100)', 4326);  
SELECT @g.STDistance(@h);  

Tip untuk Manash Sahoo, VP dan Arkitek Highbridge.

Douglas Karr

Douglas Karr adalah pengasas Martech Zone dan pakar yang diiktiraf dalam transformasi digital. Douglas telah membantu memulakan beberapa permulaan MarTech yang berjaya, telah membantu dalam usaha wajar lebih $5 bilion dalam pemerolehan dan pelaburan Martech, dan terus melancarkan platform dan perkhidmatannya sendiri. Beliau adalah pengasas bersama Highbridge, firma perunding transformasi digital. Douglas juga merupakan pengarang buku panduan Dummie dan buku kepimpinan perniagaan yang diterbitkan.

Artikel yang berkaitan

78 Komen

  1. Terima kasih banyak atas perkongsian. Ini adalah kerja salin dan tampal yang mudah dan berfungsi dengan baik. Anda telah menyelamatkan saya banyak masa.
    FYI untuk sesiapa yang mengangkut ke C:
    double deg2rad (deg ganda) {return deg * (3.14159265358979323846 / 180.0); }

  2. Pengeposan yang sangat bagus - berfungsi dengan sangat baik - Saya hanya perlu menukar nama meja yang memegang panjang. Ia berfungsi dengan cepat untuk .. Saya mempunyai sebilangan kecil lat-panjang (<400) tetapi saya rasa ini akan bertambah baik. Laman web yang bagus juga - saya baru sahaja menambahkannya ke akaun del.icio.us saya dan akan memeriksa semula secara berkala.

  3. Saya mencari pengiraan jarak sepanjang hari dan menemui algoritma harversine, terima kasih kepada anda kerana memberikan contoh bagaimana memasukkannya ke dalam pernyataan sql. Terima kasih dan salam, Daniel

    1. Gembira dapat membantu, kawan!

      Sekarang saya sedang mencari fungsi PHP 'in Polygon' yang akan mengambil susunan koordinat garis lintang dan garis bujur yang diuraikan dan mengetahui sama ada titik lain berada di dalam atau di luar poligon.

  4. saya rasa SQL anda memerlukan pernyataan yang baik.
    dan bukannya di mana jarak <= $ jarak yang mungkin anda perlukan
    gunakan jarak MEMILIKI <= $ jarak

    jika tidak, terima kasih kerana menjimatkan banyak masa dan tenaga.

  5. Terima kasih banyak kerana berkongsi kod ini. Ia menjimatkan banyak masa pembangunan saya. Juga, terima kasih kepada pembaca anda kerana menunjukkan bahawa kenyataan HAVING diperlukan untuk MySQL 5.x. Sangat membantu.

  6. Hello,

    Soalan lain. Adakah terdapat formula untuk rentetan NMEA seperti di bawah?

    1342.7500, N, 10052.2287, E

    $GPRMC,032731.000,A,1342.7500,N,10052.2287,E,0.40,106.01,101106,,*0B

    Terima kasih,
    Harry

  7. Saya juga mendapati bahawa WHERE tidak berfungsi untuk saya. Menukarnya kepada HAVING dan semuanya berfungsi dengan sempurna. Pada mulanya saya tidak membaca komen dan menulis semula menggunakan pilihan bersarang. Kedua-duanya akan berfungsi dengan baik.

  8. Sangat membantu, terima kasih banyak! Saya menghadapi beberapa masalah dengan "MEMILIKI" yang baru, bukannya "DI MANA", tetapi setelah saya membaca komen di sini (setelah kira-kira setengah jam mengetap gigi dengan kecewa = P), saya membuatnya berfungsi dengan baik. Terima kasih ^ _ ^

  9. Perlu diingat bahawa pernyataan terpilih seperti itu akan menjadi sangat komputasi dan oleh itu lambat. Sekiranya anda mempunyai banyak pertanyaan, pertanyaan itu dapat diselesaikan dengan cepat.

    Pendekatan yang kurang sengit adalah dengan menjalankan pilihan pertama (mentah) menggunakan kawasan SQUARE yang ditakrifkan oleh jarak yang dikira iaitu "pilih * daripada nama jadual di mana latitud antara lat1 dan lat2 dan longitud antara lon1 dan lon2". lat1 = targetlatitud – latdiff, lat2 = targetlatitud + latdiff, serupa dengan lon. latdiff ~= jarak / 111 (untuk km), atau jarak/69 untuk batu kerana 1 darjah latitud ialah ~ 111 km (perubahan sedikit kerana bumi bujur sedikit, tetapi mencukupi untuk tujuan ini). londiff = jarak / (abs(cos(deg2rad(latitud))*111)) — atau 69 untuk batu (anda sebenarnya boleh mengambil petak yang lebih besar sedikit untuk mengambil kira variasi). Kemudian ambil keputusan itu dan masukkan ke dalam pilihan jejari. Cuma jangan lupa untuk mengambil kira koordinat luar sempadan – iaitu julat longitud yang boleh diterima ialah -180 hingga +180 dan julat latitud yang boleh diterima ialah -90 hingga +90 — sekiranya latdiff atau londiff anda berjalan di luar julat ini . Ambil perhatian bahawa dalam kebanyakan kes ini mungkin tidak terpakai kerana ia hanya mempengaruhi pengiraan sepanjang garis melalui lautan pasifik dari kutub ke kutub, walaupun ia bersilang sebahagian daripada chukotka dan sebahagian alaska.

    Yang kami capai dengan ini adalah pengurangan yang ketara dalam jumlah mata yang anda buat untuk membuat pengiraan ini. Sekiranya anda mempunyai sejuta mata global dalam pangkalan data yang diedarkan secara merata dan anda ingin mencari dalam jarak 100 km, maka carian pertama (cepat) anda adalah seluas 10000 km persegi dan mungkin akan menghasilkan sekitar 20 hasil (berdasarkan pemerataan genap luas permukaan kira-kira 500M km persegi), yang bermaksud bahawa anda menjalankan pengiraan jarak kompleks 20 kali untuk pertanyaan ini dan bukannya sejuta kali.

      1. Nasihat yang hebat! Saya sebenarnya bekerja dengan pembangun yang menulis fungsi yang menarik segi empat sama dalam dan kemudian fungsi rekursif yang membuat 'petak' di sekeliling perimeter untuk memasukkan dan mengecualikan mata yang tinggal. Hasilnya adalah keputusan yang sangat pantas - dia boleh menilai berjuta-juta mata dalam mikrosaat.

        Pendekatan saya di atas pastinya 'kasar' tetapi mampu. Terima kasih sekali lagi!

        1. doug,

          Saya telah cuba menggunakan mysql dan php untuk menilai sama ada titik lat long berada dalam poligon. Adakah anda tahu jika rakan pembangun anda menerbitkan sebarang contoh tentang cara untuk menyelesaikan tugas ini. Atau adakah anda tahu mana-mana contoh yang baik. Terima kasih terlebih dahulu.

  10. Hai semua ini adalah pernyataan SQL ujian saya:

    SELECT DISTINCT area_id, (
    (
    (
    acos( sin( ( 13.65 * pi( ) /180 ) ) * sin( (
    `lat_dec` * pi( ) /180 ) ) + cos( ( 13.65 * pi( ) /180 ) ) * cos( (
    `lat_dec` * pi( ) /180 )
    ) * cos( (
    ( 51.02 - `lon_dec` ) * pi( ) /180 )
    )
    )
    ) *180 / pi( )
    ) *60 * 1.1515 * 1.609344
    ) AS distance
    FROM `post_codes` WHERE distance <= 50

    dan Mysql memberitahu saya bahawa jarak, tidak ada sebagai lajur, saya boleh menggunakan pesanan dengan, saya dapat melakukannya tanpa DI MANA, dan ia berfungsi, tetapi tidak dengannya ...

  11. Ini bagus, namun seperti burung terbang. Adalah baik untuk mencuba dan memasukkan API peta google untuk ini (mungkin menggunakan jalan dll) Hanya untuk memberi idea menggunakan bentuk pengangkutan yang berbeza. Saya masih belum membuat fungsi penyepuhlindapan simulasi dalam PHP yang dapat menawarkan penyelesaian yang berkesan untuk masalah jurujual perjalanan. Tetapi saya berpendapat bahawa saya mungkin dapat menggunakan semula beberapa kod anda untuk melakukannya.

  12. Artikel yang bagus! Saya menemui banyak artikel yang menerangkan cara mengira jarak antara dua titik tetapi saya benar-benar mencari coretan SQL.

  13. 2 hari penyelidikan akhirnya dapat mencari halaman ini yang menyelesaikan masalah saya. Nampaknya saya lebih baik membuang WolframAlpha saya dan mengemas kini matematik saya. Perubahan dari WHERE to HAVING mempunyai skrip saya dalam keadaan berfungsi. TERIMA KASIH

    1. Terima kasih Georgi. Saya terus mendapat tiang 'jarak' yang tidak dijumpai. Setelah saya menukar DI MANA untuk MEMILIKI ia berfungsi seperti daya tarikan!

  14. Saya harap ini adalah halaman pertama yang saya dapati. Setelah mencuba pelbagai arahan, ini adalah satu-satunya yang dapat berfungsi dengan baik, dan dengan sedikit perubahan diperlukan untuk memenuhi pangkalan data saya sendiri.
    Thanks a lot!

  15. Saya harap ini adalah halaman pertama yang saya dapati. Setelah mencuba pelbagai arahan, ini adalah satu-satunya yang dapat berfungsi dengan baik, dan dengan sedikit perubahan diperlukan untuk memenuhi pangkalan data saya sendiri.
    Thanks a lot!

  16. Douglas, terima kasih untuk kod yang luar biasa ini. Telah memusingkan badan saya untuk melakukan ini di portal komuniti GPS saya. Anda telah menyelamatkan saya berjam-jam.

  17. terima kasih kerana menyiarkan artikel bermanfaat ini,  
    tapi atas sebab tertentu saya ingin bertanya
    bagaimana untuk mendapatkan jarak antara koord dalam ds mysql dan kord yang dimasukkan ke php oleh pengguna?
    untuk menerangkan dengan lebih jelas:
    1. pengguna harus memasukkan [id] untuk memilih data yang ditentukan dari db dan kord pengguna itu sendiri
    2. fail php mendapatkan data sasaran (koordinat) menggunakan [id] dan kemudian mengira jarak antara pengguna dan titik sasaran

    atau hanya dapat jarak dari kod di bawah?

    $ qry = “SELECT *, (((acos (sin ((“. $ latitude. ”* pi () / 180)) * sin ((` Latitude` * pi () / 180)) + cos ((“. $ latitud. "* pi () / 180)) * cos ((` Latitude` * pi () / 180)) * cos (((". $ bujur." - "Bujur") * pi () / 180) )) * 180 / pi ()) * 60 * 1.1515 * 1.609344) sebagai jarak DARI `MyTable` DI MANA jarak> =". $ Jarak. " >>>> bolehkah saya "mengambil" jarak dari sini?
    terima kasih sekali lagi,
    Timmy S

    1. tidak mengapa, saya telah memikirkan bagaimana "fungsi" berfungsi di php
      $ dis = getDistanceBetweenPointsNew ($ userLati, $ userLongi, $ lati, $ longi, $ unit = 'Km')
      terima kasih banyak-banyak!! 

  18. ok, semua yang saya cuba tidak berjaya. Maksud saya, apa yang saya ada berjaya, tetapi jaraknya jauh.

    Mungkinkah ada yang melihat apa yang salah dengan kod ini?

    if (isset ($ _ POST ['diserahkan'])) {$ z = $ _POST ['zipcode']; $ r = $ _POST ['radius']; gema "Hasil untuk". $ z; $ sql = mysql_query (“SELECT DISTINCT m.zipcode, m.MktName, m.LocAddSt, m.LocAddCity, m.LocAddState, m.x1, m.y1, m.verified, z1.lat, z2.lon, z1. bandar, z1. negara DARI mrk m, zip z1, zip z2 DI MANA m.zipcode = z1.zipcode AND z2.zipcode = $ z AND (3963 * acos (truncate (sin (z2.lat / 57.2958) * sin (m. y1 / 57.2958) + cos (z2.lat / 57.2958) * cos (m.y1 / 57.2958) * cos (m.x1 / 57.2958 - z2.lon / 57.2958), 8))) <= $ r ") atau mati (mysql_error ()); manakala ($ baris = mysql_fetch_array ($ sql)) {$ store1 = $ baris ['MktName']. ""; $ store = $ baris ['LocAddSt']. ””; $ store. = $ baris ['LocAddCity']. ",". $ baris ['LocAddState']. " $. Baris ['zipcode']; $ latitude1 = $ baris ['lat']; $ longitud1 = $ baris ['lon']; $ latitud2 = $ baris ['y1']; $ longitud2 = $ baris ['x1']; $ bandar = $ baris ['bandar']; $ state = $ baris ['state']; $ dis = getnew ($ latitude1, $ longitude1, $ latitude2, $ longitude2, $ unit = 'Mi'); // $ dis = jarak ($ ​​lat1, $ lon1, $ lat2, $ lon2); $ disahkan = $ baris ['disahkan']; jika ($ disahkan == '1') {echo “”; gema "". $ kedai. ""; gema $ dis. "Batu jauhnya"; gema ""; } lain {echo "". $ store. ""; gema $ dis. "Batu jauhnya"; gema ""; }}}

    kod fungsi saya.php
    fungsi getnew ($ latitude1, $ longitude1, $ latitude2, $ longitude2, $ unit = 'Mi') {$ theta = $ longitude1 - $ longitude2; $ jarak = (sin (deg2rad ($ latitude1)) * sin (deg2rad ($ latitude2))) + (cos (deg2rad ($ latitude1)) * cos (deg2rad ($ latitude2)) * cos (deg2rad ($ theta)) ); $ jarak = acos ($ jarak); $ jarak = rad2deg ($ jarak); $ jarak = $ jarak * 60 * 1.1515; tukar (unit $) {case 'Mi': break; kes 'Km': $ jarak = $ jarak * 1.609344; } kembali (pusingan ($ jarak, 2)); }

    Terima kasih terlebih dahulu

  19. Hai Douglas, artikel hebat. Saya dapati penjelasan anda mengenai konsep geografi dan kodnya sangat menarik. Satu-satunya cadangan saya ialah memberi ruang dan memasukkan kod untuk paparan (seperti Stackoverflow, misalnya). Saya faham bahawa anda ingin menjimatkan ruang, tetapi jarak / lekukan kod konvensional akan menjadikan saya lebih mudah, sebagai pengaturcara, membaca dan membedah. Bagaimanapun, itu perkara kecil. Teruskan usaha yang hebat.

  20. nampaknya lebih pantas (mysql 5.9) untuk menggunakan formula dua kali dalam pilih dan di mana:
    $ formula = “(((acos (sin ((“. $ latitude. ”* pi () / 180)) * sin ((` Latitude` * pi () / 180)) + cos ((". $ latitude. "* Pi () / 180)) * cos ((` Latitude` * pi () / 180)) * cos (((". $ Bujur." - "Bujur") * pi () / 180)))) * 180 / pi ()) * 60 * 1.1515 * 1.609344) ”;
    $ sql = 'SELECT *,'. $ formula. ' sebagai jarak DARI jadual DI MANA '.. formula $.' <= '. $ jarak;

  21. Terima kasih banyak untuk memotong artikel ini. Sangat membantu.
    PHP pada mulanya diciptakan sebagai platform skrip sederhana yang disebut "Personal Home Page". Kini PHP (kependekan dari Hypertext Preprocessor) adalah alternatif teknologi Microsoft Active Server Pages (ASP).

    PHP adalah bahasa sisi pelayan sumber terbuka yang digunakan untuk membuat laman web yang dinamik. Ia boleh dimasukkan ke dalam HTML. PHP biasanya digunakan bersama dengan pangkalan data MySQL pada pelayan web Linux / UNIX. Ia mungkin merupakan bahasa tulisan yang paling popular.

  22. Saya dapati penyelesaian di atas tidak berfungsi dengan baik.
    Saya perlu menukar kepada:

    $ qqq = "SELECT *, (((acos (sin ((". $ latitude. "* pi () / 180)) * sin ((` latt` * pi () / 180)) + cos ((". $ lintang. "* pi () / 180)) * cos ((` latt` * pi () / 180)) * cos (((". $ bujur." - `longt`) * pi () / 180) )) * 180 / pi ()) * 60 * 1.1515) sebagai jarak DARI `register`“;

  23. terima kasih tuan bekerja dengan sempurna.. tetapi saya mempunyai satu soalan jika saya ingin mengeluarkan tanpa titik perpuluhan maka apa yang boleh saya lakukan..?

    Terima kasih terlebih dahulu.

  24. Halo, tolong saya sangat memerlukan bantuan anda mengenai perkara ini.

    Saya membuat permintaan get ke pelayan web saya
    53.47792 = $ garis lintang
    -2.23389 = $ bujur
    dan 20 = jarak yang ingin saya perolehi

    Walaupun menggunakan formula anda, ia mengambil semua baris di db saya

    $results = DB::select( DB::raw(“SELECT *, (((acos(sin(“.$latitude.”)pi()/180)) * sin((latpi()/180))+cos((“.$latitud.”pi()/180)) * cos((latpi()/180)) * cos(((“.$longitud.”- lng)pi()/180))))180/pi())601.1515*1.609344) sebagai jarak DARI penanda MEMPUNYAI jarak >= “.$jarak ));

    [{"Id": 1, "name": "Frankie Johnnie & Luigo Too", "address": "939 W El Camino Real, Mountain View, CA", "lat": 37.386337280273, "lng": - 122.08582305908, "Jarak": 16079.294719663}, {"id": 2, "nama": "Pizzeria Pantai Timur Amici", "alamat": "790 Castro St, Mountain View, CA", "lat": 37.387138366699, "lng": -122.08323669434, "jarak": 16079.175940152}, {"id": 3, "name": "Kapp's Pizza Bar & Grill", "address": "191 Castro St, Mountain View, CA", "lat": 37.393886566162, "Lng": - 122.07891845703, "jarak": 16078.381373826}, {"id": 4, "name": "Pizza Meja Bulat: Pemandangan Gunung", "alamat": "570 N Shoreline Blvd, Mountain View, CA", "Lat": 37.402652740479, "lng": - 122.07935333252, "jarak": 16077.420540582}, {"id": 5, "name": "Tony & Alba's Pizza & Pasta", "address": "619 Escuela Ave, Mountain Lihat, CA "," lat ": 37.394012451172," lng ": - 122.09552764893," jarak ": 16078.563225154}, {" id ": 6," name ":" Oregano's Wood-Fired Pizza "," address ":" 4546 El Camino Real, Los Altos, CA "," lat ": 37.401725769043," lng ": - 122.11464691162," jarak ": 16077.937560795}, {" id ": 7," name ":" The bar and grills "," address ":" 24 Whiteley Street, Manchester "," lat ": 53.485118865967," lng ": - 2.1828699111938," jarak ": 8038.7620112314}]

    Saya mahu mengambil baris hanya dengan jarak 20 batu tetapi ia membawa semua baris. Tolong apa yang saya buat salah

  25. Saya mencari pertanyaan yang serupa tetapi meningkatkan sedikit - ringkasnya ini adalah untuk mengumpulkan semua koordinat dalam jarak 2 batu dari setiap koordinat dan kemudian mengira berapa koordinat dalam setiap kumpulan dan menghasilkan hanya satu kumpulan yang mempunyai koordinat terbanyak - walaupun anda mempunyai lebih daripada satu kumpulan di antara kumpulan yang mempunyai bilangan koordinat terbanyak - cukup keluarkan kumpulan rawak dari kumpulan yang mempunyai bilangan terbesar yang sama -

Apa yang anda fikir?

Laman web ini menggunakan Akismet untuk mengurangkan spam. Ketahui bagaimana data komen anda diproses.