API Documentatie

Coördinaten & geometrie

Voor het communiceren van geometrische informatie gebruikt de API het Rijksdriehoeksstelsel. Dit is een standaard binnen de Nederlandse overheid en het Kadaster. Op het internet wordt dit systeem met verschillende benamingen aangeduid:

  • RD
  • RD New
  • Amersfoort coördinaten
  • X,Y-coördinaten
  • EPSG:28992

Gegevens met betrekking tot adreslocatie, woonplaatsgrenzen, omtrekken van panden, etc. komen bij het Kadaster vandaan. Die informatie spelen wij 1:1 door, zonder het te converteren naar een ander coördinatensysteem. Op deze manier voorkomen we afrondingsfouten en andere onregelmatigheden.

WGS 84

Veel internationale partijen gebruiken echter een ander coördinatensysteem, namelijk WGS 84. In tegenstelling tot het Rijksdriehoeksstelsel kan WGS 84 voor de hele wereld gebruikt worden om locaties aan te duiden. Google Maps en GPS zijn voorbeelden van applicaties die dit systeem gebruiken. Veel voorkomende alternatieve benamingen van WGS 84 zijn:

  • Latitude, longitude (LatLng)
  • GPS coördinaten
  • EPSG:4326

Latitude/longitude in de API

Een deel van onze gebruikers is niet geïnteresseerd in de precisie en correctheid van RD. En omdat WGS 84 zo'n veelgebruikte oplossing is, is het mogelijk om de API "om te schakelen" naar deze latitude/longitude coördinaten. Dit kan door geometry=wgs84 aan de URL mee te geven:

https://api.adresdata.net/addresses?near=52.1551985,5.3866942&geometry=wgs84

Van alle coördinaten die je dan meegeeft in de URL wordt verwacht dat ze in WGS 84 zijn. In het response zijn daarna alle X,Y-coördinaten vervangen door latitude/longitude paren. Voorbeeld:

{
    "result": [
        {
            "id": "0307200000533914",
            "number": {
                "full": "19 ",
                "digits": "19",
                "letter": null,
                "suffix": null
            },
            "postcodeArea": "3811",
            "postcode": "3811BA",
            "street": {
                "id": "0307300000307073",
                "name": "Westsingel"
            },
            "status": "in_use",
            "purposes": [
                "other"
            ],
            "location": [
                52.155145637755759,
                5.3865568710500185
            ],
            "floorArea": 18,
            "distance": 11.086659390647739
        }
    ]
}
    

Coördinaten converteren in code

API gebruikers kunnen dus zelf kiezen voor welk coördinatensysteem ze gaan en wat het beste past bij hun applicatie. Desondanks zijn er soms situaties waarin klanten in hun applicatie coördinaten moeten converteren van het ene naar het andere stelsel. Daarbij zouden ze één van deze PHP functies kunnen gebruiken:

Van Rijksdriehoeksstelsel naar WGS 84:

