Skip to content

Instantly share code, notes, and snippets.

@TWIAV
Last active May 21, 2022 09:42
Show Gist options
  • Save TWIAV/5790f76fa84ea2b19aab to your computer and use it in GitHub Desktop.
Save TWIAV/5790f76fa84ea2b19aab to your computer and use it in GitHub Desktop.
PDOK TMS and WFS shown in Leaflet using proj4.js/proj4leaflet.js

A web application based on Leaflet showing Dutch public data from PDOK.

  • TMS Backgound map: BRT achtergrondkaart
  • TMS Aerial photo - please note this aerial photo can be used for non-commercial uses only (CC-BY-NC)
  • WFS National Parks

This example relies heavily on a gist published by Edward Mac Gillavry (Webmapper): Leaflet.js showing TMS in RD and WFS in WGS-84 - gist and block.

This example has been extended a little bit with a layer control and tooltips showing attribute information on the WFS layer.

<!DOCTYPE html>
<html>
<head>
<title>TWIAV - Onderzoek &amp; Advies</title>
<link rel="SHORTCUT ICON" href="http://twiav.nl/img/twiav.ico"/>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<meta name="author" content="Egge-Jan Pollé">
<link rel="stylesheet" href="http://cdn.leafletjs.com/leaflet/v0.7.7/leaflet.css" />
<style>
body {
font-family: Arial, Helvetica, sans-serif;
padding-bottom: 40px;
}
/* ---- Header ---- */
header {
width: 900px;
margin: 0 auto;
}
header h1 {
font-size: 35px;
font-weight: bold;
color: #3366CC;
}
header p {
margin: 20px 0 0 3px;
font-size: 14px;
color: #272727;
}
/* ---- Main Area ---- */
#main {
position: relative;
width: 900px;
margin: 0 auto;
}
#map {
width: 800px;
height: 800px;
border: 2px solid #CCCCCC;
margin-top: 25px;
}
</style>
</head>
<body>
<header>
<h1>Nationale Parken in Nederland</h1>
</header>
<div id="main">
<div id="map"></div>
<br>
</div>
<script src="https://cdnjs.cloudflare.com/ajax/libs/proj4js/2.3.12/proj4.js"></script>
<script src="http://cdn.leafletjs.com/leaflet/v0.7.7/leaflet.js"></script>
<script src="https://cdn.rawgit.com/emacgillavry/Proj4Leaflet/master/src/proj4leaflet.js"></script>
<script>
// Definitie Rijksdriehoekstelsel (EPSG:28992)
var EPSG28992 = new L.Proj.CRS.TMS( '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', [-285401.92, 22598.08, 595401.9199999999, 903401.9199999999], {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]});
var map = new L.Map('map', {
crs: EPSG28992
});
// BRT achtergrondkaart:
var brtachtergrond = new L.TileLayer('http://geodata.nationaalgeoregister.nl/tms/1.0.0/brtachtergrondkaart/{z}/{x}/{y}.png', {
tms: true,
minZoom: 3,
maxZoom: 13,
attribution: 'BRT achtergrondkaart: © <a href="http://www.kadaster.nl">Kadaster</a>, Basisregistratie Topografie (BRT) - <a href="http://creativecommons.org/licenses/by/4.0/">CC-BY</a>',
continuousWorld: true
}).addTo(map);
// Luchtfoto (PDOK-achtergrond):
var lufo = new L.TileLayer('https://geodata1.nationaalgeoregister.nl/luchtfoto/tms/1.0.0/luchtfoto_png/EPSG28992/{z}/{x}/{y}.png', {
tms: true,
minZoom: 3,
maxZoom: 13,
attribution: 'Luchtfoto (PDOK-achtergrond): © <a title="Publieke Dienstverlening Op de Kaart" href="https://www.pdok.nl/">PDOK</a> - <a href="http://creativecommons.org/licenses/by-nc/3.0/nl/">CC-BY-NC</a>',
continuousWorld: true
}).addTo(map);
function styleL1(feature) {
return {
weight: 2,
opacity: 1,
color: '#cc0000',
fillOpacity: 0.70,
fillColor: '#008000'
};
}
function onEachFeatureL1(feature, layer) {
layer.on('mouseover', function(e) {
//open popup;
var popup = L.popup()
.setLatLng(e.latlng)
.setContent(feature.properties.naam)
.openOn(map);
});
}
var wfsLayer = L.geoJson(null, {
style: styleL1,
onEachFeature: onEachFeatureL1
}).addTo(map);
var baseLayers = {
"BRT achtergrondkaart (TMS)": brtachtergrond,
"Luchtfoto (TMS)": lufo
};
var overlays = {
"Nationale Parken (WFS)": wfsLayer
};
L.control.layers(baseLayers, overlays,{collapsed:false}).addTo(map);
// WFS endpoint:
var url = 'https://geodata.nationaalgeoregister.nl/';
url += 'nationaleparken';
url += '/ows?';
// Parameters voor het GeoJSON request:
var params = 'service=WFS&version=2.0.0&request=GetFeature&outputFormat=application/json&srsName=EPSG:4326';
// Deze parameters zijn per GeoJSON request aan te passen
params += '&typeName=nationaleparken';
// Alleen de velden met de naam en de geometrie
params += '&propertyName=naam,the_geom';
// Ajax zonder jQuery ;-)
var xhr = new XMLHttpRequest();
xhr.open('GET', encodeURI(url + params));
xhr.onload = function() {
if (xhr.status === 200) {
wfsLayer.addData(JSON.parse(xhr.responseText));
map.fitBounds(wfsLayer.getBounds());
}
else {
alert('Request failed. Returned status of ' + xhr.status);
}
};
xhr.send();
// Bronvermelding van de WFS:
wfsLayer.getAttribution = function() {
return 'nationale parken <a title="Publieke Dienstverlening Op de Kaart" href="https://www.pdok.nl/">PDOK</a>.';
}
</script>
</body>
</html>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment