Package org.geotools.referencing.operation.builder

Source Code of org.geotools.referencing.operation.builder.BursaWolfTransformBuilderTest

/*
*    GeoTools - The Open Source Java GIS Toolkit
*    http://geotools.org
*
*    (C) 2002-2008, Open Source Geospatial Foundation (OSGeo)
*
*    This library is free software; you can redistribute it and/or
*    modify it under the terms of the GNU Lesser General Public
*    License as published by the Free Software Foundation;
*    version 2.1 of the License.
*
*    This library is distributed in the hope that it will be useful,
*    but WITHOUT ANY WARRANTY; without even the implied warranty of
*    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
*    Lesser General Public License for more details.
*/
package org.geotools.referencing.operation.builder;

import java.util.ArrayList;
import java.util.List;
import java.util.Random;

import org.geotools.geometry.GeneralDirectPosition;
import org.geotools.referencing.datum.BursaWolfParameters;
import org.geotools.referencing.operation.transform.GeocentricTranslation;
import org.opengis.referencing.FactoryException;
import org.opengis.referencing.operation.TransformException;
import org.opengis.geometry.DirectPosition;

import org.junit.*;
import static org.junit.Assert.*;


/**
*
*
* @source $URL$
*/
public final class BursaWolfTransformBuilderTest {
    /**
     * Test {@link BursaWolfTransformBuilder}.
     */
    @Test
    public void testBursaWolfParamCalculaterXrotation() throws FactoryException, TransformException {
        Random random = new Random(773418718);

        double R = 6370000;
        double angle = (((random.nextDouble() * 10) / 3600) * Math.PI) / 180;
        double cos = Math.cos(angle);
        double sin = Math.sin(angle);

        List <MappedPosition> vectors = new ArrayList<MappedPosition>();

        vectors.add(new MappedPosition(
                    new GeneralDirectPosition(R, 0, 0),
                    new GeneralDirectPosition(R, 0, 0)));

        vectors.add(new MappedPosition(
                    new GeneralDirectPosition(0, cos * R, -sin * R),
                    new GeneralDirectPosition(0, R, 0)));

        vectors.add(new MappedPosition(
                    new GeneralDirectPosition(0, sin * R, cos * R),
                    new GeneralDirectPosition(0, 0, R)));

        double[] points = new double[vectors.size() * 3];

        for (int i = 0; i < vectors.size(); i++) {
            points[i * 3]       = vectors.get(i).getSource().getCoordinate()[0];
            points[(i * 3) + 1] = vectors.get(i).getSource().getCoordinate()[1];
            points[(i * 3) + 2] = vectors.get(i).getSource().getCoordinate()[2];
        }

        double[] dstPoints = new double[points.length];

        MathTransformBuilder BWPT = new BursaWolfTransformBuilder(vectors);
        BWPT.getMathTransform()
            .transform(points, 0, dstPoints, 0, (points.length / 3));

        for (int i = 0; i < vectors.size(); i++) {
            assertEquals(dstPoints[i * 3],       vectors.get(i).getTarget().getCoordinate()[0], 1E-2);
            assertEquals(dstPoints[(i * 3) + 1], vectors.get(i).getTarget().getCoordinate()[1], 1E-2);
            assertEquals(dstPoints[(i * 3) + 2], vectors.get(i).getTarget().getCoordinate()[2], 1E-2);
        }
    }

    /**
     * The test that generates random transformation parameters and
     * source points. The destination points are calculated using generated
     * parameters. Then the parameters are computed by the builder and
     * compared against original.
     *
     * @throws FactoryException DOCUMENT ME!
     * @throws TransformException
     */
    @Test
    public void test2BursaWolfParamCalculater()
        throws FactoryException, TransformException {
        double R = 6370000;
        Random random = new Random(143477662);

        DirectPosition ptSrc ;
        DirectPosition ptDst ;
        List <MappedPosition> vectors = new ArrayList<MappedPosition>();

        BursaWolfParameters bwp = new BursaWolfParameters(null);
        bwp.dx = random.nextDouble() * 100;
        bwp.dy = random.nextDouble() * 100;
        bwp.dz = random.nextDouble() * 100;
        bwp.ex = random.nextDouble() * 10;
        bwp.ey = random.nextDouble() * 10;
        bwp.ez = random.nextDouble() * 10;
        bwp.ppm = random.nextDouble() * 10;

        GeocentricTranslation gt = new GeocentricTranslation(bwp);

        for (int i = 0; i < (3 * 10); i++) {
            double gamma = ((45 + (random.nextDouble() * 10)) * Math.PI) / 180;
            double alfa = ((45 + (random.nextDouble() * 10)) * Math.PI) / 180;

            //   generate source points
            ptSrc = new GeneralDirectPosition(R * Math.sin(gamma) * Math.cos(
                        alfa), R * Math.sin(gamma) * Math.cos(alfa),
                    R * Math.cos(gamma));

            double[] pom = new double[3];

            //  generates destination points
            gt.transform(ptSrc.getCoordinate(), 0, pom, 0, 1);
            ptDst = new GeneralDirectPosition(pom);
            vectors.add(new MappedPosition(ptSrc,ptDst));
        }

        BursaWolfTransformBuilder BWPT = new BursaWolfTransformBuilder(vectors);
        assertEquals(BWPT.getBursaWolfParameters(null).dx, bwp.dx, 1E-2);
        assertEquals(BWPT.getBursaWolfParameters(null).dy, bwp.dy, 1E-2);
        assertEquals(BWPT.getBursaWolfParameters(null).dz, bwp.dz, 1E-2);
        assertEquals(BWPT.getBursaWolfParameters(null).ex, bwp.ex, 1E-2);
        assertEquals(BWPT.getBursaWolfParameters(null).ey, bwp.ey, 1E-2);
        assertEquals(BWPT.getBursaWolfParameters(null).ez, bwp.ez, 1E-2);
        assertEquals(BWPT.getBursaWolfParameters(null).ppm, bwp.ppm, 1E-2);

        assertEquals(BWPT.getErrorStatistics().rms(), 0, 1E-2);
    }
}
TOP

Related Classes of org.geotools.referencing.operation.builder.BursaWolfTransformBuilderTest

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.