Lewati ke isi
Profil penulisSeri Buku GIS Kehutanan dan Pertanian/ M2
Tampilkan bagian untuk:

BAB 1: Satu Gudang untuk Semua Peta: PostGIS dan Geodatabase Perusahaan

#Studi kasus: "Petak yang mana yang benar?"

Di folder bersama KPH Contoh ada tiga berkas petak: petak_v3, petak_FINAL, dan petak_revisi_baru. Dua rekan sama-sama menyunting dan saling menimpa. Kepala Seksi bertanya, "Yang resmi yang mana?" Tak ada yang bisa menjawab dengan pasti. Anda diminta membuat satu gudang data, dengan aturan dan jejak siapa mengubah apa.

#Konsep: basis data spasial dalam tiga kalimat

Basis data spasial adalah gudang data yang dijaga satu petugas, yaitu server. Berkas biasa seperti kertas di meja yang boleh dicoret siapa saja. Gudang data seperti lemari berkunci: ada rak, ada aturan, dan ada buku tamu.

Istilah baru bab ini:

  • PostGIS: tambahan untuk PostgreSQL yang memberi kemampuan menyimpan titik, garis, dan poligon.
  • Skema: "rak" di dalam basis data tempat tabel dikelompokkan.
  • SRID: nomor sistem koordinat yang menempel pada tiap geometri (untuk UTM 49S: 32749).
  • Indeks spasial: daftar isi yang membuat pencarian berdasarkan lokasi cepat.
  • Peran: kelompok hak akses, misalnya "boleh baca saja".
Ilustrasi 1.1: Dari berkas tersebar ke satu gudang data
Skema: tiga berkas petak yang saling bertentangan diganti satu server PostGIS yang dipakai QGIS, ArcGIS Pro, dan skrip Python

Dunia Esri memakai istilah geodatabase perusahaan (enterprise geodatabase) untuk gagasan serupa. Isinya tetap tabel di server basis data. Esri menambahkan fitur seperti domain, subtipe, dan penyuntingan berversi. PostGIS punya padanan untuk sebagian fitur itu, dan tidak untuk yang lain. Tabel di akhir bab menjelaskannya.

#Bagian A: QGIS

#Bagian A: Membangun gudang data dengan PostGIS dan QGIS

#A1. Menyiapkan basis data dan skema

Langkah ini dikerjakan pemilik server, bukan analis biasa. Anda memerlukan PostgreSQL dengan PostGIS terpasang. Basis data kosong bernama kph_contoh dibuat lebih dulu.

  1. Buka terminal. Buat basis data kosong:
terminal
createdb -h localhost -U postgres kph_contoh
  1. Jalankan berkas m2_01a_skema.sql dari folder skrip:
terminal
psql -h localhost -U postgres -d kph_contoh -f m2_01a_skema.sql

Hasilnya: ekstensi PostGIS aktif, skema kph ada, dan dua peran (pembaca, penyunting) siap dipakai. Isi pokok berkasnya:

sql
CREATE EXTENSION IF NOT EXISTS postgis;
CREATE SCHEMA IF NOT EXISTS kph;
CREATE ROLE pembaca NOLOGIN;
CREATE ROLE penyunting NOLOGIN;
GRANT USAGE ON SCHEMA kph TO pembaca, penyunting;
ALTER DEFAULT PRIVILEGES IN SCHEMA kph GRANT SELECT ON TABLES TO pembaca, penyunting;
ALTER DEFAULT PRIVILEGES IN SCHEMA kph GRANT INSERT, UPDATE, DELETE ON TABLES TO penyunting;

#A2. Memasukkan berkas ke tabel

Anda punya tiga cara. Pilih salah satu.

Cara 1: satu perintah `ogr2ogr`. Perintah ini membaca GeoPackage dan menulis tabel PostGIS. Contoh untuk petak:

terminal
ogr2ogr -f PostgreSQL PG:"dbname=kph_contoh" Petak.gpkg Petak -nln kph.petak -nlt MULTIPOLYGON -lco GEOMETRY_NAME=geom -lco FID=gid -overwrite

Keterangan singkat: -nln memberi nama tabel (kph.petak = skema.tabel), -nlt MULTIPOLYGON menyeragamkan jenis geometri, -lco GEOMETRY_NAME=geom menamai kolom bentuk, -lco FID=gid menamai kunci utama.

Cara 2: skrip Python. Berkas m2_01b_impor.py memasukkan ketujuh layer sekaligus:

terminal
python-qgis.bat m2_01b_impor.py D:\data\paket-m2

