Analisis & PengujianCRM dan Platform Datamarketing Tools

Hitung atau Kueri Jarak Lingkaran Besar Antara Titik Lintang dan Bujur Menggunakan Rumus Haversine (Contoh PHP, JavaScript, Java, Python, MySQL, MSSQL)

Bulan ini, saya telah memprogram dalam PHP dan MySQL untuk GIS. Saat meneliti topik tersebut, saya kesulitan menemukannya perhitungan geografis untuk mengetahui jarak antara dua lokasi, jadi saya ingin membagikannya di sini.

Peta Penerbangan Eropa Dengan Jarak Lingkaran Besar

Cara sederhana untuk menghitung jarak antara dua titik menggunakan rumus Pythagoras untuk menghitung sisi miring segitiga (A² + B² = C²). Ini dikenal sebagai Jarak Euclidean.

Ini merupakan awal yang menarik, namun tidak berlaku untuk geografi karena jarak antara garis lintang dan garis bujur sangat jauh jarak yang tidak sama. Semakin dekat ke garis khatulistiwa, garis lintang semakin terpisah. Jika Anda menggunakan persamaan triangulasi sederhana, persamaan triangulasi mungkin mengukur jarak secara akurat di satu lokasi dan salah di lokasi lain karena kelengkungan bumi.

Jarak Lingkaran Besar

Rute perjalanan jarak jauh di sekitar Bumi dikenal sebagai Jarak Lingkaran Besar. Artinya… jarak terpendek antara dua titik pada bola berbeda dengan titik-titik pada peta datar. Gabungkan itu dengan fakta bahwa garis lintang dan garis bujur tidak berjarak sama… dan Anda memiliki perhitungan yang sulit.

Berikut adalah penjelasan video fantastis tentang cara kerja Great Circles.

Formula Haversine

Jarak menggunakan kelengkungan Bumi tergabung dalam rumus Haversine, yang menggunakan trigonometri untuk memperhitungkan kelengkungan Bumi. Saat Anda mencari jarak antara 2 tempat di Bumi (saat burung gagak terbang), garis lurus sebenarnya adalah busur.

Ini berlaku dalam penerbangan udara – pernahkah Anda melihat peta penerbangan yang sebenarnya dan memperhatikan bahwa peta itu melengkung? Itu karena terbang di lengkungan antara dua titik lebih pendek daripada langsung ke lokasi.

PHP: Menghitung Jarak Antara 2 Titik Lintang dan Bujur

Berikut rumus PHP untuk menghitung jarak antara dua titik (bersama dengan konversi Mile vs. Kilometer) yang dibulatkan menjadi dua tempat desimal.

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)); 
}

Variabelnya adalah:

  • $Lintang1 – variabel untuk garis lintang lokasi pertama Anda.
  • $Bujur1 – variabel untuk bujur lokasi pertama Anda
  • $Lintang2 – variabel untuk garis lintang lokasi kedua Anda.
  • $Bujur2 – variabel untuk bujur lokasi kedua Anda.
  • $satuan – makhluk default mil. Ini dapat diperbarui atau diteruskan sebagai kilometer.

Java: Menghitung Jarak Antara 2 Titik Lintang dan Bujur

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;
    }
}

Variabelnya adalah:

  • lintang1 – variabel untuk garis lintang lokasi pertama Anda.
  • bujur1 – variabel untuk bujur lokasi pertama Anda
  • lintang2 – variabel untuk garis lintang lokasi kedua Anda.
  • bujur2 – variabel untuk bujur lokasi kedua Anda.
  • satuan – makhluk default mil. Ini dapat diperbarui atau diteruskan sebagai kilometer.

JavaScript: Menghitung Jarak Antara 2 Titik Lintang dan Bujur

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);
    }
}

Variabelnya adalah:

  • lintang1 – variabel untuk garis lintang lokasi pertama Anda.
  • bujur1 – variabel untuk bujur lokasi pertama Anda
  • lintang2 – variabel untuk garis lintang lokasi kedua Anda.
  • bujur2 – variabel untuk bujur lokasi kedua Anda.
  • satuan – makhluk default mil. Ini dapat diperbarui atau diteruskan sebagai kilometer.

Python: Hitung Jarak Antara 2 Titik Lintang dan Bujur

Berikut rumus Python untuk menghitung jarak antara dua titik (beserta konversi Mil vs. Kilometer) yang dibulatkan menjadi dua tempat desimal. Penghargaan untuk putra saya, Bill Karr, seorang Ilmuwan Data Buka WAWASAN, untuk kode.

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)

Variabelnya adalah:

  • lintang1 – variabel untuk lokasi pertama Anda lintang.
  • bujur1 – variabel untuk lokasi pertama Anda garis bujur
  • lintang2 – variabel untuk lokasi kedua Anda lintang.
  • bujur2 – variabel untuk lokasi kedua Anda garis bujur.
  • satuan – makhluk default mil. Ini dapat diperbarui atau diteruskan sebagai kilometer.

