/*
* 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.data.oracle.sdo;
import org.geotools.data.oracle.sdo.MDSYS.SDO_GEOMETRY;
import org.junit.Test;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import com.vividsolutions.jts.geom.Geometry;
import com.vividsolutions.jts.geom.GeometryFactory;
import com.vividsolutions.jts.io.ParseException;
import com.vividsolutions.jts.io.WKTReader;
/**
* Unit tests for {@link SDO} <code>create*</code> methods.
* These test that the SDO create methods work correctly to read raw Oracle
* SDO_GEOMETRY structures into {@link Geometry} objects.
* These tests do not require a connection to Oracle.
*
* @author mbdavis
*/
public class SDOCreateTest {
private static final int NULL = 0;
public void testTest() throws Exception {
testXYZM_MultiLineString();
}
@Test
public void testXY_Point() throws Exception {
SDO_GEOMETRY oraGeom = MDSYS.SDO_GEOMETRY(2001, NULL, NULL,
MDSYS.SDO_ELEM_INFO_ARRAY(1, 1, 1), MDSYS.SDO_ORDINATE_ARRAY(50, 50));
checkValue(oraGeom, "POINT (50 50)");
}
@Test
public void testXYM_Point() throws Exception {
SDO_GEOMETRY oraGeom = MDSYS.SDO_GEOMETRY(3301, NULL, NULL,
MDSYS.SDO_ELEM_INFO_ARRAY(1, 1, 1), MDSYS.SDO_ORDINATE_ARRAY(50, 50, 100));
checkValue(oraGeom, 3, "POINT (50 50 100)");
}
@Test
public void testXYZM_Point() throws Exception {
SDO_GEOMETRY oraGeom = MDSYS.SDO_GEOMETRY(4001, NULL, NULL,
MDSYS.SDO_ELEM_INFO_ARRAY(1, 1, 1), MDSYS.SDO_ORDINATE_ARRAY(50, 50, 100, 200));
checkValue(oraGeom, 3, "POINT (50 50 100)");
}
@Test
public void testXYZ_LineString() throws Exception {
SDO_GEOMETRY oraGeom = MDSYS.SDO_GEOMETRY(3002, NULL, NULL,
MDSYS.SDO_ELEM_INFO_ARRAY(1, 2, 1), MDSYS.SDO_ORDINATE_ARRAY(0, 0, 0, 50, 50, 100));
checkValue(oraGeom, "LINESTRING (0 0 0, 50 50 100)");
}
@Test
public void testXYM_LineString() throws Exception {
SDO_GEOMETRY oraGeom = MDSYS.SDO_GEOMETRY(3302, NULL, NULL,
MDSYS.SDO_ELEM_INFO_ARRAY(1, 2, 1), MDSYS.SDO_ORDINATE_ARRAY(1, 1, 20, 2, 2, 30));
checkValue(oraGeom, "LINESTRING (1 1, 2 2)");
}
@Test
public void testXYMZ_LineString() throws Exception {
SDO_GEOMETRY oraGeom = MDSYS.SDO_GEOMETRY(4302, 8307, NULL,
MDSYS.SDO_ELEM_INFO_ARRAY(1, 2, 1),
MDSYS.SDO_ORDINATE_ARRAY(0, 0, 2, 3, 50, 50, 100, 200));
checkValue(oraGeom, "LINESTRING (0 0, 50 50)");
}
@Test
public void testXYZ_MultiPoint() throws Exception {
SDO_GEOMETRY oraGeom = MDSYS.SDO_GEOMETRY(3005, NULL, NULL,
MDSYS.SDO_ELEM_INFO_ARRAY(1, 1, 2),
MDSYS.SDO_ORDINATE_ARRAY(50, 50, 5, 100, 200, 300));
checkValue(oraGeom, "MULTIPOINT ((50 50 5), (100 200 300))");
}
@Test
public void testXYZ_MultiLineString() throws Exception {
SDO_GEOMETRY oraGeom = MDSYS.SDO_GEOMETRY(3006, 8307, NULL,
MDSYS.SDO_ELEM_INFO_ARRAY(1, 2, 1, 7, 2, 1),
MDSYS.SDO_ORDINATE_ARRAY(0, 0, 2, 50, 50, 100, 10, 10, 12, 150, 150, 110));
checkValue(oraGeom, "MULTILINESTRING ((0 0, 50 50), (10 10, 150 150))");
}
@Test
public void testXYMZ_MultiLineString() throws Exception {
SDO_GEOMETRY oraGeom = MDSYS.SDO_GEOMETRY(4306, 8307, NULL, MDSYS.SDO_ELEM_INFO_ARRAY(1, 2,
1, 9, 2, 1), MDSYS.SDO_ORDINATE_ARRAY(0, 0, 2, 3, 50, 50, 100, 200, 10, 10, 12, 13,
150, 150, 110, 210));
checkValue(oraGeom, "MULTILINESTRING ((0 0, 50 50), (10 10, 150 150))");
}
@Test
public void testXYZM_MultiLineString() throws Exception {
SDO_GEOMETRY oraGeom = MDSYS.SDO_GEOMETRY(4406, 8307, NULL, MDSYS.SDO_ELEM_INFO_ARRAY(1, 2,
1, 9, 2, 1), MDSYS.SDO_ORDINATE_ARRAY(0, 0, 2, 3, 50, 50, 100, 200, 10, 10, 12, 13,
150, 150, 110, 210));
checkValue(oraGeom, "MULTILINESTRING ((0 0, 50 50), (10 10, 150 150))");
}
@Test
public void testXY_Polygon() throws Exception {
SDO_GEOMETRY oraGeom = MDSYS.SDO_GEOMETRY(2003, NULL, NULL,
MDSYS.SDO_ELEM_INFO_ARRAY(1, 1003, 1),
MDSYS.SDO_ORDINATE_ARRAY(0, 0, 50, 0, 50, 50, 0, 50, 0, 0));
checkValue(oraGeom, "POLYGON ((0 0, 50 0, 50 50, 0 50, 0 0))");
}
@Test
public void testXYZ_Polygon() throws Exception {
SDO_GEOMETRY oraGeom = MDSYS.SDO_GEOMETRY(3003, NULL, NULL,
MDSYS.SDO_ELEM_INFO_ARRAY(1, 1003, 1),
MDSYS.SDO_ORDINATE_ARRAY(0, 0, 99, 50, 0, 99, 50, 50, 99, 0, 50, 99, 0, 0, 99));
checkValue(oraGeom, "POLYGON ((0 0, 50 0, 50 50, 0 50, 0 0))");
}
@Test
public void testXYM_Polygon() throws Exception {
SDO_GEOMETRY oraGeom = MDSYS.SDO_GEOMETRY(3303, NULL, NULL,
MDSYS.SDO_ELEM_INFO_ARRAY(1, 1003, 1),
MDSYS.SDO_ORDINATE_ARRAY(0, 0, 99, 50, 0, 99, 50, 50, 99, 0, 50, 99, 0, 0, 99));
checkValue(oraGeom, "POLYGON ((0 0, 50 0, 50 50, 0 50, 0 0))");
}
@Test
public void testXYZ_PolygonWithHole() throws Exception {
checkValue(MDSYS.SDO_GEOMETRY(3003, NULL, NULL, MDSYS.SDO_ELEM_INFO_ARRAY(1, 1003, 1, 28,
2003, 1), MDSYS.SDO_ORDINATE_ARRAY(2, 4, 99, 4, 3, 99, 10, 3, 99, 13, 5, 99, 13, 9,
99, 11, 13, 99, 5, 13, 99, 2, 11, 99, 2, 4, 99, 7, 5, 99, 7, 10, 99, 10, 10, 99,
10, 5, 99, 7, 5, 99)),
"POLYGON ((2 4, 4 3, 10 3, 13 5, 13 9, 11 13, 5 13, 2 11, 2 4), (7 5, 7 10, 10 10, 10 5, 7 5))");
}
@Test
public void testXYM_PolygonWithHole() throws Exception {
checkValue(MDSYS.SDO_GEOMETRY(3303, NULL, NULL, MDSYS.SDO_ELEM_INFO_ARRAY(1, 1003, 1, 28,
2003, 1), MDSYS.SDO_ORDINATE_ARRAY(2, 4, 99, 4, 3, 99, 10, 3, 99, 13, 5, 99, 13, 9,
99, 11, 13, 99, 5, 13, 99, 2, 11, 99, 2, 4, 99, 7, 5, 99, 7, 10, 99, 10, 10, 99,
10, 5, 99, 7, 5, 99)),
"POLYGON ((2 4, 4 3, 10 3, 13 5, 13 9, 11 13, 5 13, 2 11, 2 4), (7 5, 7 10, 10 10, 10 5, 7 5))");
}
@Test
public void testXY_MultiPolygon() throws Exception {
checkValue(MDSYS.SDO_GEOMETRY(2007, NULL, NULL,
MDSYS.SDO_ELEM_INFO_ARRAY(1, 1003, 1, 11, 1003, 1),
MDSYS.SDO_ORDINATE_ARRAY(2, 3, 7, 3, 7, 9, 2, 9, 2, 3, 9, 5, 13, 5, 11, 5, 9, 5)),
"MULTIPOLYGON (((2 3, 7 3, 7 9, 2 9, 2 3)), ((9 5, 13 5, 11 5, 9 5)))");
}
@Test
public void testXYZ_MultiPolygon() throws Exception {
checkValue(MDSYS.SDO_GEOMETRY(3007, NULL, NULL, MDSYS.SDO_ELEM_INFO_ARRAY(1, 1003, 1, 16,
1003, 1), MDSYS.SDO_ORDINATE_ARRAY(2, 3, 99, 7, 3, 99, 7, 9, 99, 2, 9, 99, 2, 3,
99, 9, 5, 99, 13, 5, 99, 11, 5, 99, 9, 5, 99)),
"MULTIPOLYGON (((2 3, 7 3, 7 9, 2 9, 2 3)), ((9 5, 13 5, 11 5, 9 5)))");
}
@Test
public void testXYM_MultiPolygon() throws Exception {
checkValue(MDSYS.SDO_GEOMETRY(3307, NULL, NULL, MDSYS.SDO_ELEM_INFO_ARRAY(1, 1003, 1, 16,
1003, 1), MDSYS.SDO_ORDINATE_ARRAY(2, 3, 99, 7, 3, 99, 7, 9, 99, 2, 9, 99, 2, 3,
99, 9, 5, 99, 13, 5, 99, 11, 5, 99, 9, 5, 99)),
"MULTIPOLYGON (((2 3, 7 3, 7 9, 2 9, 2 3)), ((9 5, 13 5, 11 5, 9 5)))");
}
@Test
public void testXYZM_MultiPolygon() throws Exception {
checkValue(MDSYS.SDO_GEOMETRY(4307, NULL, NULL, MDSYS.SDO_ELEM_INFO_ARRAY(1, 1003, 1, 21,
1003, 1), MDSYS.SDO_ORDINATE_ARRAY(2, 3, 99, 88, 7, 3, 99, 88, 7, 9, 99, 88, 2, 9,
99, 88, 2, 3, 99, 88, 9, 5, 99, 88, 13, 5, 99, 88, 11, 5, 99, 88, 9, 5, 99, 88)),
"MULTIPOLYGON (((2 3, 7 3, 7 9, 2 9, 2 3)), ((9 5, 13 5, 11 5, 9 5)))");
}
@Test
public void testXY_GeometryCollection_Doc() throws Exception {
checkValue( MDSYS.SDO_GEOMETRY(2004, NULL, NULL,
MDSYS.SDO_ELEM_INFO_ARRAY(1,1,1, 3,2,1, 7,1003,1, 17,1003,1, 25,2003,1),
MDSYS.SDO_ORDINATE_ARRAY(
1,1,
1,2, 2,1,
2,2, 3,2, 3,3, 2,3, 2,2,
5,1, 9,5, 5,5, 5,1,
5,3, 6,4, 6,3, 5,3 ) ),
"GEOMETRYCOLLECTION (POINT (1 1), LINESTRING (1 2, 2 1), POLYGON ((2 2, 3 2, 3 3, 2 3, 2 2)), POLYGON ((5 1, 9 5, 5 5, 5 1), (5 3, 6 4, 6 3, 5 3)))");
}
@Test
public void testXYM_GeometryCollection_Doc() throws Exception {
checkValue( MDSYS.SDO_GEOMETRY(3304, NULL, NULL,
MDSYS.SDO_ELEM_INFO_ARRAY(1,1,1, 4,2,1, 10,1003,1, 25,1003,1, 37,2003,1),
MDSYS.SDO_ORDINATE_ARRAY(
1,1,99,
1,2,99, 2,1,99,
2,2,99, 3,2,99, 3,3,99, 2,3,99, 2,2,99,
5,1,99, 9,5,99, 5,5,99, 5,1,99,
5,3,99, 6,4,99, 6,3,99, 5,3,99 ) ),
"GEOMETRYCOLLECTION (POINT (1 1), LINESTRING (1 2, 2 1), POLYGON ((2 2, 3 2, 3 3, 2 3, 2 2)), POLYGON ((5 1, 9 5, 5 5, 5 1), (5 3, 6 4, 6 3, 5 3)))");
}
// =======================================================
void checkValue(SDO_GEOMETRY oraGeom, String wkt) {
checkValue(oraGeom, -1, wkt);
}
void checkValue(SDO_GEOMETRY oraGeom, int targetDim, String wkt) {
final GeometryFactory geometryFactory = new GeometryFactory();
WKTReader wktRdr = new WKTReader();
final Geometry actual = create(oraGeom, geometryFactory);
Geometry expected = null;
try {
expected = wktRdr.read(wkt);
} catch (ParseException e) {
throw new RuntimeException(e);
}
boolean isEqual = actual.equalsNorm(expected);
if (!isEqual) {
System.out.println("Expected " + expected + ", actual " + actual);
}
assertTrue(isEqual);
}
private Geometry create(SDO_GEOMETRY oraGeom, GeometryFactory gf) {
return SDO.create(gf, oraGeom.gType, oraGeom.srid, oraGeom.ptType, oraGeom.elemInfo,
oraGeom.ordinates);
}
}