Pertanyaan Mengukur jarak antara dua titik Lintang / Lng


Saya mengalami masalah mencoba mengembalikan lokasi terdekat ke pengguna melalui pernyataan SQL. Untuk menguji saya menggunakan koordinat yang sama persis, inilah yang saya miliki:

SQL:

SELECT  `companies`.`customerName` , 
    (3959 * 
        ACOS(
            COS(
                RADIANS(37.367485) * COS(RADIANS(`locations`.`gps_lat`)) * 
                COS(
                    RADIANS(`locations`.`gps_lng`) - RADIANS(-77.399994) + 
                    SIN(RADIANS(37.367485)) * SIN(RADIANS(`locations`.`gps_lat`))
                )
            )
        )
    )
AS  `distance` 
FROM  `locations` 
JOIN  `companies` ON  `locations`.`co_id` 
HAVING  `distance` > 25
ORDER BY distance
LIMIT 0 , 10

Hasil: 

| customerName  | distance           |
| SOME COMPANY  | 1914.41747964854   |


locations  nilai tabel: 

gps_lat   | gps_lng
37.367485 | -77.399994


Saya menggunakan contoh dari GoogleSaya memeriksa formula beberapa kali dan sepertinya saya tidak bisa menemukan kesalahan saya. Bantuan apa pun dihargai.


EDIT:
Karena sepertinya ada kebingungan pada saya mengetahui apa yang saya lakukan:

Itu > diganti untuk menghasilkan hasil, 1914 jelas lebih besar dari itu 25.

Aplikasi ini melewati koordinat pengguna dari aplikasi Android ke server web kami. Garis Lintang dan Bujur akan ditarik dari $_GET nilai-nilai dan referensi silang dari perusahaan di server web kami database MYSQL.

Sintaks di atas hanya saya memeriksa pernyataan SQL saya di Workbench Mysql. Tentunya saya mencari hasil nilai nol.


5
2018-06-26 17:02


asal


Jawaban:


Saya rasa saya telah memecahkan masalah ini dengan mengubah dari contoh Google menjadi rumus yang disediakan oleh "Petualangan seorang yooper yang diadopsi". Menggunakan versinya Formula Haversine.
Catatan: Contoh Google di atas menggunakan Haversine juga.

SQL:

SELECT  `companies`.`customerName` , 
(2 * (3959 * ATAN2(
          SQRT(
            POWER(SIN((RADIANS(37.367485 - `locations`.`gps_lat` ) ) / 2 ), 2 ) +
            COS(RADIANS(`locations`.`gps_lat`)) *
            COS(RADIANS(37.367485 )) *
            POWER(SIN((RADIANS(-77.399994 - `locations`.`gps_lng` ) ) / 2 ), 2 )
          ),
          SQRT(1-(
            POWER(SIN((RADIANS(37.367485 - `locations`.`gps_lat` ) ) / 2 ), 2 ) +
            COS(RADIANS(`locations`.`gps_lat`)) *
            COS(RADIANS(37.367485)) *
            POWER(SIN((RADIANS(-77.399994 - `locations`.`gps_lng` ) ) / 2 ), 2 )
          ))
        )
      ))
AS 'distance'
FROM  `locations` 
JOIN  `companies` ON  `locations`.`co_id` 
HAVING  distance < 25
ORDER BY distance
LIMIT 0 , 10



Bagi yang penasaran dengan aplikasi saya, Final PHP:

DAPATKAN Nilai: ?lat=37.367485&lng=-77.399994

$earth_radius_miles = 3959; // Earth radius in miles
$earth_radius_kilometers = 6371; // Earth radius in kilometers
$result_radius = 10000; // Maximum distance in either miles or kilometers

$get_lat = $_GET["lat"];
$get_lng = $_GET["lng"];

$dbSelect = mysql_query("SELECT  `companies`.`customerName`,
(2 * (".$earth_radius_miles." * ATAN2(
          SQRT(
            POWER(SIN((RADIANS(".$get_lat." - `locations`.`gps_lat` ) ) / 2 ), 2 ) +
            COS(RADIANS(`locations`.`gps_lat`)) *
            COS(RADIANS(".$get_lat.")) *
            POWER(SIN((RADIANS(".$get_lng." - `locations`.`gps_lng` ) ) / 2 ), 2 )
          ),
          SQRT(1-(
            POWER(SIN((RADIANS(".$get_lat." - `locations`.`gps_lat` ) ) / 2 ), 2 ) +
            COS(RADIANS(`locations`.`gps_lat`)) *
            COS(RADIANS(".$get_lat.")) *
            POWER(SIN((RADIANS(".$get_lng." - `locations`.`gps_lng` ) ) / 2 ), 2 )
          ))
        )
      ))
AS 'distance'
FROM  `locations` 
JOIN  `companies` ON  `locations`.`co_id` 
HAVING  distance < ".$result_radius."
ORDER BY distance
LIMIT 0 , 10") 
or die(mysql_error());

Hasil:

[{"customerName":"SOME COMPANY","distance":"0"}]

Saya telah menguji hasil ini dengan koordinat lain dan tampaknya berfungsi dengan sempurna. Belum menguji apa pun dengan jarak yang sangat jauh di antara dua titik tetapi aplikasi saya tidak mengharuskan saya untuk melakukannya.


5
2018-06-26 20:33



Ashok, Anda dapat menghitung jarak antara dua bawahan dengan menggunakan rumus di bawah ini:

enter image description here

dimana

R  =  radius of the earth (6,371 km)
Δlat =  |lat2- lat1|
Δlong = |long2- long1|

1
2018-05-02 21:22