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.