0Pricing
SQL Academy · Pelajaran

Penggabungan dan Pencakupan Spasial

Titik mana yang berada di area mana.

Penggabungan dan Pencakupan Spasial adalah pelajaran SQL Academy gratis di CoddyKit. Ini adalah pelajaran 3 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 JOIN Spasial

JOIN spasial menggabungkan dua tabel berdasarkan hubungan geografis, bukan berdasarkan kunci yang cocok. Alih-alih bertanya "apakah ID ini sama dengan ID itu?", Anda mengajukan pertanyaan seperti "apakah titik ini berada di dalam poligon itu?" atau "apakah kedua bentuk ini saling tumpang tindih?"

PostGIS memperluas PostgreSQL dengan tipe geometri dan fungsi spasial yang memungkinkan JOIN ini dilakukan. Hasilnya sama seperti JOIN SQL biasa — baris dari kedua tabel digabungkan — tetapi kondisinya bersifat geometris.

Menyiapkan Tabel Contoh

Mari buat dua tabel untuk digunakan: cities yang menyimpan lokasi titik, dan countries yang menyimpan batas poligon. Keduanya menggunakan tipe GEOMETRY dari PostGIS dengan SRID 4326 (lintang/bujur standar WGS84).

SRID (ID Referensi Spasial) memberi tahu PostGIS sistem koordinat yang harus digunakan. SRID 4326 adalah yang paling umum untuk data GPS.

CREATE TABLE countries (
  id     SERIAL PRIMARY KEY,
  name   TEXT NOT NULL,
  border GEOMETRY(POLYGON, 4326)
);

CREATE TABLE cities (
  id       SERIAL PRIMARY KEY,
  name     TEXT NOT NULL,
  location GEOMETRY(POINT, 4326)
);

Memasukkan Data Contoh

Kita akan menggunakan ST_GeomFromText untuk memasukkan nilai geometri dari format Teks Terkenal (WKT). WKT adalah representasi teks standar untuk geometri: POINT(lon lat) untuk titik dan POLYGON((...)) untuk poligon.

Perhatikan bahwa bujur ditulis sebelum lintang dalam WKT — ini sesuai dengan konvensi X, Y dalam matematika.

INSERT INTO countries (name, border) VALUES
  ('France', ST_GeomFromText('POLYGON((-5 42, 8 42, 8 51, -5 51, -5 42))', 4326)),
  ('Spain',  ST_GeomFromText('POLYGON((-9 36, 3 36, 3 44, -9 44, -9 36))', 4326));

INSERT INTO cities (name, location) VALUES
  ('Paris',    ST_GeomFromText('POINT(2.35 48.85)',   4326)),
  ('Madrid',   ST_GeomFromText('POINT(-3.70 40.42)',  4326)),
  ('Bordeaux', ST_GeomFromText('POINT(-0.58 44.84)',  4326)),
  ('Lisbon',   ST_GeomFromText('POINT(-9.14 38.72)',  4326));

ST_Contains: Fungsi Inti

ST_Contains(geometry A, geometry B) mengembalikan TRUE ketika geometri A sepenuhnya mencakup geometri B. Dalam kasus penggunaan kita, ST_Contains(country.border, city.location) mengembalikan nilai benar ketika titik kota berada di dalam poligon negara.

Inilah inti penggabungan berdasarkan pencakupan di PostGIS. Fungsi ini merupakan bagian dari standar OGC dan berfungsi untuk kombinasi tipe geometri apa pun.

SELECT
  ci.name  AS city,
  co.name  AS country
FROM   cities   ci
JOIN   countries co
  ON   ST_Contains(co.border, ci.location);

ST_Within: Sudut Pandang Terbalik

ST_Within(geometry A, geometry B) adalah kebalikan tepat dari ST_Contains: fungsi ini mengembalikan TRUE ketika geometri A sepenuhnya berada di dalam geometri B. ST_Within(city, country) secara logis identik dengan ST_Contains(country, city).

Kedua fungsi menghasilkan hasil yang sama di sini. Pilihan di antara keduanya bergantung pada keterbacaan — pilih yang terdengar lebih alami untuk kueri Anda.

-- These two queries return identical results:

-- Using ST_Contains (country contains city)
SELECT ci.name, co.name
FROM   cities ci
JOIN   countries co ON ST_Contains(co.border, ci.location);

-- Using ST_Within (city is within country)
SELECT ci.name, co.name
FROM   cities ci
JOIN   countries co ON ST_Within(ci.location, co.border);

Menggunakan LEFT JOIN untuk Menemukan Titik yang Tidak Cocok

JOIN biasa menghilangkan kota yang tidak berada di dalam poligon negara mana pun. Gunakan LEFT JOIN yang dipadukan dengan pemeriksaan WHERE ... IS NULL untuk menemukan titik yang tidak memiliki poligon pencakup — ini berguna untuk mendeteksi masalah kualitas data atau titik yang berada di luar area cakupan Anda.

SELECT
  ci.name  AS city,
  co.name  AS country
FROM   cities   ci
LEFT JOIN countries co
  ON   ST_Contains(co.border, ci.location)
ORDER BY co.name NULLS LAST;

Menghitung Titik per Poligon

Penggabungan spasial sangat bermanfaat jika dipadukan dengan agregasi. Dengan menggabungkan kota dengan negara lalu mengelompokkannya berdasarkan negara, Anda dapat menghitung jumlah titik yang berada di dalam setiap poligon. Pola ini sangat umum dalam analisis geografis — menghitung jumlah toko per wilayah, acara per distrik, sensor per zona, dan sebagainya.

