
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.

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.
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); }
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.
Terima kasih banyak Peter dan Kerry! Jika anda suka bekerja pada projek GIS, saya akan mengesyorkan:
Terima kasih banyak ... 😀
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
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.
Saya jumpa persamaan untuk mengetahui sama ada titik dalam poligon!
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.
Hi David,
Jika anda melakukan sebarang jenis pernyataan GROUP BY, anda memerlukan HAVING. Saya tidak melakukannya dalam contoh di atas.
Doug
Pada MySQL 5.x, anda tidak boleh menggunakan alias pada klausa WHERE lihat http://dev.mysql.com/doc/refman/5.0/en/problems-with-alias.html
Gunakan HAVING dan bukannya DI MANA dalam pertanyaan di atas
Terima kasih banyak - banyak. Anda telah melakukan pekerjaan yang hebat Itulah perkara yang sebenarnya saya mahukan. Terima kasih banyak-banyak.
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.
Saya diberkati mempunyai pembaca yang lebih pintar daripada saya!
(I.e.
Formula di atas menjimatkan banyak masa saya. Terima kasih banyak - banyak.
Saya juga perlu bertukar antara format NMEA dan Darjah. Saya menemui formula di URL ini di bahagian bawah halaman. http://www.errorforum.com/knowledge-base/16273-converting-nmea-sentence-latitude-longitude-decimal-degrees.html
Adakah ada yang tahu bagaimana mengesahkan ini?
Terima kasih!
Harry
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
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.
Terima kasih banyak untuk skrip yang ditulis dalam mysql, hanya perlu membuat sedikit penyesuaian kecil (MEMILIKI) 🙂
Gret kerja
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 ^ _ ^
terima kasih banyak berjaya
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.
Kesalahan kecil dalam contoh ... itu adalah dalam jarak 50 km (bukan 100) kerana kita melihat "radius" dataran kita.
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!
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.
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 ...
Ganti "DI MANA jarak" dengan "MEMILIKI jarak".
Berfungsi seperti daya tarikan, terima kasih, Douglas!
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.
Hai Douglas,
terima kasih banyak untuk artikel ini - anda hanya menjimatkan banyak masa.
jaga diri,
nimrod @Israel
Artikel yang bagus! Saya menemui banyak artikel yang menerangkan cara mengira jarak antara dua titik tetapi saya benar-benar mencari coretan SQL.
Terima kasih banyak berfungsi dengan baik
Terima kasih banyak untuk formula ini. Ia mencukur beberapa lama pada projek lokasi kedai yang sedang makan pada saya.
Terima kasih seikat. Barisan kod kecil ini menjimatkan masa saya dalam projek lokasi kedai!
# 1054 - Lajur tidak dikenali 'jarak' di 'di mana klausa'
meluluskan
Sama disini! Apa masalahnya :-/? bagaimana menyelesaikan "jarak" - Masalah lajur? Tolong kami, tolong !! 🙂
Cuba gunakan HAVING dan bukannya DI MANA
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
bukannya menggunakan klausa DI MANA:
MEMILIKI jarak <50
Terima kasih Georgi. Saya terus mendapat tiang 'jarak' yang tidak dijumpai. Setelah saya menukar DI MANA untuk MEMILIKI ia berfungsi seperti daya tarikan!
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!
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!
Terima kasih banyak-banyak!
Terima kasih banyak-banyak!
Saya rasa kodnya tidak lagi muncul. Mungkin itu firefox?
Saya baru sahaja menguji kedua-duanya di Firefox dan Chrome dan ia muncul. Cuba lagi?
Hai. Terima kasih banyak-banyak. Ini berfungsi seperti daya tarikan.
Terima kasih banyak Douglas. Ini berfungsi dengan sempurna.
Saya tahu formula ini berfungsi, tetapi saya tidak dapat melihat di mana radius bumi diambil kira. Bolehkah ada yang menyedarkan saya?
Tim, untuk penjelasan lengkap mengenai formula Haversine (itu bukan kod), lihat artikel Wikipedia: http://en.wikipedia.org/wiki/Haversine_formula
Cantik! Ini sangat membantu saya!
Barang hebat Douglas. Adakah anda telah mencuba mendapatkan titik persimpangan kerana Long / Lat / Bearing dua titik?
Belum melakukannya, Khanh!
Terima kasih Douglas, Pertanyaan SQL adalah apa yang saya perlukan, dan saya fikir saya harus menulisnya sendiri. Anda telah menyelamatkan saya dari kemungkinan kurva pembelajaran garis bujur lintang!
Saya terus mendapat Errormessage: Lajur tidak dikenali 'Jarak' di 'mana klausa' pada MySQL Query.
Peter, sila baca komen yang lain. Nampaknya sebilangan orang harus menggunakan sintaks yang berbeza untuk DI MANA / MEMILIKI.
Terima kasih untuk artikel hebat ini! Baru sahaja menguji kod di DB saya dan berjaya!
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.
Senang didengar, Ash!
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
tidak mengapa, saya telah memikirkan bagaimana "fungsi" berfungsi di php
$ dis = getDistanceBetweenPointsNew ($ userLati, $ userLongi, $ lati, $ longi, $ unit = 'Km')
terima kasih banyak-banyak!!
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
Terima kasih kerana artikel ini. Bekerja dengan baik dengan kod saya. 🙂
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.
Terima kasih! Saya telah sedikit mengubah suai siaran… tetapi persamaannya memerlukan banyak ruang dan begitu lama sehingga saya tidak pasti bahawa ia terlalu banyak membantu.
Terima kasih banyak-banyak.
di sini semasa menggunakan dengan fungsi, kita mendapat satu jenis jarak..sambil menggunakan pertanyaan jenis jarak yang lain
Saya tidak akan mengira jarak antara dua keadaan
Muchas gracias por tan hermoso codigo
Ini berfungsi dengan baik. Saya tidak tahu matematik, tapi terima kasih!
Kerja Hebat… 🙂 (y)
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;
terima kasih ...
tidak berfungsi sekiranya
"DI MANA jarak"
bekerja sekiranya
"MEMILIKI jarak"
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.
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`“;
Terima kasih Kupendra!
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.
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
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 -
Terima kasih banyak untuk berkongsi.