0Pricing
SQL Academy · Pelajaran

Jarak dan Tetangga Terdekat

Temukan yang berada di dekat Anda.

Jarak dan Tetangga Terdekat adalah pelajaran SQL Academy gratis di CoddyKit. Ini adalah pelajaran 2 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar SQL Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus SQL Academy mencakup 4 pelajaran total.

Apa Itu Jarak Spasial

Dalam basis data geospasial, jarak adalah pemisahan terukur antara dua lokasi geografis. PostGIS menyediakan fungsi canggih untuk menghitung jarak antara titik, garis, poligon, dan tipe geometri lainnya.

Memahami kueri jarak memungkinkan Anda menjawab pertanyaan seperti: Restoran mana yang paling dekat dengan saya? atau Pelanggan mana yang berada dalam jarak 5 km dari gudang kami?

Fungsi ST_Distance

ST_Distance(geom_a, geom_b) mengembalikan jarak minimum antara dua objek geometri. Secara bawaan, saat menggunakan tipe geometri biasa, hasilnya menggunakan satuan yang sama dengan sistem referensi koordinat (biasanya derajat untuk EPSG:4326).

Untuk memperoleh hasil yang bermakna dalam meter, gunakan tipe geografi atau proyeksikan ulang data Anda.

SELECT ST_Distance(
  ST_MakePoint(28.9784, 41.0082)::geography,
  ST_MakePoint(29.0100, 41.0200)::geography
) AS distance_meters;

Menyiapkan Tabel Contoh

Mari kita membuat tabel sederhana berisi tempat dengan koordinat geografis. Kita akan menggunakan tipe geografi agar semua perhitungan jarak otomatis menghasilkan meter — tanpa perlu proyeksi manual.

Tabel ini akan menyimpan kafe di sebuah kota, masing-masing dengan nama dan lokasi yang disimpan sebagai titik.

CREATE TABLE cafes (
  id SERIAL PRIMARY KEY,
  name TEXT NOT NULL,
  location GEOGRAPHY(Point, 4326)
);

INSERT INTO cafes (name, location) VALUES
  ('Cafe Alpha',   ST_MakePoint(28.9784, 41.0082)::geography),
  ('Cafe Beta',    ST_MakePoint(28.9900, 41.0150)::geography),
  ('Cafe Gamma',   ST_MakePoint(29.0100, 41.0200)::geography),
  ('Cafe Delta',   ST_MakePoint(28.9650, 40.9980)::geography),
  ('Cafe Epsilon', ST_MakePoint(29.0250, 41.0350)::geography);

Menemukan Jarak dari Titik Tetap

Setelah memiliki data lokasi, Anda dapat menghitung jarak dari setiap baris ke titik referensi. Di sini kita menghitung seberapa jauh setiap kafe dari pengguna yang berada pada koordinat (28.9800, 41.0100).

Hasilnya dalam meter karena kita menggunakan tipe geografi.

SELECT
  name,
  ROUND(
    ST_Distance(
      location,
      ST_MakePoint(28.9800, 41.0100)::geography
    )::NUMERIC
  ) AS distance_m
FROM cafes
ORDER BY distance_m;

Menemukan Tetangga Terdekat

Untuk menemukan lokasi tunggal yang paling dekat dengan suatu titik, urutkan berdasarkan jarak dan ambil hanya satu baris dengan LIMIT 1. Ini adalah kueri tetangga terdekat klasik.

Pola ini sangat umum dalam aplikasi berbasis lokasi: menemukan toko, dokter, atau halte transportasi terdekat.

SELECT
  name,
  ROUND(
    ST_Distance(
      location,
      ST_MakePoint(28.9800, 41.0100)::geography
    )::NUMERIC
  ) AS distance_m
FROM cafes
ORDER BY location <-> ST_MakePoint(28.9800, 41.0100)::geography
LIMIT 1;

Operator &lt;-&gt; untuk Tetangga Terdekat