MySQL: Mengambil Semua Catatan Dalam Jangkauan Dengan Menghitung Jarak Dalam Mil Menggunakan Garis Lintang dan Bujur

Menggunakan Tipe Data Spasial di MySQL adalah cara yang lebih efisien dan nyaman untuk bekerja dengan data geografis, termasuk menghitung jarak antar titik. MySQL mendukung Tipe Data Spasial seperti POINT, LINESTRING, dan POLYGON, beserta fungsi spasial seperti ST_Distance.

Saat Anda menggunakan ST_Distance fungsi di MySQL dengan data geografis direpresentasikan sebagai POINT koordinat, memperhitungkan kelengkungan permukaan bumi. Model bola yang digunakan oleh ST_Distance menggunakan rumus Haversine. Perkiraan ini cocok untuk sebagian besar tujuan praktis tetapi mungkin menimbulkan sedikit ketidakakuratan untuk jarak yang sangat jauh.

Berikut cara menghitung jarak antara dua titik menggunakan Tipe Data Spasial:

  1. Buat Tabel dengan Tipe Data Spasial: Pertama, buat tabel dengan a POINT kolom untuk menyimpan titik geografis. Misalnya:
CREATE TABLE locations (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(255),
    coordinates POINT
);

Masukkan titik geografis Anda ke dalam tabel ini menggunakan POINT konstruktor:

INSERT INTO locations (name, coordinates)
VALUES
    ('Point A', POINT(40.7128, -74.0060)), -- New York City
    ('Point B', POINT(34.0522, -118.2437)); -- Los Angeles
  1. Hitung Jarak Menggunakan ST_Distance: Anda dapat menghitung jarak antara dua titik menggunakan ST_Distance fungsi. Berikut contoh query untuk menghitung jarak antara dua titik:
SELECT
    id1,
    id2,
    (ST_Distance(coordinates1, coordinates2) / 1609.344) AS distance_in_miles
FROM (
    SELECT
        l1.id AS id1,
        l2.id AS id2,
        l1.coordinates AS coordinates1,
        l2.coordinates AS coordinates2
    FROM
        locations l1,
        locations l2
    WHERE
        l1.id = 1 AND l2.id = 2
) AS distances;

menggantikan 1 dan 2 dengan ID dari dua titik yang ingin Anda hitung jaraknya.

  1. Hasil: Kueri akan mengembalikan jarak antara dua titik dalam mil.

Menggunakan Tipe Data Spasial dan ST_Distance fungsi menyediakan cara yang lebih efisien dan akurat untuk bekerja dengan data geografis di MySQL. Ini juga menyederhanakan penghitungan jarak antar titik, sehingga lebih mudah untuk mengelola dan menanyakan data Anda.

MySQL: Mengambil Semua Catatan Dalam Jangkauan Dengan Menghitung Jarak Dalam Kilometer Menggunakan Lintang dan Bujur

Secara default ST_Distance mengembalikan jarak dalam meter, jadi Anda hanya perlu memperbarui kueri untuk kilometer:

SELECT
    id1,
    id2,
    (ST_Distance(coordinates1, coordinates2) / 1000) AS distance_in_kilometers
FROM (
    SELECT
        l1.id AS id1,
        l2.id AS id2,
        l1.coordinates AS coordinates1,
        l2.coordinates AS coordinates2
    FROM
        locations l1,
        locations l2
    WHERE
        l1.id = 1 AND l2.id = 2
) AS distances;

Jarak Geografis Microsoft SQL Server: Jarak ST

Jika Anda menggunakan Microsoft SQL Server, mereka menawarkan fungsinya sendiri, Jarak ST untuk menghitung jarak antara dua titik menggunakan tipe 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, pendiri dan arsitek senior di Ion Tiga.

Douglas Karr

Douglas Karr adalah CMO dari Buka WAWASAN dan pendiri dari Martech Zone. Douglas telah membantu lusinan startup MarTech yang sukses, membantu uji tuntas lebih dari $5 miliar dalam akuisisi dan investasi Martech, dan terus membantu perusahaan dalam menerapkan dan mengotomatiskan strategi penjualan dan pemasaran mereka. Douglas adalah pakar dan pembicara transformasi digital dan MarTech yang diakui secara internasional. Douglas juga merupakan penulis panduan Dummie dan buku kepemimpinan bisnis.

Artikel terkait

Kembali ke atas tombol
Penyelesaian

Adblock Terdeteksi

Martech Zone dapat memberi Anda konten ini tanpa biaya karena kami memonetisasi situs kami melalui pendapatan iklan, tautan afiliasi, dan sponsor. Kami akan sangat menghargai jika Anda menghapus pemblokir iklan saat Anda melihat situs kami.