BAB 7: Menyatukan dan Menjaga: Proyek Terpadu dan Tata Kelola
#Studi kasus: "Satu tabel untuk rapat besok"
Rapat perencanaan dimulai besok pagi. Kepala Seksi tidak mau membuka lima peta. Ia ingin satu tabel: tiap petak, berapa luas lahan sangat sesuai, berapa kejadian, berapa panjang sungai, dan berapa jauh dari kantor lewat jalan. Anda juga harus memastikan tabel itu aman: tidak bisa diubah sembarang orang, bisa dilacak bila ada perubahan, dan bisa dipulihkan bila server rusak.
#Konsep: dari analisis ke layanan data
Proyek terpadu menggabungkan hasil banyak analisis dalam satu kueri. Tata kelola menjaga gudang data tetap benar dari waktu ke waktu. Bayangkan perpustakaan: bukan hanya rak buku (data), tetapi juga kartu anggota (hak akses), buku tamu (jejak perubahan), dan salinan arsip di gedung lain (cadangan).
Istilah baru:
- Hak akses: siapa boleh membaca, siapa boleh mengubah.
- Trigger: aturan yang berjalan otomatis saat data diubah.
- Jejak perubahan (audit): catatan siapa mengubah apa dan kapan.
- Cadangan (backup): salinan data untuk memulihkan bila terjadi kerusakan.
- Pemulihan (restore): memasukkan kembali cadangan ke server.

