Package org.geotools.geometry.iso.operations

Source Code of org.geotools.geometry.iso.operations.TransformTest

/*
*    GeoTools - The Open Source Java GIS Toolkit
*    http://geotools.org
*
*    (C) 2004-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.geometry.iso.operations;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import java.util.Locale;

import org.geotools.geometry.iso.root.GeometryImpl;
import org.geotools.geometry.GeometryBuilder;
import org.geotools.geometry.iso.PositionFactoryImpl;
import org.geotools.geometry.iso.PrecisionModel;
import org.geotools.geometry.iso.coordinate.DirectPositionImpl;
import org.geotools.geometry.iso.coordinate.GeometryFactoryImpl;
import org.geotools.geometry.iso.primitive.CurveImpl;
import org.geotools.geometry.iso.primitive.PointImpl;
import org.geotools.geometry.iso.primitive.PrimitiveFactoryImpl;
import org.geotools.geometry.iso.primitive.RingImpl;
import org.geotools.geometry.iso.primitive.RingImplUnsafe;
import org.geotools.geometry.iso.primitive.SurfaceImpl;
import org.geotools.geometry.iso.root.GeometryImpl;
import org.geotools.referencing.CRS;
import org.geotools.referencing.ReferencingFactoryFinder;
import org.geotools.referencing.factory.OrderedAxisAuthorityFactory;
import org.opengis.geometry.DirectPosition;
import org.opengis.geometry.PositionFactory;
import org.opengis.geometry.coordinate.GeometryFactory;
import org.opengis.geometry.coordinate.LineString;
import org.opengis.geometry.coordinate.PointArray;
import org.opengis.geometry.coordinate.Position;
import org.opengis.geometry.coordinate.Triangle;
import org.opengis.geometry.primitive.OrientableCurve;
import org.opengis.geometry.primitive.PrimitiveFactory;
import org.opengis.geometry.primitive.Ring;
import org.opengis.geometry.primitive.Surface;
import org.opengis.geometry.primitive.SurfaceBoundary;
import org.opengis.geometry.primitive.SurfacePatch;
import org.opengis.metadata.citation.Citation;
import org.opengis.referencing.crs.CRSAuthorityFactory;
import org.opengis.referencing.crs.CoordinateReferenceSystem;
import org.opengis.referencing.operation.MathTransform;

import junit.framework.TestCase;

/**
*
*
* @source $URL$
*/
public class TransformTest extends TestCase {
 
  private CoordinateReferenceSystem crs1;
  private CoordinateReferenceSystem crs2;
 
  public void setUp() throws Exception {
    this.crs1 = CRS.decode("EPSG:4326",true);
    this.crs2 = CRS.decode("EPSG:3005",true);
  }
 
