/* * Hibernate, Relational Persistence for Idiomatic Java * * License: GNU Lesser General Public License (LGPL), version 2.1 or later. * See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>. */ package org.hibernate.spatial.testing; import com.vividsolutions.jts.geom.Coordinate; import com.vividsolutions.jts.geom.Geometry; import com.vividsolutions.jts.geom.GeometryCollection; /** * This class tests for the equality between geometries. * <p/> * The notion of geometric equality can differ slightly between * spatial databases. * * @deprecated Should be replaced by Geolatte-geom GeometryEquality */ @Deprecated public class GeometryEquality { public boolean test(Geometry geom1, Geometry geom2) { return test( geom1, geom2, false ); } private boolean test(Geometry geom1, Geometry geom2, boolean ignoreSRID) { if ( geom1 == null ) { return geom2 == null; } if ( geom1.isEmpty() ) { return geom2.isEmpty(); } if ( !ignoreSRID && !equalSRID( geom1, geom2 ) ) { return false; } if ( geom1 instanceof GeometryCollection ) { if ( !(geom2 instanceof GeometryCollection) ) { return false; } GeometryCollection expectedCollection = (GeometryCollection) geom1; GeometryCollection receivedCollection = (GeometryCollection) geom2; for ( int partIndex = 0; partIndex < expectedCollection.getNumGeometries(); partIndex++ ) { Geometry partExpected = expectedCollection.getGeometryN( partIndex ); Geometry partReceived = receivedCollection.getGeometryN( partIndex ); if ( !test( partExpected, partReceived, true ) ) { return false; } } return true; } else { return testSimpleGeometryEquality( geom1, geom2 ); } } /** * Two geometries are equal iff both have the same SRID, or both are unknown (i.e. a SRID of 0 or -1). * * @param geom1 * @param geom2 * * @return */ private boolean equalSRID(Geometry geom1, Geometry geom2) { return geom1.getSRID() == geom2.getSRID() || (geom1.getSRID() < 1 && geom2.getSRID() < 1); } /** * Test whether two geometries, not of type GeometryCollection are equal. * * @param geom1 * @param geom2 * * @return */ protected boolean testSimpleGeometryEquality(Geometry geom1, Geometry geom2) { //return geom1.equals(geom2); return testTypeAndVertexEquality( geom1, geom2 ); } protected boolean testTypeAndVertexEquality(Geometry geom1, Geometry geom2) { if ( !geom1.getGeometryType().equals( geom2.getGeometryType() ) ) { return false; } if ( geom1.getNumGeometries() != geom2.getNumGeometries() ) { return false; } if ( geom1.getNumPoints() != geom2.getNumPoints() ) { return false; } Coordinate[] coordinates1 = geom1.getCoordinates(); Coordinate[] coordinates2 = geom2.getCoordinates(); for ( int i = 0; i < coordinates1.length; i++ ) { Coordinate c1 = coordinates1[i]; Coordinate c2 = coordinates2[i]; if ( !testCoordinateEquality( c1, c2 ) ) { return false; } } return true; } private boolean testCoordinateEquality(Coordinate c1, Coordinate c2) { // if ( c1 instanceof MCoordinate ) { // if ( !( c2 instanceof MCoordinate ) ) { // return false; // } // MCoordinate mc1 = (MCoordinate) c1; // MCoordinate mc2 = (MCoordinate) c2; // if ( !Double.isNaN( mc1.m ) && mc1.m != mc2.m ) { // return false; // } // } if ( !Double.isNaN( c1.z ) && c1.z != c2.z ) { return false; } return c1.x == c2.x && c1.y == c2.y; } }