Select to view content in your preferred language

Aan de slag met ArcGIS JavaScript - Nederlandse basiskaart

889
3
05-11-2019 02:29 PM
Egge-Jan_Pollé
MVP Regular Contributor
0 3 889

https://raw.githubusercontent.com/TWIAV/Geografische_analyses_met_R/master/images/RD.png

ArcGIS API for JavaScript

In deze serie oefeningen gaan we - stapje voor stapje - een interactieve web applicatie bouwen met de ArcGIS API for JavaScript van Esri.

De focus in deze cursus ligt op Nederland. We maken hierbij gebruik van data van Esri Nederland die via ArcGIS Online aangeboden worden.

Natuurlijk biedt Esri zelf ook uitgebreide documentatie, met voorbeelden en oefeningen, dus kijk daar zeker ook naar.

Het doel van deze eerste oefening is het maken van een simpele web applicatie met een Nederlandse basiskaart. Deze applicatie zal in volgende oefeningen gebruikt worden om extra functionaliteit toe te voegen.


Nederlandse data en kaartmateriaal

Deze oefening is gebaseerd op Create a starter app, maar we zullen hier niet inzoomen op een plaats in Amerika, maar op Nederland. En bovendien zullen we alleen Nederlandse data en kaartmateriaal gebruiken, dat wil zeggen data geprojecteerd in het Nederlandse coördinaatsysteem, het stelsel van de Rijksdriehoeksmeting (RD_New, zoals Esri het noemt).

Het Nederlandse RD-stelsel heeft als code 28992 gekregen. In ons script wordt dat aangegeven met spatialReference: 28992

Map en MapView

De code van de web pagina staat hieronder. Deze kun je naar een text editor kopiëren (bijvoorbeeld Notepad++) en er dan zelf mee experimenteren.

Als basemap in de Map gebruiken we de Topo RD basiskaart (id: 7aea6fa913a94176a1074edb40690318). Dit is een Web Map van Esri Nederland met als spatialReference: 28992

Ook bij de MapView geven we dit coördinaatsysteem op.

Nieuw Point aanmaken met een aangepast referentiesysteem

Als coördinaten van het centrum van onze MapView willen we graag de X en de Y van de oorsprong van het RD-stelsel gebruiken, namelijk X = 155000 en Y = 463000 (zie afbeelding hierboven). Omdat het center een Point is met als default referentiesysteem WGS84 (wkid: 4326) kunnen we echter niet zomaar coördinaten in een ander systeem opgeven.

In de code hieronder zie je hoe we dit hebben opgelost: we maken eerst een nieuw Point aan (een variabele met de nam rdOrigin), met de door ons gewenste coördinaten in het Nederlandse coördinaatsysteem. En vervolgens geven we deze variabele op als center van de MapView.

Klik hier om de applicatie in actie te zien. Het resultaat is misschien nog niet zeer spectaculair, maar het is wel de basis waar we in volgende oefeningen op voort zullen borduren.

Eindresultaat - HTML bestand

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="initial-scale=1, maximum-scale=1, user-scalable=no">
  <title>Aan de slag met ArcGIS JavaScript - Nederlandse basiskaart</title>
  <style>
    html, body, #viewDiv {
      padding: 0;
      margin: 0;
      height: 100%;
      width: 100%;
    }
  </style>

  <link rel="stylesheet" href="https://js.arcgis.com/4.11/esri/css/main.css">
  <script src="https://js.arcgis.com/4.11/"></script>

  <script>  
      require([
        "esri/Map",
        "esri/geometry/Point",
        "esri/views/MapView"
      ], function(Map, Point, MapView) {

      var map = new Map({
        basemap: {
          portalItem: {
            id: "7aea6fa913a94176a1074edb40690318" // Topo RD
          }
        }
      });
      
	  var rdOrigin = new Point({
	    x: 155000,
	    y: 463000,
	    spatialReference: 28992
	  });
      
	  var view = new MapView({
	    spatialReference: 28992, 
	    container: "viewDiv",
	    map: map,
	    center: rdOrigin,
	    zoom: 3
	  });

    });
  </script>
</head>
<body>
  <div id="viewDiv"></div>
</body>
</html>‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍
3 Comments
SergeDe_Backer
Occasional Contributor

Hoi Egge-Jan,

Dank je voor de info. Het lukt me echter niet om hetzelfde te verwezenlijken voor België als jij hier hebt gedaan voor Nederland.

Ik zou graag net als jij enkel België zichtbaar hebben voor de info, maar ik weet niet waar dit te vinden. Na wat speurwerk heb ik de RDstelsel gevonden: 31370, maar als ik dit gebruik kom ik ergens anders op de wereld uit. Daarom dat ik nu dit gebruik: center: [4.402771, 51.260197]

