PostGIS untuk Penyimpanan & Query Geospasial

Pendahuluan

Dalam modul ini Anda akan mempelajari bagaimana membangun, mengelola, dan mengeksekusi query geospasial menggunakan PostGIS untuk kebutuhan analisis jaringan perbankan yang skalanya besar—mulai dari ribuan titik cabang, ATM, kompetitor, hingga dataset administratif dan demografi berukuran puluhan gigabyte.

PostGIS adalah standar emas untuk penyimpanan data geospasial di level enterprise karena mendukung:

  • Query spasial super cepat menggunakan indeks GiST/BRIN.
  • Integrasi mudah dengan GIS desktop (QGIS, ArcGIS).
  • Analisis spasial kompleks yang tidak mungkin dilakukan hanya dengan Python atau GIS desktop.
  • Kemampuan automasi dengan SQL murni, API, dan microservices.

Prasyarat / Alat yang Dibutuhkan:

  • PostgreSQL + PostGIS (versi 14/15 disarankan)
  • PGAdmin atau DBeaver
  • File SHP/GeoJSON titik cabang dan ATM
  • Data kompetitor, batas administrasi, demografi
  • Pengetahuan dasar SQL
  • (Opsional) QGIS untuk visualisasi cepat

Langkah-langkah Utama


1. Menginstal & Mengaktifkan PostGIS di Database

Anda akan membuat database baru dan mengaktifkan ekstensi PostGIS.

Instruksi Detail

  1. Buat database baru: CREATE DATABASE geobank; (Visual Hint: PGAdmin → menu Create Database)
  2. Masuk ke database: \c geobank;
  3. Aktifkan PostGIS: CREATE EXTENSION postgis; CREATE EXTENSION postgis_topology; (Visual Hint: PGAdmin menampilkan PostGIS di daftar Extensions)

Tip:
Selalu aktifkan postgis_topology hanya jika Anda memerlukan topologi. Untuk analisis cepat, cukup postgis.


2. Mengimpor Data Geospasial ke PostGIS

Anda akan memuat dataset SHP/GeoJSON ke dalam tabel spasial PostGIS.

Instruksi Detail

  1. Gunakan shp2pgsql untuk mengimpor: shp2pgsql -I data/cabang.shp public.cabang | psql -d geobank (Visual Hint: Terminal menampilkan “Building geometry index… done”)
  2. Cek hasil data: SELECT COUNT(*), ST_GeometryType(geom) FROM cabang; (Visual Hint: PGAdmin menampilkan jumlah baris + tipe geometry)
  3. Jika menggunakan GeoJSON: SELECT * FROM json_populate_recordset(NULL::public.cabang, '...geojson...');

Peringatan Penting:
Pastikan kolom geometri bernama geom, bukan geometry, the_geom, dsb—standarisasi ini memudahkan automasi di Python & API.


3. Menstandarkan CRS dan Struktur Data

Anda akan memastikan seluruh data berada dalam CRS yang sama agar query akurat.

Instruksi Detail

  1. Cek CRS: SELECT Find_SRID('public', 'cabang', 'geom');
  2. Jika salah/different CRS → reproject: ALTER TABLE cabang ALTER COLUMN geom TYPE geometry(Point, 4326) USING ST_Transform(geom, 4326); (Visual Hint: Map preview menunjukkan perubahan koordinat)
  3. Tambahkan kolom standar: ALTER TABLE cabang ADD COLUMN status TEXT DEFAULT 'active';

Tip Profesional:
Gunakan EPSG:4326 untuk API dan integrasi, serta EPSG:3857/23830 untuk perhitungan jarak presisi.


4. Melakukan Query Spasial Inti (Buffer – Join – Distance)

Ini adalah inti dari analisis enterprise menggunakan PostGIS.

Instruksi Detail


4.1. Menghitung Buffer Kompetitor

SELECT id,
       ST_Buffer(geom::geography, 500)::geometry AS geom_buffer
FROM kompetitor;

(Visual Hint: Lingkaran buffer muncul di panel GIS viewer)