  // test that two points, curves, rings, or surfaces are equal within a tolerance
  // (equals means same CRS and same ordinates within tolerance)
  private void assertEquals(GeometryImpl geom1, GeometryImpl geom2, double epsilon) {
    if ( !CRS.equalsIgnoreMetadata(geom1.getCoordinateReferenceSystem(), geom2.getCoordinateReferenceSystem()) ) {
      assertTrue("CRS of two objects do not match", false);
   
    if (geom1.getCoordinateDimension() != geom2.getCoordinateDimension()) {
      assertTrue("Coordinate dimension of objects do not match", false);
    }
   
    if (geom1 instanceof PointImpl && geom2 instanceof PointImpl) {
      PointImpl point1 = (PointImpl) geom1;
      PointImpl point2 = (PointImpl) geom2;
      for (int i=0; i<point1.getPosition().getCoordinate().length; i++) {
        assertEquals(point1.getPosition().getOrdinate(i), point2.getPosition().getOrdinate(i), epsilon);
      }
     
    }
    else if (geom1 instanceof CurveImpl && geom2 instanceof CurveImpl) {
      CurveImpl curve1 = (CurveImpl) geom1;
      CurveImpl curve2 = (CurveImpl) geom2;
      List<DirectPosition> list1 = curve1.asDirectPositions();
      List<DirectPosition> list2 = curve2.asDirectPositions();
      Iterator<DirectPosition> iterator1 = list1.iterator();
      Iterator<DirectPosition> iterator2 = list2.iterator();
      while (iterator1.hasNext() && iterator2.hasNext()) {
        PointImpl p1 = new PointImpl( iterator1.next());
        PointImpl p2 = new PointImpl( iterator2.next());
        assertEquals(p1, p2, epsilon);
      }
    }
    else if (geom1 instanceof RingImpl && geom2 instanceof RingImplUnsafe) {
      RingImplUnsafe ring1 = (RingImplUnsafe) geom1;
      RingImplUnsafe ring2 = (RingImplUnsafe) geom2;
      List<DirectPosition> list1 = ring1.asDirectPositions();
      List<DirectPosition> list2 = ring2.asDirectPositions();
      Iterator<DirectPosition> iterator1 = list1.iterator();
      Iterator<DirectPosition> iterator2 = list2.iterator();
      while (iterator1.hasNext() && iterator2.hasNext()) {
        PointImpl p1 = new PointImpl(iterator1.next());
        PointImpl p2 = new PointImpl(iterator2.next());
        assertEquals(p1, p2, epsilon);
      }
    }
    else if (geom1 instanceof RingImpl && geom2 instanceof RingImpl) {
      RingImpl ring1 = (RingImpl) geom1;
      RingImpl ring2 = (RingImpl) geom2;
      List<DirectPosition> list1 = ring1.asDirectPositions();
      List<DirectPosition> list2 = ring2.asDirectPositions();
      Iterator<DirectPosition> iterator1 = list1.iterator();
      Iterator<DirectPosition> iterator2 = list2.iterator();
      while (iterator1.hasNext() && iterator2.hasNext()) {
        PointImpl p1 = new PointImpl(iterator1.next());
        PointImpl p2 = new PointImpl(iterator2.next());
        assertEquals(p1, p2, epsilon);
      }
    }
    else if (geom1 instanceof SurfaceImpl && geom2 instanceof SurfaceImpl) {
      SurfaceImpl surface1 = (SurfaceImpl) geom1;
      SurfaceImpl surface2 = (SurfaceImpl) geom2;
      List<Ring> list1 = surface1.getBoundaryRings();
      List<Ring> list2 = surface2.getBoundaryRings();
      Iterator<Ring> iterator1 = list1.iterator();
      Iterator<Ring> iterator2 = list2.iterator();
      while (iterator1.hasNext() && iterator2.hasNext()) {
        RingImplUnsafe r1 = (RingImplUnsafe) iterator1.next();
        RingImplUnsafe r2 = (RingImplUnsafe) iterator2.next();
        assertEquals(r1, r2, epsilon);
      }
    }
    else {
      assertTrue("unsupported or unmatching geometries", false);
    }
   
  }

  public void testPoint() throws Exception {

    PositionFactory positionFactory = new PositionFactoryImpl(crs1, new PrecisionModel());
    PrimitiveFactory primitiveFactory = new PrimitiveFactoryImpl(crs1, positionFactory);
   
    PointImpl point1 = (PointImpl) primitiveFactory.createPoint( new double[]{-123.47009555832284, 48.543261561072285} );
    PointImpl point2 = (PointImpl) point1.transform(crs2);
   
    // create expected result
    PositionFactory expectedPosF2 = new PositionFactoryImpl(crs2, new PrecisionModel());
    PrimitiveFactory expectedPrimF2 = new PrimitiveFactoryImpl(crs2, expectedPosF2);
   
    PointImpl expectedPoint2 = (PointImpl) expectedPrimF2.createPoint( new double[]{1187128.000000001, 395268.0000000004} );
   
    //System.out.println(point1);
    //System.out.println(point2);
    //System.out.println(expectedPoint2);
   
    //assertTrue(point2.equals(expectedPoint2));
    assertEquals(expectedPoint2, point2, 0.9);
   
  }

  public void testCurve() throws Exception {

    PositionFactory positionFactory = new PositionFactoryImpl(crs1, new PrecisionModel());
    PrimitiveFactory primitiveFactory = new PrimitiveFactoryImpl(crs1, positionFactory);
    GeometryFactory geometryFactory = new GeometryFactoryImpl(crs1, positionFactory);
   
    List<Position> points = new ArrayList<Position>();
    points.add(primitiveFactory.createPoint( new double[]{-123.47009555832284,48.543261561072285} ));
    points.add(primitiveFactory.createPoint( new double[]{-123.46972894676578,48.55009592117936} ));
    points.add(primitiveFactory.createPoint( new double[]{-123.45463828850829,48.54973520267305} ));
    points.add(primitiveFactory.createPoint( new double[]{-123.4550070827961,48.54290089070186} ));
        LineString lineString = geometryFactory.createLineString(points);
        List curveSegmentList = Collections.singletonList(lineString);
       
        CurveImpl curve1 = (CurveImpl) primitiveFactory.createCurve(curveSegmentList);
        CurveImpl curve2 = (CurveImpl) curve1.transform(crs2);
       
    // create expected result
    PositionFactory expectedPosF2 = new PositionFactoryImpl(crs2, new PrecisionModel());
    PrimitiveFactory expectedPrimF2 = new PrimitiveFactoryImpl(crs2, expectedPosF2);
    GeometryFactory ExpectedGeomF2 = new GeometryFactoryImpl(crs2, expectedPosF2);
   
    List<Position> expectedPoints = new ArrayList<Position>();
    expectedPoints.add(expectedPrimF2.createPoint( new double[]{1187128.000000001, 395268.0000000004} ));
    expectedPoints.add(expectedPrimF2.createPoint( new double[]{1187127.9999999998, 396026.99999999825} ));
    expectedPoints.add(expectedPrimF2.createPoint( new double[]{1188245.0000000007, 396027.0000000039} ));
    expectedPoints.add(expectedPrimF2.createPoint( new double[]{1188245.0000000005, 395268.0000000018} ));
        LineString expectedLineString = ExpectedGeomF2.createLineString(expectedPoints);
        List expectedCurveSegmentList = Collections.singletonList(expectedLineString);
       
        CurveImpl expectedCurve = (CurveImpl) expectedPrimF2.createCurve(expectedCurveSegmentList);
   
    //System.out.println(curve1);
    //System.out.println(curve2);
    //System.out.println(expectedCurve);
   
    //assertTrue(curve2.equals(expectedCurve));
    assertEquals(curve2, expectedCurve, 0.9);
  }
 
  public void testRing() throws Exception {

    PositionFactory positionFactory = new PositionFactoryImpl(crs1, new PrecisionModel());
    PrimitiveFactory primitiveFactory = new PrimitiveFactoryImpl(crs1, positionFactory);
    GeometryFactory geometryFactory = new GeometryFactoryImpl(crs1, positionFactory);
   
    List<Position> points1 = new ArrayList<Position>();
    points1.add(primitiveFactory.createPoint( new double[]{-123.47009555832284,48.543261561072285} ));
    points1.add(primitiveFactory.createPoint( new double[]{-123.46972894676578,48.55009592117936} ));
    points1.add(primitiveFactory.createPoint( new double[]{-123.45463828850829,48.54973520267305} ));
    points1.add(primitiveFactory.createPoint( new double[]{-123.4550070827961,48.54290089070186} ));
    points1.add(primitiveFactory.createPoint( new double[]{-123.47009555832284,48.543261561072285} ));
    LineString lineString1 = geometryFactory.createLineString(points1);
        List curveSegmentList1 = Collections.singletonList(lineString1);
       
        CurveImpl curve1 = (CurveImpl) primitiveFactory.createCurve(curveSegmentList1);
       
    /* Build Ring from Curve */
    ArrayList<OrientableCurve> curveList = new ArrayList<OrientableCurve>();
    curveList.add(curve1);
   
    RingImplUnsafe ring1 = (RingImplUnsafe) primitiveFactory.createRing(curveList);
    RingImplUnsafe ring2 = (RingImplUnsafe) ring1.transform(crs2);
   
    // create expected result
    PositionFactory expectedPosF2 = new PositionFactoryImpl(crs2, new PrecisionModel());
    PrimitiveFactory expectedPrimF2 = new PrimitiveFactoryImpl(crs2, expectedPosF2);
    GeometryFactory ExpectedGeomF2 = new GeometryFactoryImpl(crs2, expectedPosF2);
   
    List<Position> expectedPoints = new ArrayList<Position>();
    expectedPoints.add(expectedPrimF2.createPoint( new double[]{1187128.000000001, 395268.0000000004} ));
    expectedPoints.add(expectedPrimF2.createPoint( new double[]{1187127.9999999998, 396026.99999999825} ));
    expectedPoints.add(expectedPrimF2.createPoint( new double[]{1188245.0000000007, 396027.0000000039} ));
    expectedPoints.add(expectedPrimF2.createPoint( new double[]{1188245.0000000005, 395268.0000000018} ));
    expectedPoints.add(expectedPrimF2.createPoint( new double[]{1187128.000000001, 395268.0000000004} ));
        LineString expectedLineString = ExpectedGeomF2.createLineString(expectedPoints);
        List expectedCurveSegmentList = Collections.singletonList(expectedLineString);
       
        CurveImpl expectedCurve = (CurveImpl) expectedPrimF2.createCurve(expectedCurveSegmentList);
       
    /* Build Ring from Curve */
    ArrayList<OrientableCurve> expectedCurveList = new ArrayList<OrientableCurve>();
    expectedCurveList.add(expectedCurve);
   
    RingImplUnsafe expectedRing = (RingImplUnsafe) expectedPrimF2.createRing(expectedCurveList);
       
    //System.out.println(ring1);
    //System.out.println(ring2);
    //System.out.println(expectedRing);
   
    //assertTrue(ring2.equals(expectedRing));
    assertEquals(ring2, expectedRing, 0.9);
  }
 
  /**
   * We need to ensure that an IdentityTransform is recognized
   * and the result is *equals* (although perhaps not *equalsExact*.
   * <p>
   * Note I am using GeometryBuilder here as I am interested in testing
   * functionality rather than factories.
   * <p>
   * Thanks to SriPuligundla for the bug report.
   * @throws Exception
   */
  public void testSurfaceIdentityTransform() throws Exception {
      CoordinateReferenceSystem wsg1 = CRS.decode("EPSG:4326");
        CoordinateReferenceSystem wsg2 = CRS.decode("EPSG:4326");
        MathTransform t = CRS.findMathTransform( wsg1, wsg2 );
        assertTrue( "WSG84 transformed to WSG84 should be Identity", t.isIdentity() );
       
        GeometryBuilder builder = new GeometryBuilder( wsg1 );
       
        double array[] = new double[]{
                -123.47009555832284,48.543261561072285,
                -123.46972894676578,48.55009592117936,
                -123.45463828850829,48.54973520267305,
                -123.4550070827961,48.54290089070186,
                -123.47009555832284,48.543261561072285
        };
        PointArray points = builder.createPointArray(array);
        SurfaceBoundary boundary = builder.createSurfaceBoundary(points);
        Surface surface = builder.createSurface(boundary);
        assertNotNull( surface );
       
        Surface surface2 = (Surface) surface.transform( wsg2, t );
        assertNotNull( surface2 );
       
        assertTrue( "object equals", surface.equals( (Object) surface2 ));
        assertTrue( "geometry equals", surface.equals( surface2 ));
  }
 
  public void testSurface() throws Exception {
    PositionFactory positionFactory = new PositionFactoryImpl(crs1, new PrecisionModel());
    PrimitiveFactory primitiveFactory = new PrimitiveFactoryImpl(crs1, positionFactory);
    GeometryFactory geometryFactory = new GeometryFactoryImpl(crs1, positionFactory);
   
    List<Position> points1 = new ArrayList<Position>();
    points1.add(primitiveFactory.createPoint( new double[]{-123.47009555832284,48.543261561072285} ));
    points1.add(primitiveFactory.createPoint( new double[]{-123.46972894676578,48.55009592117936} ));
    points1.add(primitiveFactory.createPoint( new double[]{-123.45463828850829,48.54973520267305} ));
    points1.add(primitiveFactory.createPoint( new double[]{-123.4550070827961,48.54290089070186} ));
    points1.add(primitiveFactory.createPoint( new double[]{-123.47009555832284,48.543261561072285} ));
    LineString lineString1 = geometryFactory.createLineString(points1);
        List curveSegmentList1 = Collections.singletonList(lineString1);
       
        CurveImpl curve1 = (CurveImpl) primitiveFactory.createCurve(curveSegmentList1);
       
    /* Build Ring from Curve */
    ArrayList<OrientableCurve> curveList = new ArrayList<OrientableCurve>();
    curveList.add(curve1);
   
    // Build Ring then SurfaceBoundary then Surface
    RingImpl exteriors = (RingImpl) primitiveFactory.createRing(curveList);
    List<Ring> interiors = new ArrayList<Ring>();
    SurfaceBoundary sboundary = primitiveFactory.createSurfaceBoundary(exteriors, interiors);
    Surface surface1 = primitiveFactory.createSurface(sboundary);
    Surface surface2 = (SurfaceImpl) surface1.transform(crs2);
   
    // create expected result
    PositionFactory expectedPosF2 = new PositionFactoryImpl(crs2, new PrecisionModel());
    PrimitiveFactory expectedPrimF2 = new PrimitiveFactoryImpl(crs2, expectedPosF2);
    GeometryFactory ExpectedGeomF2 = new GeometryFactoryImpl(crs2, expectedPosF2);
   
    List<Position> expectedPoints = new ArrayList<Position>();
    expectedPoints.add(expectedPrimF2.createPoint( new double[]{1187128.000000001, 395268.0000000004} ));
    expectedPoints.add(expectedPrimF2.createPoint( new double[]{1187127.9999999998, 396026.99999999825} ));
    expectedPoints.add(expectedPrimF2.createPoint( new double[]{1188245.0000000007, 396027.0000000039} ));
    expectedPoints.add(expectedPrimF2.createPoint( new double[]{1188245.0000000005, 395268.0000000018} ));
    expectedPoints.add(expectedPrimF2.createPoint( new double[]{1187128.000000001, 395268.0000000004} ));
        LineString expectedLineString = ExpectedGeomF2.createLineString(expectedPoints);
        List expectedCurveSegmentList = Collections.singletonList(expectedLineString);
       
        CurveImpl expectedCurve = (CurveImpl) expectedPrimF2.createCurve(expectedCurveSegmentList);
       
    /* Build Ring from Curve */
    ArrayList<OrientableCurve> expectedCurveList = new ArrayList<OrientableCurve>();
    expectedCurveList.add(expectedCurve);
   
    // Build Ring then SurfaceBoundary then Surface
    RingImpl exteriors2 = (RingImpl) expectedPrimF2.createRing(expectedCurveList);
    List<Ring> interiors2 = new ArrayList<Ring>();
    SurfaceBoundary sboundary2 = expectedPrimF2.createSurfaceBoundary(exteriors2, interiors2);
    Surface expectedSurface = expectedPrimF2.createSurface(sboundary2);
       
    //System.out.println(surface1);
    //System.out.println(surface2);
    //System.out.println(expectedSurface);
   
    //assertTrue(surface2.equals(expectedSurface));
    assertEquals((SurfaceImpl) surface2, (SurfaceImpl) expectedSurface, 0.9);
  }
}
TOP

Related Classes of org.geotools.geometry.iso.operations.TransformTest

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.