PostGIS gebruiken in ServBay: Geef PostgreSQL Georuimtelijke Kracht
PostGIS
is een krachtige extensie voor PostgreSQL die ondersteuning toevoegt voor geografische datatypes, functies en indexen. Dit betekent dat je met de database punten, lijnen, polygonen en andere geografische informatie kunt opslaan en complexe ruimtelijke query’s en analyses kunt uitvoeren. Voor ontwikkelaars die kaart-, locatiediensten of andere geografisch-gerelateerde webapps bouwen, is PostGIS onmisbaar.
ServBay is een lokale webontwikkelomgeving voor macOS en wordt standaard geleverd met het PostgreSQL-pakket, inclusief de PostGIS-extensie. Dit maakt het werken met PostGIS lokaal eenvoudig, zonder dat je handmatig hoeft te compileren of afhankelijkheden moet installeren.
Deze gids laat zien hoe je PostGIS in ServBay inschakelt en gebruikt, zodat je snel ruimtelijke functionaliteit aan je projecten toevoegt.
Vereisten
Voordat je van PostGIS gebruikmaakt, controleer je het volgende:
- Installeer en start ServBay: Zorg ervoor dat ServBay succesvol is geïnstalleerd op je macOS-systeem.
- Schakel het PostgreSQL-pakket in en start het: Controleer in het ServBay controlepaneel of het PostgreSQL-pakket is geactiveerd en draait. Zo niet, vink dan PostgreSQL aan in het controlepaneel en start het pakket.
- Verbind met de PostgreSQL database: Weet hoe je verbinding kunt maken met de PostgreSQL-database in ServBay, via de commandline-tool
psql
of een GUI-client zoals TablePlus of pgAdmin. Standaard kun je lokaal verbinden metpsql -U postgres
.
PostGIS Extensie Installeren en Activeren
ServBay wordt geleverd met de PostGIS-bestanden; je hoeft niets extra's te downloaden. Je hoeft de extensie alleen nog maar te activeren in de gewenste database.
Volg deze stappen om PostGIS te activeren:
Maak verbinding met de juiste PostgreSQL database: Open Terminal en gebruik
psql
om verbinding te maken. Vervangyour_username
door je databasegebruikersnaam (zoalspostgres
) enyour_database
door de naam van de database waarin je PostGIS wilt activeren.bashpsql -U your_username -d your_database
1Wil je dit direct in de standaard
postgres
database en gebruiker doen, voer dan:bashpsql -U postgres
1Maak de PostGIS-extensie aan in de database: Bij een geslaagde verbinding, voer je het volgende SQL-commando uit in de
psql
terminal:sqlCREATE EXTENSION postgis;
1Dit commando installeert en configureert alle objecten die PostGIS nodig heeft (zoals datatype, functies, operatoren) in de verbonden database.
Controleer of PostGIS is geïnstalleerd: In de
psql
terminal kun je met\dx
een lijst opvragen van alle geïnstalleerde extensies.sql\dx
1Als PostGIS correct is geactiveerd, zie je een regel met
postgis
en versienummer.List of installed extensions Name | Version | Schema | Description -----------+---------+------------+-------------------------------------------------------------- plpgsql | 1.0 | pg_catalog | PL/pgSQL procedural language postgis | 3.3.2 | public | PostGIS geometry and geography spatial types and functions (2 rows)
1
2
3
4
5
6(Let op: het versienummer van PostGIS kan verschillen afhankelijk van jouw ServBay-versie)
Nu is de PostGIS-extensie succesvol actief in je database en kun je de geografische mogelijkheden gaan gebruiken.
PostGIS-data Configureren
Na het activeren van PostGIS kun je nieuwe tabellen met geografische kolommen maken of bestaande tabellen uitbreiden. PostGIS biedt twee hoofdtypen ruimtelijke data: geometry
en geography
. geometry
is voor vlakke (cartesische) projecten, geography
voor bolvormige (aarde-)projecties — met name geschikt voor lengte- en breedtegraad.
Een tabel met ruimtelijke kolom aanmaken
Het voorbeeld hieronder laat zien hoe je een tabel locations
aanmaakt met een ruimtelijke kolom voor punten.
Tabel aanmaken: Voer het volgende uit in
psql
of je databaseclient:sqlCREATE TABLE locations ( id SERIAL PRIMARY KEY, name VARCHAR(100), geom GEOMETRY(Point, 4326) );
1
2
3
4
5GEOMETRY(Point, 4326)
: De kolomgeom
heeft als datatypGEOMETRY
.Point
geeft aan dat er punten in worden opgeslagen.4326
is de SRID (Spatial Reference Identifier) voor het WGS84-coördinatensysteem, de standaard voor GPS en veel online kaarten (zoals OpenStreetMap, Google Maps).- Je kunt natuurlijk ook andere typen (zoals
LineString
,Polygon
,MultiPoint
) en SRIDs gebruiken.
Voorbeelddata invoegen: Gebruik PostGIS-functies om geometrie toe te voegen. Met
ST_GeomFromText()
kun je een geometrie maken van een WKT (Well-Known Text) string.sqlINSERT INTO locations (name, geom) VALUES ('ServBay Hoofdkantoor', ST_GeomFromText('POINT(116.4074 39.9042)', 4326)), -- Voorbeeldcoördinaat Beijing ('ServBay Kantoor Shanghai', ST_GeomFromText('POINT(121.4737 31.2304)', 4326)); -- Voorbeeldcoördinaat Shanghai
1
2
3Let erop: de WKT-notatie
POINT(lon lat)
gebruikt lengtegraad gevolgd door breedtegraad.
Ruimtelijke indexen aanmaken
Voor tabellen met veel geografische data zijn ruimtelijke indexen essentieel, vooral voor queries met selectie op bereik, containments of dichtstbijzijnde buren. PostGIS gebruikt vooral GiST (Generalized Search Tree)-indexen.
Maak een GiST-index aan: Voer uit in
psql
of je databaseclient:sqlCREATE INDEX idx_locations_geom ON locations USING GIST (geom);
1Hiermee maak je een GiST-index aan op de
geom
kolom van de tabellocations
. PostgreSQL kan dan automatisch deze index gebruiken bij complexe ruimtelijke queries.
Ruimtelijke Query’s met PostGIS
PostGIS biedt honderden functies voor allerlei ruimtelijke operaties. Hier zijn een paar veelgebruikte voorbeelden:
Afstand tussen twee punten berekenen
Bereken de rechte lijn afstand tussen twee locaties.
sql
SELECT ST_Distance(
ST_GeomFromText('POINT(116.4074 39.9042)', 4326), -- Punt A
ST_GeomFromText('POINT(121.4737 31.2304)', 4326) -- Punt B
);
1
2
3
4
2
3
4
ST_Distance()
: Berekent de afstand tussen twee geometrieën. Als jegeometry
gebruikt met SRID 4326, is het resultaat een benadering in graden. Voor een nauwkeurige afstand in meters kun je beter het typegeography
gebruiken ofST_Distance(geography_a, geography_b, use_spheroid)
.
Containment / bevat-relatie
Test of een geometrie in een andere zit, bijvoorbeeld of een punt binnen een bepaald gebied (polygoon) valt.
sql
SELECT name FROM locations
WHERE ST_Contains(
ST_GeomFromText('POLYGON((116.0 39.0, 117.0 39.0, 117.0 40.0, 116.0 40.0, 116.0 39.0))', 4326), -- Rechthoekig gebied
geom
);
1
2
3
4
5
2
3
4
5
ST_Contains(geometry A, geometry B)
: Retourneert true als geometrie A volledig geometrie B bevat.
Dichtstbijzijnde buur vinden
Zoek de locatie het dichtst bij een bepaald punt (ideaal met GiST-index voor snelheid).
sql
SELECT name, ST_Distance(geom, ST_GeomFromText('POINT(116.4074 39.9042)', 4326)) AS distance
FROM locations
ORDER BY geom <-> ST_GeomFromText('POINT(116.4074 39.9042)', 4326)
LIMIT 5;
1
2
3
4
2
3
4
- De
<->
operator is een speciaal ‘afstand’steken in PostGIS dat, in combinatie met GiST-indexen, snelst de dichtstbijzijnde objecten zoekt.
Georuimtelijke Analyse met PostGIS
Naast basisquery’s biedt PostGIS krachtige analysemogelijkheden zoals buffering, intersectie en unie.
Bufferanalyse
Maak een buffer (gebied) rond een geometrie.
sql
SELECT ST_Buffer(geom, 0.01) -- Buffer van 0.01 graad ≈ 1,1 km
FROM locations
WHERE name = 'ServBay Hoofdkantoor';
1
2
3
2
3
ST_Buffer(geometry, distance)
: Maakt een buffer van opgegeven afstand. Voor SRID 4326 is de eenheid graad.
Intersectie-analyse
Bereken het overlappende deel van twee geometrieën.
sql
SELECT ST_Intersection(
ST_GeomFromText('POLYGON((116.0 39.0, 117.0 39.0, 117.0 40.0, 116.0 40.0, 116.0 39.0))', 4326),
geom
)
FROM locations
WHERE name = 'ServBay Hoofdkantoor';
1
2
3
4
5
6
2
3
4
5
6
ST_Intersection(geometry A, geometry B)
: Geeft het snijdende deel als nieuwe geometrie terug.
Uniefunctie
Voeg meerdere geometrieën samen tot één object.
sql
SELECT ST_Union(geom)
FROM locations;
1
2
2
ST_Union(geometry set)
: Combineert alle ingevoerde geometrieën.
Georuimtelijke Data Visualiseren
Geografische data uit PostGIS visualiseren is essentieel voor webontwikkeling. Dit kan met desktop GIS-software of web-mapping bibliotheken.
Desktop GIS-tools gebruiken (bv. QGIS)
QGIS is een populaire, open-source GIS desktopapplicatie die direct op PostGIS kan aansluiten.
Maak verbinding met PostgreSQL in ServBay:
- Open QGIS.
- Kies in het menu
Layer
→Add Layer
→Add PostGIS Layers...
- Klik in het venster op
New
om een nieuwe database-verbinding aan te maken. - Vul de gegevens in:
- Naam: Geef een naam, bijvoorbeeld
ServBay PostGIS
- Host:
localhost
of127.0.0.1
- Port: Standaard is PostgreSQL
5432
(ook in ServBay) - Database: De databasenaam waar je PostGIS gebruikt
- Gebruikersnaam: Je databasegebruiker (bv.
postgres
) - Wachtwoord: Het wachtwoord (als je dat hebt ingesteld)
- Naam: Geef een naam, bijvoorbeeld
- Klik op
Test Connection
om te controleren of het werkt. - Klik op
OK
om op te slaan, en daarna opConnect
.
Laad de ruimtelijke data:
- Je ziet alle tabellen in de database.
- Zoek een tabel met een ruimtelijke kolom (zoals
locations
). QGIS herkent deze automatisch. - Selecteer de gewenste tabel, klik
Add
en danClose
. Je data verschijnt nu in de QGIS-kaart.
Web mapping bibliotheken gebruiken (bv. Leaflet)
Met JavaScript-mapping libraries als Leaflet, OpenLayers, Mapbox GL JS kun je via een backend data uit PostGIS in je website weergeven. Hier volgt een basaal Leaflet-voorbeeld om een eenvoudige kaart in HTML te tonen. Je hebt een backend (bijv. PHP, Node.js, Python — allemaal ondersteund door ServBay) nodig om data uit PostGIS als GeoJSON naar de frontend te sturen.
Plaats het onderstaande HTML-bestand in een submap van ServBay’s webroot (standaard /Applications/ServBay/www
, bijvoorbeeld /Applications/ServBay/www/postgis-map/index.html
). Open de lokale site in ServBay (bv. postgis-map.servbay.demo
).
html
<!DOCTYPE html>
<html>
<head>
<title>ServBay PostGIS Leaflet Voorbeeld</title>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="https://unpkg.com/leaflet/dist/leaflet.css" />
<script src="https://unpkg.com/leaflet/dist/leaflet.js"></script>
<style>
#map { height: 400px; width: 100%; } /* Stel de grootte van de kaartcontainer in */
</style>
</head>
<body>
<h1>PostGIS Datavisualisatie Voorbeeld (Leaflet)</h1>
<div id="map"></div>
<script>
// Initialiseer de kaart, stel het middelpunt en zoomniveau in
// Voorbeeld: centrum bij Beijing
var map = L.map('map').setView([39.9042, 116.4074], 10);
// Voeg een OpenStreetMap-laag toe
L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {
attribution: '© OpenStreetMap contributors'
}).addTo(map);
// Voorbeeld: handmatig een marker toevoegen (in echte app dynamisch via PostGIS-data)
// Dit punt correspondeert met de 'ServBay Hoofdkantoor'-voorbeelddata
var marker = L.marker([39.9042, 116.4074]).addTo(map)
.bindPopup('<b>ServBay Hoofdkantoor</b><br>Voorbeeldlocatie')
.openPopup();
// In je project kun je via Ajax bijvoorbeeld PostGIS data als GeoJSON inladen:
/*
fetch('/api/locations') // Veronderstel dat je backend een /api/locations GeoJSON-endpoint heeft
.then(response => response.json())
.then(data => {
L.geoJSON(data).addTo(map);
});
*/
</script>
</body>
</html>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
Dit is een basisvoorbeeld. Om daadwerkelijk data uit PostGIS te laden, schrijf je backend-code die de database uitleest, ruimtelijke data in GeoJSON omzet en deze aanbiedt via HTTP aan de frontend. ServBay is flexibel en ondersteunt diverse backendtalen hiervoor.
Veelgestelde Vragen (FAQ)
Q: Ik krijg een foutmelding bij
CREATE EXTENSION postgis;
. Wat moet ik doen?- A: Controleer eerst of je bent verbonden met de juiste PostgreSQL-database als een gebruiker met extensie-rechten (meestal
postgres
). Ook moet het PostgreSQL-pakket in ServBay actief zijn. Blijft het probleem? Bekijk de logs van ServBay en PostgreSQL voor meer details.
- A: Controleer eerst of je bent verbonden met de juiste PostgreSQL-database als een gebruiker met extensie-rechten (meestal
Q: Wat is SRID 4326? Kan ik andere SRID’s gebruiken?
- A: Een SRID (Spatial Reference Identifier) is een uniek nummer voor een coördinaatreferentiesysteem. 4326 staat voor WGS84, het standaard systeem voor lengte-/breedtegraad op webkaarten. Ja, je kunt ook andere SRID’s gebruiken, zoals Web Mercator (3857). De juiste keuze hangt af van je data en toepassing. Voor webweergave zijn 4326 of 3857 de standaardkeuzes.
Q: Wat is het verschil tussen
geometry
engeography
types?- A:
geometry
werkt op een plat (cartesisch) vlak: afstanden/oppervlakken zijn euklides.geography
is voor bolvormig (aarde), met lengte-/breedtegraad: berekeningen houden rekening met aardkromming: preciezer, vooral bij grotere afstanden. Voor kleine gebieden of eenvoudige bewerkingen isgeometry
vaak sneller. Voor nauwkeurige wereldwijde analyses gebruik jegeography
.
- A:
Samenvatting
PostGIS geeft PostgreSQL krachtige ruimtelijke data-analyse en is de basis voor location-aware applicaties. Via ServBay kun je PostGIS eenvoudig lokaal op macOS inzetten, zonder ingewikkelde installatie.
Deze handleiding beschrijft het activeren van de extensie in ServBay, het aanmaken en beheren van ruimtelijke data, het uitvoeren van veelgebruikte queries en analyses, en geeft een korte introductie tot visualisatie. Met deze kennis kun je meteen aan de slag met het bouwen van geavanceerde georuimtelijke webapps in ServBay. Duik in de PostGIS-documentatie voor nog veel meer krachtige functies en mogelijkheden!