Catatan:
Gunakan geography untuk jarak meter akurat.


4.2. Spatial Join: Cabang vs Kompetitor

Hitung apakah sebuah cabang berada dalam radius 500m kompetitor.

SELECT c.id AS cabang_id,
       COUNT(k.id) AS jumlah_kompetitor
FROM cabang c
LEFT JOIN kompetitor k
ON ST_DWithin(c.geom::geography, k.geom::geography, 500)
GROUP BY c.id;

(Visual Hint: Tabel dengan kolom jumlah_kompetitor)


4.3. Join Administrasi (Within Polygon)

SELECT c.id,
       a.kecamatan,
       a.kabupaten
FROM cabang c
JOIN administrasi a
ON ST_Within(c.geom, a.geom);

(Visual Hint: Map overlay titik → polygon)


4.4. Menghitung Jarak ke Cabang Terdekat

SELECT c1.id,
       MIN(ST_Distance(c1.geom::geography, c2.geom::geography)) AS jarak_terdekat
FROM cabang c1
JOIN cabang c2 ON c1.id != c2.id
GROUP BY c1.id;

Peringatan:
Query ini berat untuk dataset besar. Gunakan KNN index (<->) untuk performa tinggi.

SELECT c1.id, c2.id, c1.geom <-> c2.geom AS knn_distance
FROM cabang c1
ORDER BY knn_distance
LIMIT 1;

5. Mengoptimalkan Kinerja dengan Spatial Index

Performance adalah kunci untuk enterprise banking analytics.

Instruksi Detail

  1. Tambahkan index GiST: CREATE INDEX idx_cabang_geom ON cabang USING GIST(geom);
  2. Tambahkan index BRIN untuk dataset demografi besar: CREATE INDEX idx_demo_geom ON demografi USING BRIN(geom);
  3. Analisa tabel: VACUUM ANALYZE cabang;

(Visual Hint: PGAdmin Query Tool menampilkan status “VACUUM COMPLETE”)

Tip Kecepatan:
Gunakan ST_DWithin + index GiST untuk query radius—super cepat, enterprise-level.


6. Membuat View Spasial untuk Dashboard & Machine Learning

Anda akan membuat pipeline view yang siap dipakai BI Analyst / Data Scientist.

Instruksi Detail

  1. Buat view potensi cabang: CREATE VIEW vw_potensi_cabang AS SELECT c.id, a.kecamatan, d.pop_density, d.income_index, k.jumlah_kompetitor, (d.pop_density*0.5 + d.income_index*0.3 - k.jumlah_kompetitor*0.2) AS score FROM cabang c LEFT JOIN administrasi a ON ST_Within(c.geom, a.geom) LEFT JOIN demografi d ON ST_Within(c.geom, d.geom) LEFT JOIN ( SELECT c.id, COUNT(k.id) AS jumlah_kompetitor FROM cabang c LEFT JOIN kompetitor k ON ST_DWithin(c.geom::geography, k.geom::geography, 500) GROUP BY c.id ) k ON c.id = k.id; (Visual Hint: View baru muncul di Schema Viewer)
  2. Gunakan view ini untuk dashboard & model prediktif.

Ringkasan Modul

  1. PostGIS memberikan infrastruktur geospasial paling kuat untuk perusahaan perbankan, cocok untuk skala data besar.
  2. Query spasial inti (buffer, distance, spatial join) dapat dijalankan otomatis dan jauh lebih cepat dibanding desktop GIS.
  3. Membuat view terstandarisasi membantu membangun pipeline analisis, BI, dan machine learning tanpa repot.

Tugas Praktis (Untuk Siswa)

Buat workflow PostGIS berikut:

  1. Buat database + aktifkan PostGIS.
  2. Import dataset cabang, kompetitor, dan administrasi.
  3. Buat spatial index untuk semua layer.
  4. Hitung:
    • Buffer kompetitor 300m
    • Spatial join cabang vs kompetitor
    • Join cabang vs administrasi
    • Jarak antar cabang terdekat
  5. Buat view vw_cabang_score dengan formula scoring sederhana.