PostGIS menyediakan operator <-> (KNN — K Tetangga Terdekat) yang menggunakan indeks. Berbeda dari ST_Distance dalam klausa ORDER BY, <-> dapat menggunakan indeks spasial GiST untuk menghindari pemindaian setiap baris.

Selalu utamakan <-> dalam ORDER BY saat Anda memerlukan tetangga terdekat secara efisien. Buat indeks seperti ini untuk mendukungnya:

CREATE INDEX ON cafes USING GIST (location);

SELECT
  name,
  ROUND(
    ST_Distance(
      location,
      ST_MakePoint(28.9800, 41.0100)::geography
    )::NUMERIC
  ) AS distance_m
FROM cafes
ORDER BY location <-> ST_MakePoint(28.9800, 41.0100)::geography
LIMIT 5;

Memfilter Berdasarkan Jarak (ST_DWithin)

ST_DWithin(geom_a, geom_b, distance) mengembalikan TRUE jika dua geometri berada dalam jarak tertentu satu sama lain. Untuk tipe geografi, jaraknya dalam meter.

Ini lebih efisien daripada ST_Distance(...) < radius dalam klausa WHERE karena ST_DWithin menggunakan indeks dan berhenti lebih awal setelah kondisi terpenuhi.

SELECT
  name,
  ROUND(
    ST_Distance(
      location,
      ST_MakePoint(28.9800, 41.0100)::geography
    )::NUMERIC
  ) AS distance_m
FROM cafes
WHERE ST_DWithin(
  location,
  ST_MakePoint(28.9800, 41.0100)::geography,
  2000
)
ORDER BY distance_m;

N Terdekat Teratas dengan Batas Radius

Pola yang umum dalam lingkungan produksi menggabungkan ST_DWithin sebagai prapenyaring dengan pengurutan berdasarkan <->. Pemeriksaan ST_DWithin menggunakan indeks spasial untuk dengan cepat menyisihkan baris yang jauh, lalu kandidat yang tersisa diurutkan berdasarkan jarak yang tepat.

Dengan cara ini, Anda dapat menemukan N lokasi terdekat dalam radius maksimum dengan sangat efisien.

SELECT
  name,
  ROUND(
    ST_Distance(
      location,
      ST_MakePoint(28.9800, 41.0100)::geography
    )::NUMERIC
  ) AS distance_m
FROM cafes
WHERE ST_DWithin(
  location,
  ST_MakePoint(28.9800, 41.0100)::geography,
  5000
)
ORDER BY location <-> ST_MakePoint(28.9800, 41.0100)::geography
LIMIT 3;

Jarak Antara Dua Tabel (Jarak Silang)

Anda dapat menghitung jarak antara baris dalam dua tabel berbeda menggunakan JOIN yang dikombinasikan dengan ST_Distance. Ini berguna untuk mencocokkan, misalnya, setiap pelanggan dengan gudang terdekat atau setiap insiden dengan rumah sakit terdekat.

Di bawah ini kita mencari kafe terdekat untuk setiap pengguna dalam tabel users menggunakan JOIN LATERAL — pola PostgreSQL yang andal untuk subkueri per baris.

SELECT
  u.username,
  c.name AS nearest_cafe,
  ROUND(ST_Distance(u.location, c.location)::NUMERIC) AS distance_m
FROM (
  VALUES
    ('alice', ST_MakePoint(28.9810, 41.0095)::geography),
    ('bob',   ST_MakePoint(29.0200, 41.0300)::geography)
) AS u(username, location)
CROSS JOIN LATERAL (
  SELECT name, location
  FROM cafes
  ORDER BY location <-> u.location
  LIMIT 1
) c;

Memformat Keluaran Jarak

Jarak mentah dalam meter dapat sulit dibaca. Anda dapat memformatnya sebagai kilometer atau menambahkan label yang mudah dipahami menggunakan ekspresi CASE dan pemformatan teks. Berikut adalah kueri yang menampilkan jarak dalam meter untuk jarak pendek dan dalam kilometer untuk jarak yang lebih jauh.