SELECT
  co.name          AS country,
  COUNT(ci.id)     AS city_count
FROM   countries co
LEFT JOIN cities  ci
  ON   ST_Contains(co.border, ci.location)
GROUP BY co.name
ORDER BY city_count DESC;

Menggunakan Indeks Spasial untuk Kinerja

Penggabungan spasial dapat lambat pada himpunan data besar karena setiap titik diuji terhadap setiap poligon. Indeks GIST (Pohon Pencarian Umum) memungkinkan PostGIS menggunakan pra-filter kotak pembatas untuk melewati sebagian besar perbandingan sebelum menjalankan pengujian ST_Contains yang presisi.

Selalu buat indeks GIST pada kolom geometri yang digunakan untuk penggabungan atau penyaringan. Perencana kueri akan menggunakannya secara otomatis.

-- Create GIST indexes on both geometry columns
CREATE INDEX idx_countries_border
  ON countries USING GIST (border);

CREATE INDEX idx_cities_location
  ON cities USING GIST (location);

-- The same join now benefits from index acceleration
SELECT ci.name, co.name
FROM   cities ci
JOIN   countries co
  ON   ST_Contains(co.border, ci.location);

ST_Intersects: Geometri yang Saling Bertumpang Tindih

ST_Intersects(A, B) mengembalikan TRUE jika dua geometri memiliki titik yang sama — termasuk jika hanya bersentuhan pada batas. Fungsi ini lebih longgar daripada ST_Contains: dua poligon yang saling bertumpang tindih akan beririsan meskipun tidak ada yang sepenuhnya mencakup yang lain.

Untuk pengujian titik dalam poligon, ST_Intersects dan ST_Contains setara, tetapi ST_Intersects menggunakan indeks GIST dengan lebih efisien dan sering lebih disukai dalam praktik.

-- ST_Intersects is index-friendly and equivalent
-- to ST_Contains for point-in-polygon tests
SELECT
  ci.name  AS city,
  co.name  AS country
FROM   cities   ci
JOIN   countries co
  ON   ST_Intersects(co.border, ci.location);

Menggabungkan Titik dengan Poligon Terdekat

Ketika sebuah titik tepat berada di batas atau sangat dekat dengan beberapa poligon, Anda mungkin menginginkan poligon terdekat, bukan semua kecocokan. ST_Distance mengukur jarak antara dua geometri, sehingga memungkinkan pola ORDER BY + LIMIT atau penggabungan khusus LATERAL dengan ORDER BY ... LIMIT 1.

Ini disebut penggabungan tetangga terdekat dan umum digunakan saat menyesuaikan jejak GPS ke segmen jalan atau menetapkan titik ke wilayah terdekat.

-- For each city, find the single closest country centroid
SELECT DISTINCT ON (ci.name)
  ci.name                              AS city,
  co.name                              AS nearest_country,
  ST_Distance(ci.location, ST_Centroid(co.border)) AS dist
FROM   cities   ci
CROSS JOIN countries co
ORDER BY ci.name, dist;

Contoh Praktis: Restoran di Distrik

Berikut contoh realistis dari awal hingga akhir: menemukan distrik kota tempat setiap restoran berada, lalu menghitung jumlah restoran per distrik. Pola ini berlaku untuk skenario titik dalam poligon apa pun — ATM di lingkungan, kecelakaan di wilayah kepolisian, pesanan di zona pengiriman.

Kueri ini menggunakan ST_Within di dalam penggabungan spasial dan mengelompokkan hasil untuk laporan ringkasan.

-- Assume tables: districts(id, name, boundary GEOMETRY)
--                restaurants(id, name, location GEOMETRY)

SELECT
  d.name                 AS district,
  COUNT(r.id)            AS restaurant_count,
  STRING_AGG(r.name, ', ' ORDER BY r.name) AS names
FROM   districts    d
LEFT JOIN restaurants r
  ON   ST_Within(r.location, d.boundary)
GROUP BY d.name
ORDER BY restaurant_count DESC;

Pemeriksaan Singkat

Uji pemahaman Anda tentang penggabungan spasial dan pencakupan di PostGIS.

Rangkuman: Penggabungan Spasial dan Pencakupan

Dalam pelajaran ini, Anda mempelajari cara menjawab pertanyaan "titik mana yang berada di area mana?" menggunakan penggabungan spasial PostGIS.

Hal-hal penting:

  • ST_Contains(polygon, point) — mengembalikan nilai benar ketika poligon sepenuhnya mencakup titik.
  • ST_Within(point, polygon) — kebalikannya; secara logis setara dengan ST_Contains.
  • ST_Intersects — pengujian tumpang tindih yang lebih umum; ramah indeks untuk pengujian titik dalam poligon.
  • Indeks GIST pada kolom geometri sangat penting untuk kinerja dalam skala besar.
  • Padukan penggabungan spasial dengan GROUP BY untuk menghitung atau mengagregasikan titik per wilayah.
  • Gunakan LEFT JOIN untuk mendeteksi titik yang berada di luar semua poligon.

Penggabungan spasial memungkinkan analisis geografis dilakukan langsung di SQL — tanpa memerlukan alat GIS eksternal.

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Penggabungan dan Pencakupan Spasial” gratis?

Ya — teks lengkap “Penggabungan dan Pencakupan Spasial” 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 “Penggabungan dan Pencakupan Spasial”?

Titik mana yang berada di area mana. 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 3 dari 4.

Berapa lama pelajaran “Penggabungan dan Pencakupan Spasial” 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