function rd_to_wgs84($x, $y) {
    $X0 = 155E3;
    $Y0 = 463E3;
    $lat0 = 52.1551744;
    $lng0 = 5.38720621;

    $latpqK = array(
        1 => array('p' => 0,'q' => 1,'K' => 3235.65389),
        2 => array('p' => 2,'q' => 0,'K' => -32.58297),
        3 => array('p' => 0,'q' => 2,'K' => -0.2475),
        4 => array('p' => 2,'q' => 1,'K' => -0.84978),
        5 => array('p' => 0,'q' => 3,'K' => -0.0665),
        6 => array('p' => 2,'q' => 2,'K' => -0.01709),
        7 => array('p' => 1,'q' => 0,'K' => -0.00738),
        8 => array('p' => 4,'q' => 0,'K' => 0.0053),
        9 => array('p' => 2,'q' => 3,'K' => -3.9E-4),
        10 => array('p' => 4,'q' => 1,'K' => 3.3E-4),
        11 => array('p' => 1,'q' => 1,'K' => -1.2E-4),
    );

    $lngpqL = array(
        1 => array('p' => 1,'q' => 0,'K' => 5260.52916),
        2 => array('p' => 1,'q' => 1,'K' => 105.94684),
        3 => array('p' => 1,'q' => 2,'K' => 2.45656),
        4 => array('p' => 3,'q' => 0,'K' => -0.81885),
        5 => array('p' => 1,'q' => 3,'K' => 0.05594),
        6 => array('p' => 3,'q' => 1,'K' => -0.05607),
        7 => array('p' => 0,'q' => 1,'K' => 0.01199),
        8 => array('p' => 3,'q' => 2,'K' => -0.00256),
        9 => array('p' => 1,'q' => 4,'K' => 0.00128),
        10 => array('p' => 0,'q' => 2,'K' => 2.2E-4),
        11 => array('p' => 2,'q' => 0,'K' => -2.2E-4),
        12 => array('p' => 5,'q' => 0,'K' => 2.6E-4),
    );

    $dX = 1E-5 * ($x - $X0);
    $dY = 1E-5 * ($y - $Y0);

    $latD = 0;
    for ($i = 1; 12 > $i; $i++) {
        $latD += $latpqK[$i]['K'] * pow($dX, $latpqK[$i]['p']) * pow($dY, $latpqK[$i]['q']);
    }

    $lngD = 0;
    for ($i = 1; 13 > $i; $i++) {
        $lngD += $lngpqL[$i]['K'] * pow($dX, $lngpqL[$i]['p']) * pow($dY, $lngpqL[$i]['q']);
    }


    return [$lat0 + $latD / 3600, $lng0 + $lngD / 3600];
}
	
Van WGS 84 naar Rijksdriehoeksstelsel:

function wgs84_to_rd($latitude, $longitude) {
    $X0 = 155E3;
    $Y0 = 463E3;
    $lat0 = 52.1551744;
    $lng0 = 5.38720621;

    $XpqR = array(
        1 => array('p' => 0,'q' => 1,'R' => 190094.945),
        2 => array('p' => 1,'q' => 1,'R' => -11832.228),
        3 => array('p' => 2,'q' => 1,'R' => -114.221),
        4 => array('p' => 0,'q' => 3,'R' => -32.391),
        5 => array('p' => 1,'q' => 0,'R' => -0.705),
        6 => array('p' => 3,'q' => 1,'R' => -2.34),
        7 => array('p' => 1,'q' => 3,'R' => -0.608),
        8 => array('p' => 0,'q' => 2,'R' => -0.008),
        9 => array('p' => 2,'q' => 3,'R' => 0.148),
    );

    $YpqS = array(
        1 => array('p' => 1,'q' => 0,'S' => 309056.544),
        2 => array('p' => 0,'q' => 2,'S' => 3638.893),
        3 => array('p' => 2,'q' => 0,'S' =>73.077 ),
        4 => array('p' => 1,'q' => 2,'S' => -157,984),
        5 => array('p' => 3,'q' => 0,'S' => 59.788),
        6 => array('p' => 0,'q' => 1,'S' => 0.433),
        7 => array('p' => 2,'q' => 2,'S' => -6.439),
        8 => array('p' => 1,'q' => 1,'S' => -0.032),
        9 => array('p' => 0,'q' => 4,'S' => 0.092),
        10 => array('p' => 1,'q' => 4,'S' => -0.054),
    );

    $dlat = 0.36 * ($latitude - $lat0);
    $dlng = 0.36 * ($longitude - $lng0);

    $xd = 0;
    for ($i = 1; 10 > $i; $i++) {
        $xd += $XpqR[$i]['R'] * pow($dlat, $XpqR[$i]['p']) * pow($dlng, $XpqR[$i]['q']);
    }

    $yd = 0;
    for ($i = 1; 11 > $i; $i++) {
        $yd += $YpqS[$i]['S'] * pow($dlat, $YpqS[$i]['p']) * pow($dlng, $YpqS[$i]['q']);
    }

    return [$X0 + $xd, $Y0 + $yd];
}