SELECT
  name,
  CASE
    WHEN ST_Distance(location, ST_MakePoint(28.9800, 41.0100)::geography) < 1000
    THEN ROUND(ST_Distance(location, ST_MakePoint(28.9800, 41.0100)::geography)::NUMERIC)
         || ' m'
    ELSE ROUND((ST_Distance(location, ST_MakePoint(28.9800, 41.0100)::geography) / 1000.0)::NUMERIC, 2)
         || ' km'
  END AS formatted_distance
FROM cafes
ORDER BY location <-> ST_MakePoint(28.9800, 41.0100)::geography;

Memberikan Peringkat Berdasarkan Jarak

Fungsi jendela seperti RANK() dan ROW_NUMBER() sangat cocok dipadukan dengan kueri jarak. Anda dapat menetapkan peringkat kedekatan untuk setiap lokasi relatif terhadap pengguna, yang berguna untuk membuat daftar rekomendasi berperingkat atau hasil pencarian yang diurutkan berdasarkan kedekatan.

SELECT
  name,
  ROUND(
    ST_Distance(
      location,
      ST_MakePoint(28.9800, 41.0100)::geography
    )::NUMERIC
  ) AS distance_m,
  ROW_NUMBER() OVER (
    ORDER BY location <-> ST_MakePoint(28.9800, 41.0100)::geography
  ) AS proximity_rank
FROM cafes;

Uji Pemahaman

Uji pemahaman Anda tentang kueri jarak dan pencarian tetangga terdekat dalam PostGIS.

Ringkasan Pelajaran

Dalam pelajaran ini, Anda mempelajari cara bekerja dengan jarak spasial dan kueri tetangga terdekat dalam PostGIS:

  • ST_Distance menghitung jarak tepat antara dua geometri; gunakan tipe geografi untuk mendapatkan satuan meter secara otomatis.
  • ST_DWithin memfilter baris dalam radius secara efisien menggunakan indeks spasial — lebih baik gunakan ini daripada ST_Distance < radius dalam klausa WHERE.
  • Operator <-> (KNN) dalam ORDER BY menggunakan indeks dan merupakan cara tercepat untuk mengambil N tetangga terdekat.
  • Gabungkan ST_DWithin sebagai prapenyaring dengan pengurutan berdasarkan <-> untuk kueri N teratas dalam radius yang paling efisien.
  • CROSS JOIN LATERAL memungkinkan Anda menemukan kecocokan terdekat dari tabel lain untuk setiap baris.
  • Fungsi jendela seperti ROW_NUMBER() dapat menetapkan peringkat kedekatan pada hasil yang diurutkan berdasarkan jarak.

Pola-pola ini menjadi dasar fitur berbasis lokasi dalam aplikasi dunia nyata.

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Jarak dan Tetangga Terdekat” gratis?

Ya — teks lengkap “Jarak dan Tetangga Terdekat” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus SQL Academy, upgrade ke CoddyKit PRO. Kursus SQL Academy mencakup 4 pelajaran total.

Apa yang akan aku pelajari di “Jarak dan Tetangga Terdekat”?

Temukan yang berada di dekat Anda. Kamu berlatih SQL Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.

Apakah aku perlu pengalaman untuk memulai SQL Academy?

Tidak diperlukan pengalaman sebelumnya. SQL Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 2 dari 4.

Berapa lama pelajaran “Jarak dan Tetangga Terdekat” memakan waktu?

Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.

Bisakah aku menulis dan menjalankan kode dalam pelajaran SQL Academy ini?

Ya. Setiap pelajaran SQL Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.

Semua pelajaran dalam kursus ini

  1. Jenis Data Spasial
  2. Jarak dan Tetangga Terdekat
  3. Penggabungan dan Pencakupan Spasial
  4. Indeks Spasial (GiST)
← Kembali ke SQL Academy