Apa itu PostGIS?

PostGIS adalah extension (ekstensi) untuk PostgreSQL yang menambahkan kemampuan untuk menyimpan dan mengquery data spasial. PostGIS adalah standar industri untuk database geospasial.

Instalasi PostGIS

-- Aktifkan extension PostGIS di database
CREATE EXTENSION postgis;

-- Cek versi
SELECT PostGIS_Version();

Tipe Data Geometry

-- Membuat tabel dengan kolom geometry
CREATE TABLE lokasi (
    id SERIAL PRIMARY KEY,
    nama VARCHAR(100),
    deskripsi TEXT,
    geom GEOMETRY(Point, 4326)  -- SRID 4326 = WGS84
);

-- Insert data point
INSERT INTO lokasi (nama, geom) VALUES (
    'Kantor Pusat',
    ST_SetSRID(ST_MakePoint(116.1167, -8.5833), 4326)
);

-- Insert data polygon
CREATE TABLE wilayah (
    id SERIAL PRIMARY KEY,
    nama VARCHAR(100),
    geom GEOMETRY(Polygon, 4326)
);

INSERT INTO wilayah (nama, geom) VALUES (
    'Zona A',
    ST_GeomFromText('POLYGON((116.1 -8.5, 116.2 -8.5, 116.2 -8.6, 116.1 -8.6, 116.1 -8.5))', 4326)
);

Query Spasial Dasar

-- Hitung jarak antara dua titik (dalam meter)
SELECT ST_Distance(
    ST_Transform(a.geom, 32750),  -- UTM Zone 50S
    ST_Transform(b.geom, 32750)
) AS jarak_meter
FROM lokasi a, lokasi b
WHERE a.nama = 'Kantor Pusat' AND b.nama = 'Cabang 1';

-- Cari lokasi dalam radius 5 km
SELECT nama FROM lokasi
WHERE ST_DWithin(
    geom::geography,
    ST_SetSRID(ST_MakePoint(116.1167, -8.5833), 4326)::geography,
    5000  -- 5000 meter = 5 km
);

-- Cari titik yang berada di dalam polygon
SELECT l.nama FROM lokasi l, wilayah w
WHERE ST_Within(l.geom, w.geom) AND w.nama = 'Zona A';

-- Buffer analysis
SELECT ST_Buffer(geom::geography, 1000)::geometry AS buffer_1km
FROM lokasi WHERE nama = 'Kantor Pusat';

Integrasi dengan Django

# settings.py
DATABASES = {
    'default': {
        'ENGINE': 'django.contrib.gis.db.backends.postgis',
        'NAME': 'nama_database',
        'USER': 'postgres',
        'PASSWORD': 'password',
        'HOST': 'localhost',
    }
}

# models.py
from django.contrib.gis.db import models

class Lokasi(models.Model):
    nama = models.CharField(max_length=100)
    geom = models.PointField(srid=4326)
    
    class Meta:
        verbose_name_plural = "Lokasi"

# views.py - Query spasial
from django.contrib.gis.geos import Point
from django.contrib.gis.measure import D

# Lokasi dalam radius 5 km
titik = Point(116.1167, -8.5833, srid=4326)
lokasi_terdekat = Lokasi.objects.filter(geom__distance_lte=(titik, D(km=5)))

Keuntungan PostGIS

  • Performa query spasial sangat cepat dengan indexing.
  • Mendukung standar OGC (Open Geospatial Consortium).
  • Integrasi mudah dengan QGIS, Django GeoDjango, dan tools lain.
  • Gratis dan open source.