Dua chapter sebelumnya memperluas jangkauan PostgreSQL ke database lain. PostGIS memperluas sesuatu yang lebih mendasar: cara PostgreSQL memahami ruang. Aplikasi modern menyimpan koordinat di mana-mana — alamat pelanggan, posisi kurir, rute pengiriman, tapak gudang — dan menyimpannya sebagai dua kolom double precision (latitude, longitude) membuat pertanyaan paling wajar menjadi soal hitungan manual: berapa jarak kurir ini ke pelanggan? pelanggan mana yang berada dalam radius 3 km dari cabang? Poligon kota mana memuat titik ini? Extension PostGIS menjawab semua itu dengan menjadikan lokasi sebagai tipe data kelas satu: kolom bertipe geometry dan geography, ratusan fungsi ST_*, index spasial GiST, hingga dukungan raster dan topologi. Chapter ini memetakan kemampuannya secara jujur — karena PostGIS tidak terpasang di server kursus, kita membedahnya dari dokumentasi resmi tanpa mengklaim output palsu.

Apa yang Ditambahkan PostGIS #

PostGIS bukan sekadar kumpulan fungsi; extension ini melengkapi keempat lapisan PostgreSQL sekaligus. Ringkasannya sebagai berikut:

LapisanTambahan PostGISManfaatnya
Tipe datageometry (bidang datar) dan geography (bola bumi)Titik, garis, poligon, dan koleksinya hidup sebagai nilai kolom
FungsiSekitar seribu fungsi berawalan ST_Jarak, luas, irisan, penyanggaan, transformasi koordinat
IndexIndex spasial GiST pada kolom geometriQuery “dekat dengan” dan “beririsan dengan” yang cepat di jutaan baris
FormatRaster dan topologi (extension terpisah)Citra satelit dan jaringan bersisi (jalan, sungai)

Kombinasi keempatnya inilah yang membuat PostGIS disebut spatial database paling lengkap di dunia open source. Bandingkan dengan menyimpan latitude/longitude sebagai dua kolom biasa: tidak ada index yang mengerti kedekatan, tidak ada fungsi yang mengerti poligon, dan setiap perhitungan jarak harus ditulis manual — lengkap dengan jebakan matematisnya yang kita bahas di bagian SRID.

Status di Lingkungan Kursus #

Kejujuran dulu sebelum melangkah: paket PostGIS tidak ikut dipasang di server kursus, sehingga seluruh materi chapter ini berbasis dokumentasi resmi dan tidak ada contoh yang dijalankan di sini. Katalog membuktikan ketiadaannya langsung:

-- PostGIS tidak tersedia di server kursus: paket OS-nya tidak ikut
-- dipasang, sehingga tidak ada control file yang terbaca oleh katalog.
-- Query ini membuktikannya: tidak ada extension berawalan postgis.
SELECT name, default_version
FROM pg_available_extensions
WHERE name LIKE 'postgis%'
ORDER BY name;

Output yang Dihasilkan:

text
 name | default_version 
------+-----------------
(0 rows)

Hasil kosong itu bukan keanehan — ia persis pola dua langkah pemasangan dari chapter Memasang dan Mengaktifkan Extension : paket OS dulu, CREATE EXTENSION kemudian. Mencoba melompati langkah pertama menghasilkan error yang sama seperti kasus pgbuffercache di chapter itu:

-- Akibat langsung dari ketiadaan paket OS: CREATE EXTENSION postgis gagal
-- di langkah pertama. Pesan HINT-nya menunjuk tindakan yang benar --
-- pasang dulu paketnya di sistem operasi server, bukan di sisi klien.
CREATE EXTENSION postgis;

Output yang Dihasilkan:

text
psql:error-tidak-terpasang.sql:4: ERROR:  extension "postgis" is not available
DETAIL:  Could not open extension control file "/home/z/my-project/tools/dl/pgdeb/usr/share/postgresql/17/extension/postgis.control": No such file or directory.
HINT:  The extension must first be installed on the system where PostgreSQL is running.

Di server Anda yang telah memasang paket PostGIS, perintah yang sama justru berhasil — dan butuh waktu: CREATE EXTENSION postgis menjalankan ribuan definisi objek (tipe, fungsi, operator, tabel sistem koordinat), bukan sekadar puluhan seperti extension contrib ringan.

Memasang PostGIS di Server Anda #

Instalasi PostGIS menempuh dua lapisan yang sama dengan seluruh extension, hanya dengan paket yang jauh lebih gemuk karena membawa pustaka geometri proyeksi (PROJ) dan geodesi (GEOS):

  1. Pasang paket dari repositori PGDG sesuai versi major server Anda, misalnya untuk PostgreSQL 17 di Debian/Ubuntu:

    bash
    sudo apt install postgresql-17-postgis-3
  2. Pastikan server menemukan pustaka barunya, lalu jalankan pemasangan di database tujuan:

    sql
    CREATE EXTENSION postgis;
  3. Tambahkan extension pendamping hanya bila fiturnya dibutuhkan — postgis_topology untuk jaringan bersisi, postgis_raster untuk citra, postgis_sfcgal untuk operasi solid 3D.

  4. Verifikasi versi terpasang:

    sql
    SELECT postgis_full_version();