Hasil uji penulis: tujuh tabel terbentuk (petak, tanah, jalan, fasilitas, kejadian, stasiun_hujan, batas_wilayah).

Cara 3: alat Processing. Di QGIS buka Processing ► Toolbox, cari Export to PostgreSQL. Alat GDAL padanannya, Export to PostgreSQL (new connection), diuji lewat skrip m2_01c_qgis_muat.py dan menghasilkan tabel dengan jumlah baris yang sama.

#A3. Memeriksa isi gudang

Buka psql dan jalankan:

sql
SELECT f_table_name, srid, type
FROM geometry_columns
WHERE f_table_schema = 'kph'
ORDER BY 1;

Hasil uji: tujuh tabel, semuanya srid = 32749. Jenisnya MULTIPOLYGON untuk petak, tanah, dan batas wilayah, MULTILINESTRING untuk jalan, dan POINT untuk fasilitas, kejadian, dan stasiun hujan.

Periksa juga indeks spasial. ogr2ogr membuatnya otomatis:

sql
SELECT tablename, indexname FROM pg_indexes WHERE schemaname = 'kph' ORDER BY 1;

Hasil uji: 14 indeks, yaitu satu kunci utama dan satu indeks gist untuk tiap tabel.

#A4. Menambah aturan di dalam basis data

Aturan di basis data menolak data salah sebelum masuk. Ini padanan "domain" di geodatabase. Jalankan m2_01d_aturan_data.sql. Isi pokoknya:

sql
CREATE TABLE kph.ref_jenis_tegakan (jenis text PRIMARY KEY, keterangan text);
INSERT INTO kph.ref_jenis_tegakan VALUES ('Jati','Tectona grandis'), ('Mahoni','Swietenia'),
  ('Sengon','Falcataria'), ('Akasia','Acacia'), ('Lahan kosong','Belum ditanami');
ALTER TABLE kph.petak ADD CONSTRAINT petak_kode_unik UNIQUE (kode);
ALTER TABLE kph.petak ADD CONSTRAINT petak_jenis_fk
  FOREIGN KEY (jenis_tegakan) REFERENCES kph.ref_jenis_tegakan (jenis);
ALTER TABLE kph.petak ADD CONSTRAINT petak_tahun_wajar
  CHECK (tahun_tanam IS NULL OR tahun_tanam BETWEEN 1900 AND 2100);
ALTER TABLE kph.petak ADD CONSTRAINT petak_geom_sah CHECK (ST_IsValid(geom));

Sekarang coba memasukkan data yang salah. Hasil uji penulis:

PercobaanJawaban server
Jenis tegakan "Pinus" (tidak ada di daftar)ditolak: melanggar foreign key petak_jenis_fk
Titik dimasukkan ke kolom poligonditolak: Geometry type (Point) does not match column type (MultiPolygon)
Geometri ber-SRID 4326ditolak: Geometry SRID (4326) does not match column SRID (32749)
Kode P-01 dimasukkan dua kaliditolak: melanggar petak_kode_unik
Tahun tanam 3022ditolak: melanggar petak_tahun_wajar

Hasilnya: jumlah petak tetap 25. Gudang menjaga dirinya sendiri.

#A5. Menghubungkan QGIS

  1. Buka Layer ► Data Source Manager (Ctrl+L), lalu tab PostgreSQL.
  2. Klik New. Isi Name (misalnya KPH Contoh), Host, Port, dan Database (kph_contoh).
  3. Pada Authentication, pilih Basic, lalu isi nama pengguna dan kata sandi Anda sendiri. Simpan dalam konfigurasi otentikasi QGIS. [CEK: label menu]
  4. Klik Test Connection, lalu OK. Klik Connect.
  5. Buka skema kph, pilih tabel petak, lalu klik Add.

Hasilnya: layer petak muncul di peta dan tabel atributnya berisi 25 baris. Setiap penyuntingan Anda langsung tersimpan di server.

Lewat Python, layer yang sama dimuat begini (skrip m2_01c_qgis_muat.py):

python
from qgis.core import QgsDataSourceUri, QgsVectorLayer
uri = QgsDataSourceUri()
uri.setConnection("localhost", "5432", "kph_contoh", "analis", "")
uri.setDataSource("kph", "petak", "geom", "", "gid")
lyr = QgsVectorLayer(uri.uri(False), "Petak (PostGIS)", "postgres")
print(lyr.isValid(), lyr.featureCount())

Hasil uji: True 25. Dengan uri.setSql("jenis_tegakan = 'Jati'") jumlahnya menjadi 10. Kata sandi sengaja dikosongkan; QGIS akan menanyakannya.

