Package org.openstreetmap.josm.data.projection

Source Code of org.openstreetmap.josm.data.projection.SwissGridTest$ProjData

// License: GPL. For details, see LICENSE file.
package org.openstreetmap.josm.data.projection;

import static org.junit.Assert.assertTrue;

import org.junit.BeforeClass;
import org.junit.Ignore;
import org.junit.Test;
import org.openstreetmap.josm.Main;
import org.openstreetmap.josm.data.coor.EastNorth;
import org.openstreetmap.josm.data.coor.LatLon;

public class SwissGridTest {
    public static final String SWISS_EPSG_CODE = "EPSG:21781";
    private boolean debug = false;

    /**
     * Setup test.
     */
    @BeforeClass
    public static void setUp() {
        Main.setProjection(Projections.getProjectionByCode(SWISS_EPSG_CODE)); // Swiss grid
    }

    /**
     * source: http://www.swisstopo.admin.ch/internet/swisstopo/en/home/topics/survey/sys/refsys/switzerland.parsysrelated1.37696.downloadList.97912.DownloadFile.tmp/swissprojectionen.pdf
     */
    ProjData[] data = {
            new ProjData("Zimmerwald",      d(7,27,54.983506), d(46,52,37.540562), 947.149, 602030.680, 191775.030, 897.915),
            new ProjData("Chrischona",      d(7,40,6.983077), d(47,34, 1.385301), 504.935617306.300, 268507.300, 456.064),
            new ProjData("Pfaender",        d(9,47,3.697723), d(47,30,55.172797), 1089.372, 776668.105, 265372.681, 1042.624),
            new ProjData("La Givrine",      d(6,6,7.326361), d(46,27,14.690021), 1258.274497313.292, 145625.438, 1207.434),
            new ProjData("Monte Generoso",  d(9,1,16.389053), d(45,55,45.438020), 1685.027, 722758.810, 87649.670, 1636.600) };

    private double d(double deg, double min, double sec) {
        return deg + min / 60. + sec / 3600.;
    }

    private static class ProjData {
        public String name;
        public LatLon ll;
        public EastNorth en;
        public ProjData(String name, double lon, double lat, double h1, double x, double y, double h2) {
            this.name = name;
            ll = new LatLon(lat, lon);
            en = new EastNorth(x, y);
        }
    }

    public static final double EPSILON_APPROX = 1.5;
    public static final double EPSILON_ACCURATE = 0.05;

    public void projReferenceTest(final double epsilon) {
        Projection swiss = Projections.getProjectionByCode("EPSG:21781"); // Swiss grid
        StringBuilder errs = new StringBuilder();
        for (ProjData pd : data) {
            EastNorth en2 = swiss.latlon2eastNorth(pd.ll);
            if (Math.abs(pd.en.east() - en2.east()) > epsilon || Math.abs(pd.en.north() - en2.north()) > epsilon) {
                errs.append(String.format("%s should be: %s but is: %s%n", pd.name, pd.en, en2));
            }
        }
        assertTrue(errs.toString(), errs.length() == 0);
    }

    @Test
    public void projReferenceTestApprox() {
        projReferenceTest(EPSILON_APPROX);
    }

    @Test
    @Ignore("high accuracy of epsilon=" + EPSILON_ACCURATE + " is not met")
    public void projReferenceTestAccurate() {
        // TODO make this test pass
        projReferenceTest(EPSILON_ACCURATE);
    }

    @Test
    public void a_latlon2eastNorth_test() {
        {
            LatLon ll = new LatLon(46.518, 6.567);
            EastNorth en = Main.getProjection().latlon2eastNorth(ll);
            if (debug) {
                System.out.println(en);
            }
            assertTrue("Lausanne", Math.abs(en.east() - 533111.69) < 0.1);
            assertTrue("Lausanne", Math.abs(en.north() - 152227.85) < 0.1);
        }

        {
            LatLon ll = new LatLon(47.78, 8.58);
            EastNorth en = Main.getProjection().latlon2eastNorth(ll);
            if (debug) {
                System.out.println(en);
            }
            assertTrue("Schafouse", Math.abs(en.east() - 685544.16) < 0.1);
            assertTrue("Schafouse", Math.abs(en.north() - 292782.91) < 0.1);
        }

        {
            LatLon ll = new LatLon(46.58, 10.48);
            EastNorth en = Main.getProjection().latlon2eastNorth(ll);
            if (debug) {
                System.out.println(en);
            }
            assertTrue("Grinson", Math.abs(en.east() - 833068.04) < 0.1);
            assertTrue("Grinson", Math.abs(en.north() - 163265.39) < 0.1);
        }

        {
            LatLon ll = new LatLon(46.0 + 57.0 / 60 + 3.89813884505 / 3600, 7.0 + 26.0 / 60 + 19.076595154147 / 3600);
            EastNorth en = Main.getProjection().latlon2eastNorth(ll);
            if (debug) {
                System.out.println(en);
            }
            assertTrue("Berne", Math.abs(en.east() - 600000.0) < 0.1);
            assertTrue("Berne", Math.abs(en.north() - 200000.0) < 0.1);
        }
        {
            LatLon ll = new LatLon(46.0 + 2.0 / 60 + 38.87 / 3600, 8.0 + 43.0 / 60 + 49.79 / 3600);
            EastNorth en = Main.getProjection().latlon2eastNorth(ll);
            if (debug) {
                System.out.println(en);
            }
            assertTrue("Ref", Math.abs(en.east() - 700000.0) < 0.1);
            assertTrue("Ref", Math.abs(en.north() - 100000.0) < 0.1);
        }
    }