Langkah 4 itu memanggil fungsi versi milik PostGIS sendiri — outputnya mencantumkan versi PostGIS beserta versi GEOS dan PROJ yang tertaut, informasi penting saat melaporkan bug atau mencocokkan kompatibilitas.

geometry dan geography #

PostGIS menyediakan dua tipe untuk data lokasi, dan memilih di antara keduanya adalah keputusan arsitektural pertama setiap skema spasial. geometry menghitung di bidang datar (planar); geography menghitung di permukaan bola bumi dengan satuan meter:

Aspekgeometrygeography
Model perhitunganBidang datar (planar)Bola bumi (great circle)
Satuan jarak/luasMengikuti SRID proyeksi (bisa meter, bisa derajat)Selalu meter dan meter persegi
KecepatanLebih cepat — matematika bidang datarLebih lambat — perhitungan geodesi
Cocok untukData sudah terproyeksi, area kecil (kota/provinsi), analisis GIS penuhData GPS lintas bumi (SRID 4326), jarak antar kota
Index dan fungsiSeluruh arsenal ST_*Subset fungsi yang sadar bola

Aturan praktisnya ringkas: data GPS mentah dari perangkat (SRID 4326) yang hanya butuh jarak dan radius enak dipakai sebagai geography karena hasilnya langsung meter; analisis spasial berat — overlay poligon, pemotongan, jaringan — lebih cocok di geometry dengan proyeksi yang sesuai wilayah kerja. Ilustrasi berikut menunjukkan kedua gaya itu pada server dengan PostGIS terpasang (tidak dijalankan di server kursus):

sql
-- Ilustrasi pada server dengan PostGIS terpasang: jarak dua kota.
SELECT ST_Distance(
    'SRID=4326;POINT(106.8456 -6.2088)'::geography,   -- Jakarta
    'SRID=4326;POINT(107.6098 -6.9148)'::geography    -- Bandung
) AS jarak_meter;

Perhatikan penulisan SRID=4326;POINT(...) — literal geometri selalu membuka dengan SRID sebelum bentuk titiknya, dan cast ke geography mengaktifkan perhitungan bola bumi. Hasilnya sekitar 117 km, angka yang masuk akal untuk Jakarta–Bandung; perhitungan yang sama pada geometry ber-SRID 4326 justru menghasilkan derajat — jebakan yang kita bedah di bagian SRID.

Fungsi Inti ST_* #

Sebanyak apa pun fungsi yang disediakan, sejumlah kecil menutup mayoritas kebutuhan aplikasi. Tabel berikut enam fungsi yang paling sering muncul:

FungsiMengembalikanPertanyaan yang dijawabnya
ST_MakePoint(x, y)geometry titikMembuat titik dari dua angka (longitude dulu, baru latitude)
ST_Distance(a, b)double precisionBerapa jarak a ke b?
ST_DWithin(a, b, d)booleanApakah a berada dalam jarak d dari b? — bisa memakai index
ST_Intersects(a, b)booleanApakah a dan b bersentuhan/saling memotong?
ST_Within(a, b)booleanApakah a sepenuhnya berada di dalam b?
ST_Area(a)double precisionBerapa luas poligon a?

Dua catatan penting menyertai tabel itu. Pertama, urutan argumen ST_MakePoint adalah (x, y) = (longitude, latitude) — kebalikan dari kebiasaan menyebut “latitude, longitude” dalam percakapan, dan salah urut adalah bug klasik yang membuat titik Anda mendarat di laut. Kedua, ST_DWithin lebih baik daripada ST_Distance(...) <= d untuk radius search, karena ST_DWithin dapat memanfaatkan index spasial sedangkan perbandingan jarak memaksa penghitungan penuh. Pola geofencing — “apakah titik ini di dalam zona poligon?” — cukup memakai ST_Within atau ST_Intersects:

sql
-- Ilustrasi pada server dengan PostGIS terpasang: geofencing radius 3000 m.
SELECT nama_cabang
FROM cabang
WHERE ST_DWithin(lokasi,
                 'SRID=4326;POINT(106.8456 -6.2088)'::geography,
                 3000)
ORDER BY nama_cabang;

Tetangga Terdekat dengan Operator <-> #

Pertanyaan “lima depot terdekat dari pelanggan ini” adalah varian pencarian spasial yang paling sering dibutuhkan aplikasi ojek-online dan kurir. Operator jarak <-> memecahnya secara efisien: dengan index GiST pada kolom geometri, ORDER BY kolom <-> titik LIMIT 5 hanya menelusuri index — nearest neighbor search bawaan GiST — alih-alih menghitung jarak ke seluruh baris:

sql
-- Ilustrasi pada server dengan PostGIS terpasang: 5 depot terdekat
-- dari titik pelanggan di Jakarta.
CREATE INDEX idx_depot_lokasi ON depot USING gist (lokasi);

SELECT nama,
       ST_Distance(lokasi, 'SRID=4326;POINT(106.8456 -6.2088)'::geography) AS jarak_meter
FROM depot
ORDER BY lokasi <-> 'SRID=4326;POINT(106.8456 -6.2088)'::geography
LIMIT 5;

Index GiST yang dipakai di sini adalah infrastruktur yang sama dengan yang dibahas tuntas di chapter GiST Index — hanya saja kunci entri-nya kini bentuk geometri. Itu contoh nyata bagaimana extension menumpuk kemampuan inti server, bukan menggantikannya.

SRID dan Proyeksi Koordinat #

Setiap geometri membawa identitas sistem koordinatnya: SRID, nomor dari katalog EPSG yang menentukan arti angka-angka di dalamnya. SRID paling terkenal adalah 4326 — WGS84, koordinat GPS derajat yang dipakai Google Maps dan hampir seluruh API lokasi. Masalahnya: derajat bukan satuan jarak yang berarti. Satu derajat longitude di Jakarta (±111 km) berbeda panjangnya dari satu derajat di Ambon, dan ST_Distance pada geometry 4326 mengembalikan derajat mentah — angka yang tidak bisa dibandingkan dengan “kilometer” tanpa keajaiban trigonometri.

Dua jalan keluarnya membentuk pilihan arsitektural dari bagian geometry/geography di atas: gunakan geography yang menghitung meter langsung di atas koordinat 4326, atau proyeksikan data ke SRID lokal yang satuan meter dengan ST_Transform:

sql
-- Ilustrasi pada server dengan PostGIS terpasang: reproyeksi ke UTM zona 48S
-- (meter, mencakup wilayah Indonesia barat) lalu hitung luas dalam meter persegi.
SELECT ST_Area(
    ST_Transform(batas_kecamatan, 32748)
) AS luas_m2
FROM kecamatan
WHERE nama = 'Menteng';

Fungsi ST_Transform(geom, srid_tujuan) mengubah koordinat dari SRID asal ke SRID tujuan — pekerjaan yang di belakang layar dikerjakan pustaka PROJ. Pilih zona UTM yang menaungi wilayah kerja Anda (Indonesia terbagi beberapa zona), lalu seluruh perhitungan jarak dan luas berjalan dalam meter. Campur SRID dalam satu operasi ditolak dengan error — PostGIS tidak pernah menebak transformasi yang tidak Anda minta.

Pemakaian di Dunia Nyata #

DomainPola spasial yang jadi tulang punggung
Aplikasi ojek-online dan kurirNearest neighbor (<->) penjemputan, radius ST_DWithin penugasan
Geofencing armadaPoligon zona + ST_Within untuk alarm masuk-keluar area
Analitik demografiJoin spasial titik-ke-poligon: pelanggan ke kecamatan, polling ke dapil
Peta dan dashboardMenyajikan GeoJSON langsung dari query, tanpa ETL ke sistem peta terpisah
Utility dan telekomJaringan pipa/kabel sebagai topologi, overlay tapak dengan batas administratif

Kesamaannya: semua domain menyimpan lokasi sebagai data first-class — bisa di-index, di-join, dan diagregasi — alih-alih sepasang kolom angka yang harus dihidupkan oleh kode aplikasi.

PostGIS menutup seri bedah extension satu per satu. Jumlahnya di ekosistem nyata jauh lebih besar — ribuan — dan tiap kandidat membawa pertanyaan yang sama: siapa yang merawatnya, kompatibel dengan versi PostgreSQL Anda sampai kapan, dan apa yang terjadi saat server naik major version. Chapter penutup section ini merangkum pertanyaan-pertanyaan itu menjadi kerangka evaluasi extension sebelum dipasang.

Referensi #

Berkas Sumber

Berkas pendukung halaman ini dapat diunduh dan dijalankan langsung sesuai penjelasan di atas.

cek-ketersediaan.sql

Unduh berkas
sql
-- PostGIS tidak tersedia di server kursus: paket OS-nya tidak ikut
-- dipasang, sehingga tidak ada control file yang terbaca oleh katalog.
-- Query ini membuktikannya: tidak ada extension berawalan postgis.
SELECT name, default_version
FROM pg_available_extensions
WHERE name LIKE 'postgis%'
ORDER BY name;

error-tidak-terpasang.sql

Unduh berkas
sql
-- Akibat langsung dari ketiadaan paket OS: CREATE EXTENSION postgis gagal
-- di langkah pertama. Pesan HINT-nya menunjuk tindakan yang benar --
-- pasang dulu paketnya di sistem operasi server, bukan di sisi klien.
CREATE EXTENSION postgis;