#Bagian A: QGIS
#Bagian A: Proyek terpadu dan tata kelola di PostGIS
#A1. Menyiapkan bahan
Pastikan tabel berikut sudah ada di skema kph: petak, kejadian, jalan_ruas, jalan_simpul, fasilitas (Bab 1 dan 3), sungai (Bab 4), dan kesesuaian (Bab 6). Tabel terakhir dibuat dari poligon kelas kesesuaian:
ogr2ogr -f PostgreSQL PG:"dbname=kph_contoh" Kesesuaian_kelas.gpkg Kesesuaian_kelas -nln kph.kesesuaian -nlt MULTIPOLYGON -lco GEOMETRY_NAME=geom -lco FID=gid -overwriteHasil uji: lima baris (kelas 0 sampai 4). Luasnya sama dengan hasil raster: kelas 1 (S1) 67,33 ha dan jumlah semua 400,00 ha.
#A2. Lembar keputusan dengan satu kueri
Skrip m2_07a_lembar_keputusan.sql menggabungkan empat bahan memakai tabel sementara (CTE). Intinya:
CREATE TABLE kph.lembar_keputusan AS
WITH
s1 AS (SELECT p.gid, COALESCE(SUM(ST_Area(ST_Intersection(p.geom, k.geom))), 0) / 10000.0 AS s1_ha
FROM kph.petak p LEFT JOIN kph.kesesuaian k
ON k.kelas = 1 AND ST_Intersects(p.geom, k.geom) GROUP BY p.gid),
kej AS (SELECT p.gid, COUNT(e.gid) AS kejadian
FROM kph.petak p LEFT JOIN kph.kejadian e ON ST_Intersects(p.geom, e.geom) GROUP BY p.gid),
sg AS (SELECT p.gid, COALESCE(SUM(ST_Length(ST_Intersection(p.geom, r.geom))), 0) AS sungai_m
FROM kph.petak p LEFT JOIN kph.sungai r ON ST_Intersects(p.geom, r.geom) GROUP BY p.gid)
SELECT p.gid, p.kode, p.jenis_tegakan, p.geom,
ROUND(s1.s1_ha::numeric, 2) AS s1_ha, kej.kejadian, ROUND(sg.sungai_m::numeric, 0) AS sungai_m,
RANK() OVER (ORDER BY s1.s1_ha DESC) AS peringkat_s1
FROM kph.petak p JOIN s1 USING (gid) JOIN kej USING (gid) JOIN sg USING (gid);Berkas lengkapnya juga menambah kolom jarak_kantor_m. Jaraknya dihitung dengan pgr_dijkstraCost dari simpul terdekat Kantor KPH ke simpul terdekat titik di dalam tiap petak (ST_PointOnSurface). Hasil uji, lima teratas menurut S1:
| Peringkat | Petak | Jenis | Luas (ha) | S1 (ha) | S1 (%) | Kejadian | Sungai (m) | Jarak kantor (m) |
|---|---|---|---|---|---|---|---|---|
| 1 | P-05 | Jati | 19,17 | 11,97 | 62,5 | 6 | 182 | 1.580 |
| 2 | P-03 | Mahoni | 19,97 | 8,98 | 45,0 | 6 | 647 | 921 |
| 3 | P-08 | Jati | 15,85 | 4,51 | 28,4 | 9 | 452 | 547 |
| 4 | P-06 | Akasia | 13,56 | 4,25 | 31,3 | 4 | 437 | 1.317 |
| 5 | P-17 | Jati | 19,70 | 4,21 | 21,4 | 7 | 965 | 783 |
Pemeriksaan: jumlah kejadian semua petak 150 (cocok dengan tabel kejadian). Jumlah S1 dari poligon 67,31 ha, sedangkan dari raster 67,33 ha. Selisih 0,02 ha timbul karena poligon dipotong tepat di batas petak, sedangkan Zonal histogram menghitung sel menurut pusatnya.
Kueri pertanyaan rapat: petak dengan S1 minimal 40%, kejadian paling banyak 8, dan jarak lewat jalan paling jauh 1,5 km:
SELECT kode, jenis_tegakan, s1_persen, kejadian, jarak_kantor_m
FROM kph.lembar_keputusan
WHERE s1_persen >= 40 AND kejadian <= 8 AND jarak_kantor_m <= 1500
ORDER BY s1_persen DESC;Hasil uji: hanya P-03 (S1 45,0%, 6 kejadian, 921 m). P-05 yang S1-nya paling luas gugur karena jaraknya 1.580 m. Jawaban untuk Kepala Seksi: P-03 memenuhi semua syarat, P-05 menarik tetapi terlalu jauh dari kantor.
Tampilkan tabel ini di QGIS (layer dari PostGIS, kolom geom) dan beri simbologi menurut s1_persen. Itulah peta rapat Anda.
#A3. Hak akses: siapa boleh apa
Skrip m2_07b_tata_kelola.sql membuat dua akun contoh yang masing-masing masuk ke satu peran:
CREATE ROLE analis_baca LOGIN IN ROLE pembaca;
CREATE ROLE analis_edit LOGIN IN ROLE penyunting;
GRANT SELECT ON ALL TABLES IN SCHEMA kph TO pembaca, penyunting;
GRANT INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA kph TO penyunting;Kata sandi tidak ditulis di skrip. Pada server nyata, atur dengan \password analis_baca di psql.
Hasil uji (m2_07c_uji_hak.sql, memakai SET ROLE):
| Akun | Percobaan | Hasil |
|---|---|---|
analis_baca | membaca jumlah petak | 25 |
analis_baca | mengubah jenis tegakan P-01 | ditolak: permission denied for table petak |
analis_edit | mengubah tahun tanam P-01 | berhasil (1 baris) |
#A4. Jejak perubahan
Esri punya penyuntingan berversi dan arsip. PostGIS tidak punya fitur bawaan yang setara. Versi sederhana dibuat dengan trigger yang menyalin baris lama ke tabel riwayat:
CREATE TABLE kph.riwayat_petak (id bigserial PRIMARY KEY, waktu timestamptz NOT NULL DEFAULT now(),
pengguna text NOT NULL DEFAULT current_user, aksi text NOT NULL, gid integer, baris_lama jsonb);
CREATE FUNCTION kph.catat_riwayat_petak() RETURNS trigger LANGUAGE plpgsql AS $f$
BEGIN
INSERT INTO kph.riwayat_petak (aksi, gid, baris_lama) VALUES (TG_OP, OLD.gid, to_jsonb(OLD) - 'geom');
IF TG_OP = 'DELETE' THEN RETURN OLD; END IF;
RETURN NEW;
END $f$;
CREATE TRIGGER petak_riwayat BEFORE UPDATE OR DELETE ON kph.petak
FOR EACH ROW EXECUTE FUNCTION kph.catat_riwayat_petak();Hasil uji: setelah analis_edit mengubah tahun tanam P-01, tabel riwayat mencatat satu baris: aksi UPDATE, pengguna analis_edit, kode P-01, tahun lama 2014. Nilai awal lalu dikembalikan dari catatan itu.
Batasannya jelas: ini hanya catatan nilai lama (tanpa bentuk geometri, karena - 'geom' membuangnya agar catatan ringan). Ini bukan penyuntingan berversi dengan cabang dan penggabungan. Bila Anda butuh versi penuh, itu salah satu alasan memilih geodatabase Esri.
#A5. Cadangan dan pemulihan
Skrip m2_07d_cadangan.sh mengerjakannya:
pg_dump -Fc -n kph -f kph_contoh.dump kph_contoh
createdb kph_pulih
psql -d kph_pulih -c "CREATE EXTENSION postgis" -c "CREATE EXTENSION pgrouting"
pg_restore -d kph_pulih kph_contoh.dump-Fc memilih format kustom yang terkompres, dan -n kph hanya mengambil skema kph. Ekstensi dibuat dulu di basis data tujuan.
Hasil uji: berkas cadangan 126.116 byte. Jumlah baris asal dan hasil pulih sama untuk enam tabel yang diperiksa (petak 25, kejadian 150, jalan 37, sungai 30, kesesuaian 5, lembar keputusan 25). Jumlah indeks juga sama (31) dan total luas petak sama (4.000.000 m²).
Satu aturan emas: cadangan yang belum pernah dicoba dipulihkan belum bisa disebut cadangan. Jadwalkan latihan pemulihan secara berkala.
#A6. Perawatan ringan
VACUUM ANALYZE;membersihkan sisa baris lama dan memperbarui statistik agar server memilih rencana kueri yang baik.- Periksa ukuran:
SELECT pg_size_pretty(pg_database_size('kph_contoh'));. - Setelah memasukkan data baru dalam jumlah besar, jalankan
ANALYZEpada tabel itu. [CEK]
#Bagian B: ArcGIS Pro
#Bagian B: ArcGIS Pro
Pada geodatabase perusahaan, tata kelola dipegang oleh fitur geodatabase dan alat administrasi:
- Hak akses: klik kanan feature class di panel Catalog, lalu atur Privileges, atau pakai alat Change Privileges. [CEK]
- Versi: Register As Versioned pada dataset, lalu penyunting bekerja di versi sendiri dan menggabungkannya dengan Reconcile Versions. Ini fitur yang tidak punya padanan bawaan di PostGIS. [CEK: nama alat dan jenis versi]
- Arsip: Enable Archiving mencatat riwayat perubahan. [CEK]
- Cadangan: dilakukan pada tingkat basis data (misalnya
pg_dumpuntuk PostgreSQL), bukan oleh Pro. [CEK] - Kueri gabungan seperti lembar keputusan dapat dijalankan di basis data lalu dibaca lewat Query Layer. [CEK]
#Bagian C: ArcMap 10.8
#Bagian C: ArcMap 10.8
- Hak akses lewat ArcCatalog ► klik kanan dataset ► Privileges. [CEK]
- Versi lewat Register as Versioned dan toolbar Versioning. [CEK]
- Arsip lewat Enable Archiving. [CEK]
- Cadangan dilakukan pada tingkat basis data, di luar ArcMap. [CEK]
#Ceklis kesiapan menuju M3 dan M4
Beri tanda bila Anda sudah bisa:
- Memuat data ke PostGIS dengan SRID benar dan indeks spasial.
- Menulis kueri dengan
ST_Intersects,ST_DWithin, dan<->. - Menyiapkan jaringan dan menghitung rute atau area layanan.
- Menurunkan sungai dan DAS dari DEM, lalu memeriksanya dengan hitungan lain.
- Membandingkan metode interpolasi dengan titik uji.
- Menyusun kesesuaian lahan dengan skor, bobot, kendala, dan uji kepekaan.
- Memberi hak akses, mencatat perubahan, dan mencoba memulihkan cadangan.
#Cek paham
- Mengapa
analis_bacabisa membaca tetapi tidak bisa mengubah? - Jumlah S1 dari poligon (67,31 ha) sedikit berbeda dari raster (67,33 ha). Mengapa itu tidak apa-apa?
- Apa kelemahan jejak perubahan buatan sendiri dibanding penyuntingan berversi?
Jawaban:
- Perannya hanya diberi hak
SELECT. Percobaan mengubah ditolak oleh server. - Dua cara menghitung memakai aturan berbeda untuk sel di batas petak. Selisih 0,02 ha dari 67 ha adalah wajar, dan jumlah kedua cara sama-sama sesuai luas wilayah.
- Ia hanya mencatat nilai lama. Tidak ada cabang, tidak ada penggabungan, dan tidak melacak bentuk geometri dalam contoh ini.
#Kesalahan umum
- Memberi semua orang peran penyunting. Beri hak baca saja kecuali yang memang perlu mengubah.
- Menyimpan kata sandi di skrip atau repositori. Pakai
pgpassatau variabel lingkungan. - Cadangan yang tidak pernah diuji pulih. Latihlah pemulihan.
- Lupa membuat ekstensi di basis data tujuan sebelum `pg_restore`. Tabel bergeometri kemungkinan gagal dibuat. [kemungkinan: tidak dicoba]
#Ringkasan dan latihan
Ringkasan: satu kueri dapat menyatukan hasil banyak analisis menjadi tabel keputusan. Gudang yang baik punya hak akses, jejak perubahan, dan cadangan yang teruji.
Latihan: buat peran tamu yang hanya boleh membaca tabel lembar_keputusan (bukan tabel lain). Uji dengan SET ROLE tamu.
#Tabel perbandingan: tata kelola
| Hal | PostGIS | Geodatabase perusahaan Esri |
|---|---|---|
| Hak akses | peran dan GRANT | Privileges pada dataset [CEK] |
| Jejak perubahan | trigger buatan sendiri | Enable Archiving [CEK] |
| Penyuntingan berversi | tidak bawaan | Register As Versioned [CEK] |
| Cadangan | pg_dump dan pg_restore | di tingkat basis data [CEK] |
| Kueri gabungan | SQL langsung | Query Layer [CEK] |