Buffers zijn een leuke uitdaging. Begint al bij het bepalen van ‘afstand’.
Geodata probeert punten op de aarde aan bepaalde coördinaten te koppelen. Dat is nog niet zo simpel al was het maar omdat de aarde geen mooie bol is.
De manier waarom je punten op de aarde definieert noemen ze de projectie aangeduid met een EPSG of SRID nummer
Een veel gebruikte benadering is die met lengte en breedte graad (longitude,latitude) waarbij je de plaats op aarde weergeeft door twee graden. Dit noemen ze SRID:4326
Met een lengte en breedte graad kun je echter geen afstanden bepalen. Ten eerste heb je de straal van de bol nodig maar dat daar doet SRID:4326 niet aan, daar is de eenheid van afstand de graad en afhankelijk van de plek op aarde en de looprichting is de afstand in meters dan telkens anders. In de SRID:4326 projectie kun je dus geen buffer rond een polygon in meters tekenen.
Nu kun je een projectie omzetten in een andere die wel in meters rekent. Zo gebruiken de kaarten van googlemaps en openstreetmap SRID:3857 een mercator projectie. Nu kun je wel in meters rekenen, alleen kloppen de afstanden niet overal op de aarde even goed. Het verschijnsel dat groenland veel te groot op de kaart staat.
Om goed te kunnen meten hebben veel landen/gebieden hun eigen SRID, zo kent Nederland de Rijksdriehoekscoördinaten (SRID:19914 is de actuelle verise). Dit is zo opgezet dat de fout tussen de aardbol en een kaartweergave/meting minimaal is voor Nederland.
Om van een polygon naar een polygon met buffer te komen heb je dus nodig:
Polygon -> SRID:3857 -> Buffer -> SRID:4326
Nu komt de volgende uitdaging.
Polygonen in openstreetmap zijn meestal vrij compact. Een klein gebouw doorgaans iets van 4 hoeken. Een complex wat meer, maar meer dan een tiental punten zal het niet zo gauw worden.
Als je voor een polygon een buffer maakt moet je bij elke punt een hoek om. Bij een vierkant is dat in totaal een hele cirkel. Omdat een cirkel uit oneindig veel punten bestaat moet he deze benaderen. Standaard wordt de cirkel ingedeeld in 30 segmenten (quadrantsegments). Dus een vierkant van vier punten levert minimaal 30 punten op. Een grillige vorm zou ook zomaar minder punten kunnen opleveren. Maar per saldo zal de database groeien.
Een oplossing voor dit om minder segmenten te gebruiken of om de polygon te versimpelen bijvoorbeeld met ST_SimplifyPreserveTopology. Als je hier te veel versimpelt ga je bochten afsnijden en blijf je niet buiten je oude poylgon. Dat is weer op te vangen door een ST_Union met de orginele polygon.
een waterpunt dat zich niet in een andere amenity bevind maar wel binnen een buffer van 1 meter.
https://goo.gl/maps/9UPaboTbWTV96va49