Ervaringen bij weergave BRT + CBS + onderzoeksgegevens in Leaflet

Voor online weergave van gegevens behorende bij gemeentes en wijken maakte ik een Leaflet toepassing.
In de kaart worden de gemeentes en wijken uit de dataset CBS Wijken en Buurten (2019) geladen.


(GIF - 8MB)

De stijl en werking van de kaart is gebaseerd op Interactive Choropleth Map - Leaflet - a JavaScript library for interactive maps.

Ten behoeve van de snelheid van de weergave is de landelijke dataset voor gemeenten gedownload en zijn onnodige metagegevens verwijderd (55MB teruggebracht tot +/- 36MB).
Voor weergave van wijken wordt juist de WFS met bounding box toegepast om slechts de gegevens in te laden van de wijken die in de kaart zichtbaar zijn.

De desondanks behoorlijke datatransfers worden voor het oog versneld door de geojson op de leaflet map te streamen.

Een WMTS waarop de gegevens zijn ingetekend zou natuurlijk beter zijn, maar dat ligt buiten mijn expertise.

1) Verschil nieuwe service BRT-A
De gebruikte achtergrondkaart is de BRT-Achtergrondkaart grijs.
Vooralsnog laad ik die via de WMTS van geodata.nationaalregister.nl, tot 28 oktober.
De nieuwe service voor achtergrondkaarten van PDOK kaart toont de omliggende landen - en vooral de zee - minder mooi, vind ik. Waarom dat zo verschilt is mij onduidelijk. Weet iemand hier dat?

Zie https://open-roads.nl/wp-content/uploads/kaartverschil.jpg (PNG, 58KB)

Edit: ik lees hier meer.

2) Projectieconversies
Omdat ik geen GIS-specialist ben was het even zoeken naar een geschikt voorbeeld van conversie van projecties in deze context. Duidelijk was dat voor Leaflet Proj4Leaflet nodig is. Het duurde even voor ik duidelijk had dat voor een request met bounding box o.b.v. Leaflet zoiets als het volgende gebruikt kan worden (JavaScript):

var bngcoordsmin = proj4('EPSG:28992', [map.getBounds().getWest(), map.getBounds().getSouth()]); 
var bngcoordsmax = proj4('EPSG:28992', [map.getBounds().getEast(), map.getBounds().getNorth()]); 
var bngcoords = bngcoordsmin + ',' + bngcoordsmax;

var baseUrl = 'https://geodata.nationaalgeoregister.nl/wijkenbuurten2019/wfs';
var defaultParams = {
    service: 'WFS',
    version: '2.0.0',
    request: 'GetFeature',
    typeName: 'cbs_wijken_2019',
    srsName: 'EPSG:4326',
    outputFormat: 'application/json',
    bbox: bngcoords
}; 

return (baseUrl + L.Util.getParamString(defaultParams));

Hierbij neemt proj4 (door gebruik van één projectie parameter) aan dat WGS84 als uitgangspunt geldt.

‘EPSG:28992’ verwijst naar de CRS definitie die voor de Leaflet kaart is ingesteld:

var RD = new L.Proj.CRS( 'EPSG:28992','+proj=sterea +lat_0=52.15616055555555 +lon_0=5.38763888888889 +k=0.9999079 +x_0=155000 +y_0=463000 +ellps=bessel +units=m +towgs84=565.2369,50.0087,465.658,-0.406857330322398,0.350732676542563,-1.8703473836068,4.0812 +no_defs', 
  {
    resolutions: [3440.640, 1720.320, 860.160, 430.080, 215.040, 107.520, 53.760, 26.880, 13.440, 6.720, 3.360, 1.680, 0.840, 0.420, 0.210, 0.105, 0.0525, 0.02625, 0.013125],
    bounds: L.bounds([-285401.920, 903401.920], [595401.920, 22598.080]),
    origin: [-285401.920, 903401.920]
  }
);

3) Nice to have: BRT-A zonder labels, WMTS met alleen labels
Leaflet geeft met map panes de mogelijkheid om een kaart gelaagd op te bouwen.
Idealiter zou voor deze toepassing de BRT-A zónder labels als achtergrondkaart gebruikt worden en een WMTS service met enkel de labels op transparante tiles gebruikt worden om deze in een map pane op de voorgrond weer te geven.
Daar zouden nieuwe varianten van de BRT-A layers voor moeten worden gemaakt: voor elke stijl een extra layer zonder labels, en een layer met enkel de labels.

Ik ben benieuwd of deze bevindingen iemand op ideeën kunnen brengen.

Dankjewel voor het delen van je ervaring. Hierbij nog wat tips:

  • reduceer het aantal decimalen in de coördinaten. Dat kan je in QGIS bij de export naar GeoJSON instellen. Meestal is 6 meer dan voldoende voor gemeentekaartjes (maar dit heb je misschien al gedaan?)
  • detaillering in de geometrie van de gemeenten aanpassen. Dat kan je makkelijk doen met online tools als MapShaper of in je eigen scripts met TopoJSON Simplify.
  • niet GeoJSON maar TopoJSON gebruiken: dat voorkomt, dat je binnengrenzen tussen 2 gemeenten 2 keer opstuurt. Dat maakt de payload nog minder. TopoJSON maak je van GeoJSON met TopoJSON Client
  • Reduceer de nauwkeurigheid, waarmee de geografische coördinaten worden vertaald naar de “schermcoördinaten” die TopoJSON gebruikt. Dat doe je met TopoJSON Client met de optie “quantize”.

Dat zijn mooie tips, bedankt!!

Je vraagt nu aan de WFS EPSG:4326 json, maar de default van deze wfs is 28992 (GetCapabilities). Als je direct 28992 opvraagt (omdat je kaart ook al in 28992 is) scheelt dat weer herprojecteren.

Als laatste: er is een Luchtfoto Labels WMTS, misschien dat die iets voor je is? En ik meen dat er tussen de verschillende lagen van de Top10NL ook een labels of namen laag is, maar dat weet ik niet zeker.

@sbjager scherp! Dankjewel!

De luchtfoto labels ga ik eens testen, maar dan blijft denk ik nog steeds een ‘blanco’ (zonder labels) BRT-A een wens.
Voor Top10NL lukt het me eerlijk gezegd niet om zo’n laag te vinden. Ik hou me aanbevolen :slight_smile:

https://geodata.nationaalgeoregister.nl/top10nlv2/wms

Check de Capabilities, er zitten daar heel veel layers in als functioneelgebiedpuntlabel, geografischgebiedpuntlabelnaamfr, enzovoorts. Zijn goed te bekijken in de PDOK Viewer. Nadeel is wel dat ze 1:10.000 zijn, dus je moet wel even inzoomen als je 't over heel NL hebt. Vrijwel alle WFSsen en WMSsen van PDOK leveren EPSG:28992.

Overigens:

Helemaal mee eens. Met name als je 'm als ondergrond gebruikt voor je eigen data, en je wil je eigen labels hebben. Onze gegevens zijn landelijk, dus het is handig als onze eigen labels zichtbaar zijn en de rest niet (zodat je geen tekst door elkaar heen krijgt). Op dit moment lossen we dat op door de Top10NL te downloaden en klaar te zetten voor onze gebruikers, in twee aparte lagen: de kaartlaag en een label-laag. Die laatste staat standaard uit. Maar het zou ons een hoop beheer schelen als we dat rechtstreeks van PDOK zouden kunnen afnemen, dus ja, dat is ook voor mij zeker een wens.