Traffine I/O

Bahasa Indonesia

2023-05-29

Menghitung Jarak Geografis dengan Snowflake UDF

Menghitung Jarak Geografis dengan Snowflake UDF

Dalam artikel ini, saya akan memperkenalkan bagaimana mengimplementasikan UDF (User-Defined Function) yang menghitung jarak geografis di Snowflake.

User-Defined Functions (UDFs)

Dalam konteks database, fungsi adalah potongan kode yang dapat digunakan kembali yang mengambil input tertentu, melakukan tindakan, dan mengembalikan hasilnya. Snowflake, seperti banyak sistem database lainnya, menyediakan berbagai fungsi bawaan. Namun, terkadang fungsi bawaan tersebut tidak cukup untuk memenuhi persyaratan khusus tugas pemrosesan data yang kompleks. Di sinilah UDFs berperan.

UDFs memungkinkan pengguna untuk mendefinisikan fungsi mereka sendiri di Snowflake. Fungsi-fungsi ini kemudian dapat digunakan kembali dalam berbagai kueri dan aplikasi, seperti halnya fungsi bawaan. UDFs dapat sangat berguna untuk mengkapsulasi logika yang digunakan berulang kali.

Formula Haversine

Formula Haversine adalah persamaan matematika yang digunakan untuk menghitung jarak lingkaran besar antara dua titik di permukaan bola, berdasarkan bujur dan lintangnya. Formula ini sangat penting ketika datang ke pengukuran jarak di Bumi, yang dapat diaproksimasi sebagai bola untuk jarak pendek.

Formula ini dinyatakan sebagai berikut:

a = \sin^2\left(\frac{\Delta \phi}{2}\right) + \cos(\phi_1) \cdot \cos(\phi_2) \cdot \sin^2\left(\frac{\Delta \lambda}{2}\right)
c = 2 \cdot \text{atan2}\left(\sqrt{a}, \sqrt{1-a}\right)
d = R \cdot c

Di mana:

  • \phi_1, \phi_2 adalah lintang titik 1 dan lintang titik 2 (dalam radian),
  • \Delta \phi adalah perbedaan lintang (dalam radian),
  • \Delta \lambda adalah perbedaan bujur (dalam radian),
  • R adalah jari-jari Bumi (rata-rata jari-jari = 6.371 km),
  • d adalah jarak lingkaran besar antara dua titik (melalui permukaan bola).

Formula ini memecah perhitungan menjadi tiga bagian: a menghitung kuadrat setengah panjang tali antara titik-titik; c mewakili jarak sudut dalam radian, dan d menghitung jarak sebenarnya menggunakan jari-jari Bumi.

Mengimplementasikan UDF di Snowflake

Saya akan menjelaskan langkah-langkah mengimplementasikan formula Haversine sebagai UDF di Snowflake.

Membuat UDF Jarak Haversine

Mari tulis kueri SQL untuk membuat UDF yang mengimplementasikan formula Haversine. Dalam UDF ini, kita akan melewatkan empat parameter - lintang dan bujur dua titik. Fungsi ini harus mengembalikan jarak antara kedua titik tersebut dalam kilometer.

Berikut ini adalah kode SQL yang benar untuk membuat UDF ini:

sql
CREATE OR REPLACE FUNCTION HAVERSINE_DISTANCE(
  lat1 FLOAT,
  lon1 FLOAT,
  lat2 FLOAT,
  lon2 FLOAT
)
RETURNS FLOAT
LANGUAGE SQL
AS
$$
  -- Earth's radius in km
  6371.0 * 2 * ATAN2(
    SQRT(
      SIN(RADIANS(lat2 - lat1) / 2) * SIN(RADIANS(lat2 - lat1) / 2) +
      COS(RADIANS(lat1)) * COS(RADIANS(lat2)) *
      SIN(RADIANS(lon2 - lon1) / 2) * SIN(RADIANS(lon2 - lon1) / 2)
    ),
    SQRT(
      1 - (
        SIN(RADIANS(lat2 - lat1) / 2) * SIN(RADIANS(lat2 - lat1) / 2) +
        COS(RADIANS(lat1)) * COS(RADIANS(lat2)) *
        SIN(RADIANS(lon2 - lon1) / 2) * SIN(RADIANS(lon2 - lon1) / 2)
      )
    )
  )
$$;

Kode ini langsung menyisipkan perhitungan dari formula Haversine. Ia menggunakan fungsi bawaan seperti SIN, COS, ATAN2, dan RADIANS untuk melakukan operasi matematika yang diperlukan.

Menggunakan UDF Jarak Haversine

Dengan UDF yang telah dibuat, Anda sekarang dapat menggunakannya dalam kueri SQL untuk menghitung jarak antara dua titik geografis apa pun. Sebagai contoh, mari kita hitung jarak antara Tokyo (35.6895N, 139.6917E) dan Los Angeles (34.0522N, -118.2437E):

sql
SELECT HAVERSINE_DISTANCE(35.6895, 139.6917, 34.0522, -118.2437) AS distance_in_km;
DISTANCE_IN_KM
1 8815.473355809

Kueri ini menggunakan fungsi HAVERSINE_DISTANCE yang telah kita buat, dengan melewatkan lintang dan bujur Tokyo dan Los Angeles, dan mengembalikan jarak antara dua kota ini dalam kilometer.

Ryusei Kakujo

researchgatelinkedingithub

Focusing on data science for mobility

Bench Press 100kg!