#Bagian B: ArcGIS Pro

#Bagian B: ArcGIS Pro dan geodatabase perusahaan

Dokumentasi Esri menyebut alat Create Enterprise Geodatabase (kelompok Data Management Tools). Alat ini mendukung Oracle, PostgreSQL, dan SQL Server. Untuk PostgreSQL ada pilihan jenis ruang (Spatial Type): ST_Geometry atau PostGIS. Penulis membaca ini dari dokumentasi resmi, belum menjalankannya.

  1. Siapkan server PostgreSQL dan berkas otorisasi (keycodes) dari ArcGIS Server. [CEK]
  2. Jalankan Create Enterprise Geodatabase. Isi Database Platform (PostgreSQL), Instance, Database, pengelola basis data, pengelola geodatabase (umumnya sde), dan berkas otorisasi. [CEK: nama dan urutan kolom]
  3. Di panel Catalog, buat koneksi basis data baru ke server tersebut. [CEK]
  4. Salin feature class dari GeoPackage ke koneksi itu (klik kanan, Import). [CEK]
  5. Untuk aturan nilai, buat domain (alat Create Domain), lalu pasang ke kolom lewat Assign Domain To Field. [CEK]

Bila Anda memilih jenis ruang PostGIS, tabel dapat dibaca QGIS seperti pada Bagian A. Bila memilih ST_Geometry, QGIS tidak membacanya dengan cara yang sama. [CEK]

#Bagian C: ArcMap 10.8

#Bagian C: ArcMap 10.8

  1. Alat Create Enterprise Geodatabase juga dikenal di seri 10.x. [CEK: ada di 10.8 dan opsi PostgreSQL]
  2. Di ArcCatalog, buat koneksi lewat Database Connections ► Add Database Connection. [CEK]
  3. Seret feature class ke koneksi itu untuk mengimpornya. [CEK]
  4. Domain dibuat lewat properti geodatabase (Domains) atau alat Create Domain. [CEK]

#Cek paham

  1. Apa gunanya indeks spasial?
  2. Mengapa aturan seperti "jenis tegakan harus ada di daftar" lebih baik diletakkan di basis data daripada di formulir QGIS saja?
  3. Anda memasukkan data ber-SRID 4326 ke tabel ber-SRID 32749 dan ditolak. Apa arti penolakan itu?

Jawaban:

  1. Mempercepat pencarian berdasarkan lokasi. Tanpa indeks, server memeriksa semua baris satu per satu.
  2. Karena aturan di server berlaku untuk semua program dan semua orang, termasuk skrip. Aturan di formulir hanya berlaku bagi pemakai formulir itu.
  3. Basis data menjaga agar semua geometri satu tabel memakai satu sistem koordinat. Ubah dulu koordinatnya (reproyeksi), baru masukkan.

#Kesalahan umum

  • Memasukkan data tanpa memeriksa SRID. Letak petak bisa meleset ratusan kilometer. Periksa geometry_columns setelah impor.
  • Mencampur jenis geometri. GeoPackage mengizinkan poligon tunggal dan ganda dalam satu layer, PostGIS kolom bertipe tidak. Seragamkan dengan -nlt MULTIPOLYGON.
  • Menulis kata sandi di skrip yang dibagikan. Pakai pgpass atau variabel lingkungan.
  • Memberi semua orang hak penyunting. Beri hak baca saja kepada kebanyakan orang (Bab 7).

#Ringkasan dan latihan

Ringkasan: basis data spasial memusatkan data, menjaga aturan, dan melayani banyak pengguna. PostGIS menambahkan geometri ke PostgreSQL. Geodatabase perusahaan Esri adalah gagasan serupa dengan fitur tambahan.

Latihan: tambahkan tabel kph.ref_blok berisi Blok A, B, dan C. Pasang foreign key dari petak.blok. Coba masukkan "Blok Z" dan catat jawaban server.

#Tabel perbandingan: file dan server

HalGeoPackage (berkas)PostGISGeodatabase perusahaan Esri
Tempat datasatu berkasserver PostgreSQLserver (Oracle, PostgreSQL, SQL Server)
Banyak penyunting bersamaanterbatasyaya
Aturan nilaipembatas dan trigger, bentuk lain terbatasCHECK, FOREIGN KEY, triggerdomain, subtipe, relasi
Penyuntingan berversitidak adatidak bawaan (bisa dirancang sendiri, Bab 7)ada
Dibaca QGISyayaya untuk PostGIS, [CEK] untuk ST_Geometry