/*
* Copyright (c) 2016 Vivid Solutions.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* and Eclipse Distribution License v. 1.0 which accompanies this distribution.
* The Eclipse Public License is available at http://www.eclipse.org/legal/epl-v10.html
* and the Eclipse Distribution License is available at
*
* http://www.eclipse.org/org/documents/edl-v10.php.
*/
package test.jts.junit;
import java.util.ArrayList;
import org.locationtech.jts.geom.Coordinate;
import org.locationtech.jts.geom.CoordinateSequence;
import org.locationtech.jts.geom.Envelope;
import org.locationtech.jts.geom.Geometry;
import org.locationtech.jts.geom.GeometryCollection;
import org.locationtech.jts.geom.GeometryFactory;
import org.locationtech.jts.geom.LineString;
import org.locationtech.jts.geom.LinearRing;
import org.locationtech.jts.geom.MultiLineString;
import org.locationtech.jts.geom.MultiPoint;
import org.locationtech.jts.geom.MultiPolygon;
import org.locationtech.jts.geom.Point;
import org.locationtech.jts.geom.Polygon;
import org.locationtech.jts.geom.PrecisionModel;
import org.locationtech.jts.io.WKTReader;
import junit.framework.TestCase;
import junit.textui.TestRunner;
/**
* @version 1.7
*/
public class MiscellaneousTest extends TestCase {
PrecisionModel precisionModel = new PrecisionModel(1);
GeometryFactory geometryFactory = new GeometryFactory(precisionModel, 0);
WKTReader reader = new WKTReader(geometryFactory);
public static void main(String args[]) {
TestRunner.run(MiscellaneousTest.class);
}
public void testEnvelopeCloned() throws Exception {
Geometry a = reader.read("LINESTRING(0 0, 10 10)");
//Envelope is lazily initialized [Jon Aquino]
a.getEnvelopeInternal();
Geometry b = (Geometry)a.clone();
assertTrue(a.getEnvelopeInternal() != b.getEnvelopeInternal());
}
public MiscellaneousTest(String name) { super(name); }
public void testCreateEmptyGeometry() throws Exception {
assertTrue(geometryFactory.createPoint((Coordinate)null).isEmpty());
assertTrue(geometryFactory.createLinearRing(new Coordinate[] { }).isEmpty());
assertTrue(geometryFactory.createLineString(new Coordinate[] { }).isEmpty());
assertTrue(geometryFactory.createPolygon(geometryFactory.createLinearRing(new Coordinate[] { }), new LinearRing[] { }).isEmpty());
assertTrue(geometryFactory.createMultiPolygon(new Polygon[] { }).isEmpty());
assertTrue(geometryFactory.createMultiLineString(new LineString[] { }).isEmpty());
assertTrue(geometryFactory.createMultiPoint(new Point[] { }).isEmpty());
assertTrue(geometryFactory.createPoint((Coordinate)null).isSimple());
assertTrue(geometryFactory.createLinearRing(new Coordinate[] { }).isSimple());
/**
* @todo Enable when #isSimple implemented
*/
// assertTrue(geometryFactory.createLineString(new Coordinate[] { }).isSimple());
// assertTrue(geometryFactory.createPolygon(geometryFactory.createLinearRing(new Coordinate[] { }), new LinearRing[] { }).isSimple());
// assertTrue(geometryFactory.createMultiPolygon(new Polygon[] { }).isSimple());
// assertTrue(geometryFactory.createMultiLineString(new LineString[] { }).isSimple());
// assertTrue(geometryFactory.createMultiPoint(new Point[] { }).isSimple());
assertTrue(geometryFactory.createPoint((Coordinate)null).getBoundary().isEmpty());
assertTrue(geometryFactory.createLinearRing(new Coordinate[] { }).getBoundary().isEmpty());
assertTrue(geometryFactory.createLineString(new Coordinate[] { }).getBoundary().isEmpty());
assertTrue(geometryFactory.createPolygon(geometryFactory.createLinearRing(new Coordinate[] { }), new LinearRing[] { }).getBoundary().isEmpty());
assertTrue(geometryFactory.createMultiPolygon(new Polygon[] { }).getBoundary().isEmpty());
assertTrue(geometryFactory.createMultiLineString(new LineString[] { }).getBoundary().isEmpty());
assertTrue(geometryFactory.createMultiPoint(new Point[] { }).getBoundary().isEmpty());
assertTrue(geometryFactory.createLinearRing((CoordinateSequence)null).isEmpty());
assertTrue(geometryFactory.createLineString((Coordinate[])null).isEmpty());
assertTrue(geometryFactory.createPolygon(null, null).isEmpty());
assertTrue(geometryFactory.createMultiPolygon(null).isEmpty());
assertTrue(geometryFactory.createMultiLineString(null).isEmpty());
assertTrue(geometryFactory.createMultiPoint((Point[]) null).isEmpty());
assertEquals(-1, (geometryFactory.createPoint((Coordinate)null)).getBoundaryDimension());
assertEquals(-1, (geometryFactory.createLinearRing((CoordinateSequence)null)).getBoundaryDimension());
assertEquals(0, (geometryFactory.createLineString((Coordinate[])null)).getBoundaryDimension());
assertEquals(1, (geometryFactory.createPolygon(null, null)).getBoundaryDimension());
assertEquals(1, (geometryFactory.createMultiPolygon(null)).getBoundaryDimension());
assertEquals(0, (geometryFactory.createMultiLineString(null)).getBoundaryDimension());
assertEquals(-1, (geometryFactory.createMultiPoint((Point[]) null)).getBoundaryDimension());
assertEquals(0, (geometryFactory.createPoint((Coordinate)null)).getNumPoints());
assertEquals(0, (geometryFactory.createLinearRing((CoordinateSequence)null)).getNumPoints());
assertEquals(0, (geometryFactory.createLineString((Coordinate[])null)).getNumPoints());
assertEquals(0, (geometryFactory.createPolygon(null, null)).getNumPoints());
assertEquals(0, (geometryFactory.createMultiPolygon(null)).getNumPoints());
assertEquals(0, (geometryFactory.createMultiLineString(null)).getNumPoints());
assertEquals(0, (geometryFactory.createMultiPoint((Point[]) null)).getNumPoints());
assertEquals(0, (geometryFactory.createPoint((Coordinate)null)).getCoordinates().length);
assertEquals(0, (geometryFactory.createLinearRing((CoordinateSequence)null)).getCoordinates().length);
assertEquals(0, (geometryFactory.createLineString((Coordinate[])null)).getCoordinates().length);
assertEquals(0, (geometryFactory.createPolygon(null, null)).getCoordinates().length);
assertEquals(0, (geometryFactory.createMultiPolygon(null)).getCoordinates().length);
assertEquals(0, (geometryFactory.createMultiLineString(null)).getCoordinates().length);
assertEquals(0, (geometryFactory.createMultiPoint((Point[]) null)).getCoordinates().length);
}
public void testBoundaryOfEmptyGeometry() throws Exception {
assertTrue(geometryFactory.createPoint((Coordinate)null).getBoundary().getClass() == GeometryCollection.class);
assertTrue(geometryFactory.createLinearRing(new Coordinate[] { }).getBoundary().getClass() == MultiPoint.class);
assertTrue(geometryFactory.createLineString(new Coordinate[] { }).getBoundary().getClass() == MultiPoint.class);
assertTrue(geometryFactory.createPolygon(geometryFactory.createLinearRing(new Coordinate[] { }), new LinearRing[] { }).getBoundary().getClass() == MultiLineString.class);
assertTrue(geometryFactory.createMultiPolygon(new Polygon[] { }).getBoundary().getClass() == MultiLineString.class);
assertTrue(geometryFactory.createMultiLineString(new LineString[] { }).getBoundary().getClass() == MultiPoint.class);
assertTrue(geometryFactory.createMultiPoint(new Point[] { }).getBoundary().getClass() == GeometryCollection.class);
try {
geometryFactory.createGeometryCollection(new Geometry[] { }).getBoundary();
assertTrue(false);
}
catch (IllegalArgumentException e) {
}
}
public void testToPointArray() {
ArrayList list = new ArrayList();
list.add(geometryFactory.createPoint(new Coordinate(0, 0)));
list.add(geometryFactory.createPoint(new Coordinate(10, 0)));
list.add(geometryFactory.createPoint(new Coordinate(10, 10)));
list.add(geometryFactory.createPoint(new Coordinate(0, 10)));
list.add(geometryFactory.createPoint(new Coordinate(0, 0)));
Point[] points = GeometryFactory.toPointArray(list);
assertEquals(10, points[1].getX(), 1E-1);
assertEquals(0, points[1].getY(), 1E-1);
}
public void testPolygonGetCoordinates() throws Exception {
Polygon p = (Polygon) reader.read(
"POLYGON ( (0 0, 100 0, 100 100, 0 100, 0 0), "
+ " (20 20, 20 80, 80 80, 80 20, 20 20)) ");
Coordinate[] coordinates = p.getCoordinates();
assertEquals(10, p.getNumPoints());
assertEquals(10, coordinates.length);
assertEquals(new Coordinate(0, 0), coordinates[0]);
assertEquals(new Coordinate(20, 20), coordinates[9]);
}
public void testEmptyPoint() throws Exception {
Point p = geometryFactory.createPoint((Coordinate)null);
assertEquals(0, p.getDimension());
assertEquals(new Envelope(), p.getEnvelopeInternal());
assertTrue(p.isSimple());
try {
p.getX();
assertTrue(false);
}
catch (IllegalStateException e1) {
}
try {
p.getY();
assertTrue(false);
}
catch (IllegalStateException e2) {
}
assertEquals("POINT EMPTY", p.toString());
assertEquals("POINT EMPTY", p.toText());
}
public void testEmptyLineString() throws Exception {
LineString l = geometryFactory.createLineString((Coordinate[])null);
assertEquals(1, l.getDimension());
assertEquals(new Envelope(), l.getEnvelopeInternal());
/**
* @todo Enable when #isSimple implemented
*/
// assertTrue(l.isSimple());
assertEquals(null, l.getStartPoint());
assertEquals(null, l.getEndPoint());
assertTrue(! l.isClosed());
assertTrue(! l.isRing());
}
public void testEmptyLinearRing() throws Exception {
LineString l = geometryFactory.createLinearRing((CoordinateSequence)null);
assertEquals(1, l.getDimension());
assertEquals(new Envelope(), l.getEnvelopeInternal());
assertTrue(l.isSimple());
assertEquals(null, l.getStartPoint());
assertEquals(null, l.getEndPoint());
assertTrue(l.isClosed());
assertTrue(l.isRing());
}
public void testEmptyPolygon() throws Exception {
Polygon p = geometryFactory.createPolygon(null, null);
assertEquals(2, p.getDimension());
assertEquals(new Envelope(), p.getEnvelopeInternal());
assertTrue(p.isSimple());
}
public void testEmptyGeometryCollection() throws Exception {
GeometryCollection g = geometryFactory.createGeometryCollection(null);
assertEquals(-1, g.getDimension());
assertEquals(new Envelope(), g.getEnvelopeInternal());
assertTrue(g.isSimple());
}
public void testEmptyMultiPoint() throws Exception {
MultiPoint g = geometryFactory.createMultiPoint((Point[])null);
assertEquals(0, g.getDimension());
assertEquals(new Envelope(), g.getEnvelopeInternal());
/**
* @todo Enable when #isSimple implemented
*/
// assertTrue(g.isSimple());
}
public void testEmptyMultiLineString() throws Exception {
MultiLineString g = geometryFactory.createMultiLineString(null);
assertEquals(1, g.getDimension());
assertEquals(new Envelope(), g.getEnvelopeInternal());
/**
* @todo Enable when #isSimple implemented
*/
// assertTrue(g.isSimple());
assertTrue(! g.isClosed());
}
public void testEmptyMultiPolygon() throws Exception {
MultiPolygon g = geometryFactory.createMultiPolygon(null);
assertEquals(2, g.getDimension());
assertEquals(new Envelope(), g.getEnvelopeInternal());
assertTrue(g.isSimple());
}
public void testGetGeometryType() throws Exception {
GeometryCollection g = geometryFactory.createMultiPolygon(null);
assertEquals("MultiPolygon", g.getGeometryType());
}
public void testMultiPolygonIsSimple1() throws Exception {
Geometry g = reader.read("MULTIPOLYGON (((10 10, 10 20, 20 20, 20 15, 10 10)), ((60 60, 70 70, 80 60, 60 60)))");
assertTrue(g.isSimple());
}
public void testPointIsSimple() throws Exception {
Geometry g = reader.read("POINT (10 10)");
assertTrue(g.isSimple());
}
public void testPointGetBoundary() throws Exception {
Geometry g = reader.read("POINT (10 10)");
assertTrue(g.getBoundary().isEmpty());
}
/**
* @todo Enable when #isSimple implemented
*/
// public void testMultiPointIsSimple1() throws Exception {
// Geometry g = reader.read("MULTIPOINT(10 10, 20 20, 30 30)");
// assertTrue(g.isSimple());
// }
public void testMultiPointGetBoundary() throws Exception {
Geometry g = reader.read("MULTIPOINT(10 10, 20 20, 30 30)");
assertTrue(g.getBoundary().isEmpty());
}
/**
* @todo Enable when #isSimple implemented
*/
// public void testMultiPointIsSimple2() throws Exception {
// Geometry g = reader.read("MULTIPOINT(10 10, 30 30, 30 30)");
// assertTrue(! g.isSimple());
// }
/**
* @todo Enable when #isSimple implemented
*/
// public void testLineStringIsSimple1() throws Exception {
// Geometry g = reader.read("LINESTRING(10 10, 20 10, 15 20)");
// assertTrue(g.isSimple());
// }
public void testLineStringGetBoundary1() throws Exception {
LineString g = (LineString) reader.read("LINESTRING(10 10, 20 10, 15 20)");
assertTrue(g.getBoundary() instanceof MultiPoint);
MultiPoint boundary = (MultiPoint) g.getBoundary();
assertTrue(boundary.getGeometryN(0).equals(g.getStartPoint()));
assertTrue(boundary.getGeometryN(1).equals(g.getEndPoint()));
}
public void testLineStringGetBoundary2() throws Exception {
LineString g = (LineString) reader.read("LINESTRING(10 10, 20 10, 15 20, 10 10)");
assertTrue(g.getBoundary().isEmpty());
}
/**
* @todo Enable when #isSimple implemented
*/
// public void testLineStringIsSimple2() throws Exception {
// Geometry g = reader.read("LINESTRING(10 10, 20 10, 15 20, 15 0)");
// assertTrue(! g.isSimple());
// }
public void testLinearRingIsSimple() throws Exception {
Coordinate[] coordinates = { new Coordinate(10, 10, 0),
new Coordinate(10, 20, 0),
new Coordinate(20, 20, 0),
new Coordinate(20, 15, 0),
new Coordinate(10, 10, 0) };
LinearRing linearRing = geometryFactory.createLinearRing(coordinates);
assertTrue(linearRing.isSimple());
}
public void testPolygonIsSimple() throws Exception {
Geometry g = reader.read("POLYGON((10 10, 10 20, 202 0, 20 15, 10 10))");
assertTrue(g.isSimple());
}
public void testPolygonGetBoundary() throws Exception {
Geometry g = reader.read("POLYGON("
+ "(0 0, 40 0, 40 40, 0 40, 0 0),"
+ "(10 10, 30 10, 30 30, 10 30, 10 10))");
Geometry b = reader.read("MULTILINESTRING("
+ "(0 0, 40 0, 40 40, 0 40, 0 0),"
+ "(10 10, 30 10, 30 30, 10 30, 10 10))");
assertTrue(b.equalsExact(g.getBoundary()));
}
public void testMultiPolygonGetBoundary1() throws Exception {
Geometry g = reader.read("MULTIPOLYGON("
+ "( (0 0, 40 0, 40 40, 0 40, 0 0),"
+ " (10 10, 30 10, 30 30, 10 30, 10 10) ),"
+ "( (200 200, 210 200, 210 210, 200 200) ) )");
Geometry b = reader.read("MULTILINESTRING("
+ "(0 0, 40 0, 40 40, 0 40, 0 0),"
+ "(10 10, 30 10, 30 30, 10 30, 10 10),"
+ "(200 200, 210 200, 210 210, 200 200))");
assertTrue(b.equalsExact(g.getBoundary()));
}
public void testMultiPolygonIsSimple2() throws Exception {
Geometry g = reader.read("MULTIPOLYGON("
+ "((10 10, 10 20, 20 20, 20 15, 10 10)), "
+ "((60 60, 70 70, 80 60, 60 60)) )");
assertTrue(g.isSimple());
}
// public void testGeometryCollectionIsSimple1() throws Exception {
// Geometry g = reader.read("GEOMETRYCOLLECTION("
// + "LINESTRING(0 0, 100 0),"
// + "LINESTRING(0 10, 100 10))");
// assertTrue(g.isSimple());
// }
// public void testGeometryCollectionIsSimple2() throws Exception {
// Geometry g = reader.read("GEOMETRYCOLLECTION("
// + "LINESTRING(0 0, 100 0),"
// + "LINESTRING(50 0, 100 10))");
// assertTrue(! g.isSimple());
// }
/**
* @todo Enable when #isSimple implemented
*/
// public void testMultiLineStringIsSimple1() throws Exception {
// Geometry g = reader.read("MULTILINESTRING("
// + "(0 0, 100 0),"
// + "(0 10, 100 10))");
// assertTrue(g.isSimple());
// }
/**
* @todo Enable when #isSimple implemented
*/
// public void testMultiLineStringIsSimple2() throws Exception {
// Geometry g = reader.read("MULTILINESTRING("
// + "(0 0, 100 0),"
// + "(50 0, 100 10))");
// assertTrue(! g.isSimple());
// }
public void testMultiLineStringGetBoundary1() throws Exception {
Geometry g = reader.read("MULTILINESTRING("
+ "(0 0, 100 0, 50 50),"
+ "(50 50, 50 -50))");
Geometry m = reader.read("MULTIPOINT(0 0, 50 -50)");
assertTrue(m.equalsExact(g.getBoundary()));
}
public void testMultiLineStringGetBoundary2() throws Exception {
Geometry g = reader.read("MULTILINESTRING("
+ "(0 0, 100 0, 50 50),"
+ "(50 50, 50 0))");
Geometry m = reader.read("MULTIPOINT(0 0, 50 0)");
assertTrue(m.equalsExact(g.getBoundary()));
}
// public void testGeometryCollectionGetBoundary1() throws Exception {
// Geometry g = reader.read("GEOMETRYCOLLECTION("
// + "POLYGON((0 0, 100 0, 100 100, 0 100, 0 0)),"
// + "LINESTRING(200 100, 200 0))");
// Geometry b = reader.read("GEOMETRYCOLLECTION("
// + "LINESTRING(0 0, 100 0, 100 100, 0 100, 0 0),"
// + "LINESTRING(200 100, 200 0))");
// assertEquals(b, g.getBoundary());
// assertTrue(! g.equals(g.getBoundary()));
// }
// public void testGeometryCollectionGetBoundary2() throws Exception {
// Geometry g = reader.read("GEOMETRYCOLLECTION("
// + "POLYGON((0 0, 100 0, 100 100, 0 100, 0 0)),"
// + "LINESTRING(50 50, 60 60))");
// Geometry b = reader.read("GEOMETRYCOLLECTION("
// + "LINESTRING(0 0, 100 0, 100 100, 0 100, 0 0))");
// assertEquals(b, g.getBoundary());
// }
// public void testGeometryCollectionGetBoundary3() throws Exception {
// Geometry g = reader.read("GEOMETRYCOLLECTION("
// + "POLYGON((0 0, 100 0, 100 100, 0 100, 0 0)),"
// + "LINESTRING(50 50, 150 50))");
// Geometry b = reader.read("GEOMETRYCOLLECTION("
// + "LINESTRING(0 0, 100 0, 100 100, 0 100, 0 0),"
// + "POINT(150 50))");
// assertEquals(b, g.getBoundary());
// }
public void testCoordinateNaN() {
Coordinate c1 = new Coordinate();
assertTrue(! Double.isNaN(c1.x));
assertTrue(! Double.isNaN(c1.y));
assertTrue(Double.isNaN(c1.z));
Coordinate c2 = new Coordinate(3,4);
assertEquals(3,c2.x,1E-10);
assertEquals(4,c2.y,1E-10);
assertTrue(Double.isNaN(c2.z));
assertEquals(c1,c1);
assertEquals(c2,c2);
assertTrue(! c1.equals(c2));
assertEquals(new Coordinate(),new Coordinate(0,0));
assertEquals(new Coordinate(3,5),new Coordinate(3,5));
assertEquals(new Coordinate(3,5,Double.NaN),new Coordinate(3,5,Double.NaN));
assertTrue(new Coordinate(3,5,0).equals(new Coordinate(3,5,Double.NaN)));
}
public void testPredicatesReturnFalseForEmptyGeometries() {
Point p1 = new GeometryFactory().createPoint((Coordinate)null);
Point p2 = new GeometryFactory().createPoint(new Coordinate(5,5));
assertEquals(false, p1.equals(p2));
assertEquals(true, p1.disjoint(p2));
assertEquals(false, p1.intersects(p2));
assertEquals(false, p1.touches(p2));
assertEquals(false, p1.crosses(p2));
assertEquals(false, p1.within(p2));
assertEquals(false, p1.contains(p2));
assertEquals(false, p1.overlaps(p2));
assertEquals(false, p2.equals(p1));
assertEquals(true, p2.disjoint(p1));
assertEquals(false, p2.intersects(p1));
assertEquals(false, p2.touches(p1));
assertEquals(false, p2.crosses(p1));
assertEquals(false, p2.within(p1));
assertEquals(false, p2.contains(p1));
assertEquals(false, p2.overlaps(p1));
}
}