Simple way for converting "Rijksdriehoek" coordinates to lat and long (WGS84) in C#

In the Netherlands "Rijksdriehoek" coordinates are used to show the exact position of an object on a chart. To convert "Rijksdriehoek" coordinates to lat and long coordinates in C# use the following class:

 

Note

This code is base on the information found in  http://www.dekoepel.nl/pdf/Transformatieformules.pdf

using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Research.Core
{
public interface IRijksdriehoekComponent
{
string ConvertToLatLong(double x, double y);
}
public class RijksdriehoekComponent : IRijksdriehoekComponent
{
public string ConvertToLatLong(double x, double y)
{
string result = null;
// The city "Amsterfoort" is used as reference "Rijksdriehoek" coordinate.
int referenceRdX = 155000;
int referenceRdY = 463000;
double dX = (double)(x - referenceRdX) * (double)(Math.Pow(10,-5));
double dY = (double)(y - referenceRdY) * (double)(Math.Pow(10,-5));
double sumN = 
(3235.65389 * dY) + 
(-32.58297 * Math.Pow(dX, 2)) + 
(-0.2475 * Math.Pow(dY, 2)) + 
(-0.84978 * Math.Pow(dX, 2) * dY) + 
(-0.0655 * Math.Pow(dY, 3)) + 
(-0.01709 * Math.Pow(dX, 2) * Math.Pow(dY, 2)) + 
(-0.00738 * dX) + 
(0.0053 * Math.Pow(dX, 4)) + 
(-0.00039 * Math.Pow(dX, 2) * Math.Pow(dY, 3)) + 
(0.00033 * Math.Pow(dX, 4) * dY) + 
(-0.00012 * dX * dY);
double sumE = 
(5260.52916 * dX) + 
(105.94684 * dX * dY) + 
(2.45656 * dX * Math.Pow(dY, 2)) + 
(-0.81885 * Math.Pow(dX, 3)) + 
(0.05594 * dX * Math.Pow(dY, 3)) + 
(-0.05607 * Math.Pow(dX, 3) * dY) + 
(0.01199 * dY) + 
(-0.00256 * Math.Pow(dX, 3) * Math.Pow(dY, 2)) + 
(0.00128 * dX * Math.Pow(dY, 4)) + 
(0.00022 * Math.Pow(dY, 2)) + 
(-0.00022 * Math.Pow(dX, 2)) + 
(0.00026 * Math.Pow(dX, 5));
// The city "Amsterfoort" is used as reference "WGS84" coordinate.
double referenceWgs84X = 52.15517;
double referenceWgs84Y = 5.387206;
double latitude = referenceWgs84X + (sumN / 3600);
double longitude = referenceWgs84Y + (sumE / 3600);
// Input
// x = 122202
// y = 487250
//
// Result
// "52.372143838117, 4.90559760435224"
result = string.Format("{0}, {1}", 
latitude.ToString(CultureInfo.InvariantCulture.NumberFormat),
longitude.ToString(CultureInfo.InvariantCulture.NumberFormat));
return result;
}
}
}

Test

using System;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using Research.Core;
namespace UnitTest
{
[TestClass]
public class RijksdriehoekComponentTests
{
[TestMethod]
public void TestMethod1()
{
IRijksdriehoekComponent component = new RijksdriehoekComponent();
double x = 122202;
double y = 487250;
string result = component.ConvertToLatLong(x, y);
Assert.AreEqual("52.372143838117, 4.90559760435224", result);
}
}
}

Leave a Reply

Your email address will not be published. Required fields are marked *

3 comments

  1. Jan Pieter says:

    Dank je voor deze code.
    Heb je ook zoiets voor het omgekeerde: LatLong naar Rijksdriehoek?

    M.vr.gr.,
    Jan Pieter

  2. Ano says:

    Op basis van http://sourceforge.net/projects/rd-wgs8

    public static double[] ConvertToRijksdriehoek(double wgs84_lattitude, double wgs84_longitude)
    {
    // The city “Amsterfoort” is used as reference “Rijksdriehoek” coordinate.
    int referenceRdX = 155000;
    int referenceRdY = 463000;

    // The city “Amsterfoort” is used as reference “WGS84” coordinate.
    double referenceWgs84X = 52.15517;
    double referenceWgs84Y = 5.387206;

    var Rpq = new double[4, 5];

    Rpq[0, 1] = 190094.945;
    Rpq[1, 1] = -11832.228;
    Rpq[2, 1] = -114.221;
    Rpq[0, 3] = -32.391;
    Rpq[1, 0] = -0.705;
    Rpq[3, 1] = -2.340;
    Rpq[0, 2] = -0.008;
    Rpq[1, 3] = -0.608;
    Rpq[2, 3] = 0.148;

    var Spq = new double[4, 5];
    Spq[0, 1] = 0.433;
    Spq[0, 2] = 3638.893;
    Spq[0, 4] = 0.092;
    Spq[1, 0] = 309056.544;
    Spq[2, 0] = 73.077;
    Spq[1, 2] = -157.984;
    Spq[3, 0] = 59.788;
    Spq[2, 2] = -6.439;
    Spq[1, 1] = -0.032;
    Spq[1, 4] = -0.054;

    var d_lattitude = (0.36 * (wgs84_lattitude – referenceWgs84X));
    var d_longitude = (0.36 * (wgs84_longitude – referenceWgs84Y));

    double calc_latt = 0;
    double calc_long = 0;

    for (int p = 0; p < 4; p++)
    {
    for (int q = 0; q < 5; q++)
    {
    calc_latt += Rpq[p, q] * Math.Pow(d_lattitude, p) * Math.Pow(d_longitude, q);
    calc_long += Spq[p, q] * Math.Pow(d_lattitude, p) * Math.Pow(d_longitude, q);
    }
    }

    var rd_x_coordinate = (referenceRdX + calc_latt);
    var rd_y_coordinate = (referenceRdY + calc_long);

    return new[] { rd_x_coordinate, rd_y_coordinate };
    }

  3. Ronald says:

    Beste Roel,

    De tweede functie zou ik graag in VB.NET gebruiken, maar krijg in diverse conversie tools een foutmelding op Public Static Double[]

    Enig idee hoe ik dit in VB.NET voor elkaar kan krijgen?