    @Test
    public void b_eastNorth2latlon_test() {
        {
            EastNorth en = new EastNorth(533111.69, 152227.85);
            LatLon ll = Main.getProjection().eastNorth2latlon(en);
            if (debug) {
                System.out.println(ll);
            }
            assertTrue("Lausanne", Math.abs(ll.lat() - 46.518) < 0.00001);
            assertTrue("Lausanne", Math.abs(ll.lon() - 6.567) < 0.00001);
        }

        {
            EastNorth en = new EastNorth(685544.16, 292782.91);
            LatLon ll = Main.getProjection().eastNorth2latlon(en);
            if (debug) {
                System.out.println(ll);
            }
            assertTrue("Schafouse", Math.abs(ll.lat() - 47.78) < 0.00001);
            assertTrue("Schafouse", Math.abs(ll.lon() - 8.58) < 0.00001);
        }

        {
            EastNorth en = new EastNorth(833068.04, 163265.39);
            LatLon ll = Main.getProjection().eastNorth2latlon(en);
            if (debug) {
                System.out.println(ll);
            }
            assertTrue("Grinson", Math.abs(ll.lat() - 46.58) < 0.00001);
            assertTrue("Grinson", Math.abs(ll.lon() - 10.48) < 0.00001);
        }

        {
            EastNorth en = new EastNorth(600000.0, 200000.0);
            LatLon ll = Main.getProjection().eastNorth2latlon(en);
            if (debug) {
                System.out.println(ll);
            }
            assertTrue("Berne", Math.abs(ll.lat() - (46.0 + 57.0 / 60 + 3.89813884505 / 3600)) < 0.00001);
            assertTrue("Berne", Math.abs(ll.lon() - (7.0 + 26.0 / 60 + 19.076595154147 / 3600)) < 0.00001);
        }

        {
            EastNorth en = new EastNorth(700000.0, 100000.0);
            LatLon ll = Main.getProjection().eastNorth2latlon(en);
            if (debug) {
                System.out.println(ll);
            }
            assertTrue("Ref", Math.abs(ll.lat() - (46.0 + 2.0 / 60 + 38.87 / 3600)) < 0.00001);
            assertTrue("Ref", Math.abs(ll.lon() - (8.0 + 43.0 / 60 + 49.79 / 3600)) < 0.00001);
        }
    }


    /**
     * Send and return should have less than 2mm of difference.
     */
    @Test
    public void c_sendandreturn_test() {
        {
            EastNorth en = new EastNorth(533111.69, 152227.85);
            LatLon ll = Main.getProjection().eastNorth2latlon(en);
            EastNorth en2 = Main.getProjection().latlon2eastNorth(ll);
            if (debug) {
                System.out.println(en.east() - en2.east());
            }
            if (debug) {
                System.out.println(en.north() - en2.north());
            }
            assertTrue("Lausanne", Math.abs(en.east() - en2.east()) < 0.002);
            assertTrue("Lausanne", Math.abs(en.north() - en2.north()) < 0.002);
        }

        {
            EastNorth en = new EastNorth(685544.16, 292782.91);
            LatLon ll = Main.getProjection().eastNorth2latlon(en);
            EastNorth en2 = Main.getProjection().latlon2eastNorth(ll);
            if (debug) {
                System.out.println(en.east() - en2.east());
            }
            if (debug) {
                System.out.println(en.north() - en2.north());
            }
            assertTrue("Schafouse", Math.abs(en.east() - en2.east()) < 0.002);
            assertTrue("Schafouse", Math.abs(en.north() - en2.north()) < 0.002);
        }

        {
            EastNorth en = new EastNorth(833068.04, 163265.39);
            LatLon ll = Main.getProjection().eastNorth2latlon(en);
            EastNorth en2 = Main.getProjection().latlon2eastNorth(ll);
            if (debug) {
                System.out.println(en.east() - en2.east());
            }
            if (debug) {
                System.out.println(en.north() - en2.north());
            }
            assertTrue("Grinson", Math.abs(en.east() - en2.east()) < 0.002);
            assertTrue("Grinson", Math.abs(en.north() - en2.north()) < 0.002);
        }

        {
            EastNorth en = new EastNorth(600000.0, 200000.0);
            LatLon ll = Main.getProjection().eastNorth2latlon(en);
            EastNorth en2 = Main.getProjection().latlon2eastNorth(ll);
            if (debug) {
                System.out.println(en.east() - en2.east());
            }
            if (debug) {
                System.out.println(en.north() - en2.north());
            }
            assertTrue("Berne", Math.abs(en.east() - en2.east()) < 0.002);
            assertTrue("Berne", Math.abs(en.north() - en2.north()) < 0.002);
        }

        {
            EastNorth en = new EastNorth(700000.0, 100000.0);
            LatLon ll = Main.getProjection().eastNorth2latlon(en);
            EastNorth en2 = Main.getProjection().latlon2eastNorth(ll);
            if (debug) {
                System.out.println(en.east() - en2.east());
            }
            if (debug) {
                System.out.println(en.north() - en2.north());
            }
            assertTrue("Ref", Math.abs(en.east() - en2.east()) < 0.002);
            assertTrue("Ref", Math.abs(en.north() - en2.north()) < 0.002);
        }
    }
}
TOP

Related Classes of org.openstreetmap.josm.data.projection.SwissGridTest$ProjData

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.