Zou je me in de juiste richting kunnen duwen? 

Dit is mijn code so far. Ik heb ook de click functie er al op zodat je een locatie met reverse geocoding kan opsnorren.

Boven de basemap maak ik dan gebruik van een GRB basiskaart van Vlaanderen via WMS.

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="initial-scale=1, maximum-scale=1, user-scalable=no">
<title>Aan de slag met ArcGIS JavaScript - Nederlandse basiskaart</title>
<style>
html, body, #viewDiv {
padding: 0;
margin: 0;
height: 100%;
width: 100%;
}
</style>

<link rel="stylesheet" href="https://js.arcgis.com/4.11/esri/css/main.css">
<script src="https://js.arcgis.com/4.11/"></script>

<script>
var map, view, layer;

require([
"esri/tasks/Locator",
"esri/Map",
"esri/geometry/Point",
"esri/views/MapView",
"esri/widgets/Search",
"esri/layers/WMSLayer"
], function (Locator, Map, Point, MapView, Search, WMSLayer) {
layer = new WMSLayer({
url: 'https://geoservices.informatievlaanderen.be/raadpleegdiensten/GRB-basiskaart/wms'
});

var locatorTask = new Locator({
url:
"https://geocode.arcgis.com/arcgis/rest/services/World/GeocodeServer"
});

map = new Map({
basemap: "topo-vector" //Dit is je basismap om in te lezen
});

map.add(layer); //Hier is de WMS layer die je erop "plakt"

var rdOrigin = new Point({
y: 155763.88,
x: 132693.38 ,
spatialReference: 31370
});


view = new MapView({
map: map,
zoom: 9,
center: [4.402771, 51.260197], //lon, lat
<!-- center: rdOrigin, -->
container: "viewDiv"
});


var search = new Search({
view: view
});

view.ui.add([search], "top-right");


/*******************************************************************
* This click event sets generic content on the popup not tied to
* a layer, graphic, or popupTemplate. The location of the point is
* used as input to a reverse geocode method and the resulting
* address is printed to the popup content.
*******************************************************************/
view.popup.autoOpenEnabled = false;
view.on("click", function (event) {
// Get the coordinates of the click on the view
var lat = Math.round(event.mapPoint.latitude * 1000) / 1000;
var lon = Math.round(event.mapPoint.longitude * 1000) / 1000;

view.popup.open({
// Set the popup's title to the coordinates of the location
title: "Reverse geocode: [" + lon + ", " + lat + "]",
location: event.mapPoint // Set the location of the popup to the clicked location
});

// Display the popup
// Execute a reverse geocode using the clicked location
locatorTask
.locationToAddress(event.mapPoint)
.then(function (response) {
// If an address is successfully found, show it in the popup's content
view.popup.content = response.address;
})
.catch(function (error) {
// If the promise fails and no result is found, show a generic message
view.popup.content = "No address was found for this location";
});
});
});
</script>
</head>
<body>
<div id="viewDiv"></div>
</body>
</html>

Egge-Jan_Pollé
MVP Regular Contributor

Hoi Serge,

De kaart die ik in de blog hierboven maak (en die ik in deze oefening wat verder uitwerk) is gebaseerd op het feit dat de Nederlandse reseller van Esri (Esri Nederland) allerlei kaarten en data aanbiedt in het Nederlandse projectiesysteem: het RD-stelsel met de code 28992. (RD staat voor het stelsel van de Rijksdriehoeksmeting; dit is aan het begin van de 19e eeuw opgezet door soldaten van Napoleon, tijdens de Franse bezetting.)

Het Belgische nationale systeem, Lambert 1972, heeft als code inderdaad 31370. Maar ik weet niet of Esri Belux, net als in Nederland, allerlei materiaal in deze projectie aanbiedt.

Als ik jouw was zou ik dus bij het standaard kaartmateriaal van Esri Wereldwijd blijven. Deze kaarten zijn in in de Web Mercator projectie (Spatial Reference: 102100  (3857)).

Hier overheen kun je dan het materiaal van informatievlaanderen projecteren, zoals de WMS met  het Grootschalig Referentiebestand (GRB) die je al gebruikt hebt.

Tip: bouw een Home widget in, zodat men, als men in de kaart te ver van Vlaanderen afdrijft, met één druk op de knop weer naar 'huis' kan gaan.

Ik hoop dat je hier wat mee kan.

Groet,

Egge-Jan

SergeDe_Backer
Occasional Contributor

Dank je Egge-Jan! Dan behou ik verlopig hoe het nu is. 

Ondertussen steekt de Home widget erin

Groeten,

Serge

About the Author
GIS Consultant at Avineon-Tensing