/*
* GeoTools - The Open Source Java GIS Toolkit
* http://geotools.org
*
* (C) 2003-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.
*
* Refractions Research Inc. Can be found on the web at:
* http://www.refractions.net/
*/
package org.geotools.data.oracle.sdo;
import com.vividsolutions.jts.geom.Coordinate;
import com.vividsolutions.jts.geom.CoordinateSequence;
import com.vividsolutions.jts.geom.Geometry;
import com.vividsolutions.jts.geom.GeometryCollection;
import com.vividsolutions.jts.geom.GeometryFactory;
import com.vividsolutions.jts.geom.LineString;
import com.vividsolutions.jts.geom.LinearRing;
import com.vividsolutions.jts.geom.MultiLineString;
import com.vividsolutions.jts.geom.MultiPoint;
import com.vividsolutions.jts.geom.MultiPolygon;
import com.vividsolutions.jts.geom.Point;
import com.vividsolutions.jts.geom.Polygon;
import com.vividsolutions.jts.geom.PrecisionModel;
/**
* Construct geometry used by test cases.
* <p>
* Several examples are from the the Oracle Spatial Geometry Spec.</p>
*
* @see net.refractions.jspatial.jts
* @author jgarnett, Refractions Reasearch Inc.
*
* @source $URL$
* @version CVS Version
*/
public class GeometryFixture {
GeometryFactory gf;
/**
* Geometry Example "2.3.1 Rectangle".
* <p>
* A simple rectangle as used with CAD applications</p>
* <code><pre>
* (1,7) (5,7)
* +-------------+
* | |
* | |
* +-------------+
* (1,1) (5,1)
* </pre><code>
*/
public Polygon rectangle;
/** Polygon used for testing */
public Polygon polygon;
/**
* Geometry Example "2.3.2 Polygon with Hole".
* <p>
* A Polygon with a Hole as follows:</p>
* <code><pre>
* 5,13+-------------+ 11,13
* / \
* 2,11+ \
* | 7,10+----+10,10 \
* | | | +13,9
* | | | |
* | | | |
* | 7,5+----+10,5 +13,5
* 2,4+ /
* \ /
* 4,3+---------------+10,3
* </pre></code>
*/
public Polygon polygonWithHole;
/**
* Geometry Example "2.3.5 Point".
* <p>
* Simple Point used to test POINT_TYPE array use.</p>
* <code><pre>
* + 12,14
* </pre></code>
*/
public Point point;
/** LineString used for testing */
public LineString lineString;
/** MultiPoint used for testing */
public MultiPoint multiPoint;
/** MultiLineString used for testing */
public MultiLineString multiLineString;
/** MultiPolygon used for testing */
public MultiPolygon multiPolygon;
/** MultiPolygon used for testing */
public MultiPolygon multiPolygonWithHole;
/** GeometryCollection used for testing */
public GeometryCollection geometryCollection;
/**
* Construct Fixture for use with default GeometryFactory.
*/
public GeometryFixture(){
this( new GeometryFactory(new PrecisionModel(), -1) );
}
/**
* Construct Fixture for use with provided <code>GeometryFactory</code>.
*/
public GeometryFixture( GeometryFactory geometryFactory ) {
gf = geometryFactory;
rectangle = createRectangle();
polygon = createPolygon();
polygonWithHole = createPolygonWithHole();
point = createPoint();
lineString = createLineString();
multiPoint = createMultiPoint();
multiLineString = createMultiLineString();
multiPolygon = createMultiPolygon();
multiPolygonWithHole = createMultiPolygonWithHole();
geometryCollection = createGeometryCollection();
}
/**
* Construct a rectangle according to Geometry Examples "2.3.1 Rectangle".
* <p>
* A simple rectangle as used with CAD applications</p>
* <code><pre>
* (1,7) (5,7)
* +-------------+
* | |
* | |
* +-------------+
* (1,1) (5,1)
* </pre><code>
* <p>The polygon is not consturcted with an SRID (ie srid == -1)</p>
* A Rectangle with expected encoding:</p>
* <ul>
* <li><b>SDO_GTYPE:</b><code>2003</code><br/>
* 2 dimensional polygon
* </li>
* <li><b>SDO_SRID:</b><code>NULL</code></li>
* <li><b>SDO_POINT:</b>NULL></li>
* <li><b>SDO_ELEM_INFO:</b><code>(1,1003,3)</code><br/>
* 03 indicates this is a rectangle
* </li>
* <li><b>SDO_ORDINATES:</b><code>(1,1,5,7)</code><br/>
* bottom left and upper right
* </li>
* </ul>
* <p>
* SQL:</p>
* <code><pre>
* MDSYS.SDO_GEOMETRY(
* 2003,
* NULL,
* NULL,
* MDSYS.SDO_ELEM_INFO_ARRAY(1,1003,3),
* MDSYS.SDO_ORDINATE_ARRAY(1,1,5,7)
* )
* </pre></code>
*
* @see GeometryFixture.rectangle
*/
protected Polygon createRectangle(){
Polygon rect = gf.createPolygon( ring( new double[]{1,1,5,1,5,7,1,7,1,1}), null );
return rect;
}
/**
* Construct a polygon of a triangle.
* <p>
* Used to illustrate polyugon encoding.</p>
* <code><pre>
* +11,8
* / \
* / \
* / \
* 9,5+-------+13,5
* </pre></code>
* <p>
* A Rectangle with expected encoding:</p>
* <ul>
* <li><b>SDO_GTYPE:</b><code>2003</code><br/>
* 2 dimensional polygon
* </li>
* <li><b>SDO_SRID:</b><code>NULL</code></li>
* <li><b>SDO_POINT:</b>NULL></li>
* <li><b>SDO_ELEM_INFO:</b><code>(1,1003,1)</code><br/>
* 1000 for external, 03 for polygon,
* 1 indicates this polygon uses strait edges
* </li>
* <li><b>SDO_ORDINATES:</b><code>(1,1,5,7)</code><br/>
* bottom left and upper right
* </li>
* </ul>
* <p>
* SQL:</p>
* <code><pre>
* MDSYS.SDO_GEOMETRY(
* 2003,
* NULL,
* NULL,
* MDSYS.SDO_ELEM_INFO_ARRAY(1,1003,1),
* MDSYS.SDO_ORDINATE_ARRAY(9,5, 13,5, 11,8, 9,5)
* )
* </pre></code>
*/
protected Polygon createPolygon(){
Polygon poly = gf.createPolygon( ring( new double[]{9,5, 13,5, 11,8, 9,5}), null );
poly.setSRID( -1 ); // don't have an SRID number
return poly;
}
/**
* Construct a polygon with hole according to Geometry Examples 2.3.2.
* <p>
* Polygon examples used to illustrate compound encoding.</p>
* <code><pre>
* 5,13+-------------+ 11,13
* / \
* 2,11+ \
* | 7,10+----+10,10 \
* | | | +13,9
* | | | |
* | | | |
* | 7,5+----+10,5 +13,5
* 2,4+ /
* \ /
* 4,3+---------------+10,3
* </pre></code>
* <p>
* A Polygon with expected encoding:</p>
* <ul>
* <li><b>SDO_GTYPE:</b><code>2003</code><br/>
* 2 dimensional polygon, 3 for polygon
* </li>
* <li><b>SDO_SRID:</b><code>NULL</code></li>
* <li><b>SDO_POINT:</b>NULL></li>
* <li><b>SDO_ELEM_INFO:</b><code>(1,1003,1,19,2003,1)</code><br/>
* Two triplets
* <ul>
* <li>(1,1003,1): exterior polygon ring starting at 1
* </li>
*
* <li>(19,2003,1): interior polygon ring starting at 19
* </li>
* </ul>
* </li>
* <li><b>SDO_ORDINATES:</b>
* <code><pre>
* (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)
* </code><pre/>
* </li>
* </ul>
* <p>
* SQL:</p>
* <code><pre>
* MDSYS.SDO_GEOMETRY(
* 2003,
* NULL,
* NULL,
* MDSYS.SDO_ELEM_INFO_ARRAY(1,1003,1, 19,2003,1),
* MDSYS.SDO_ORDINATE_ARRAY(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)
* )
* </pre></code>
*/
protected Polygon createPolygonWithHole(){
Polygon poly = gf.createPolygon(
ring( new double[]{2,4, 4,3, 10,3, 13,5, 13,9, 11,13, 5,13, 2,11, 2,4}),
new LinearRing[]{
ring( new double[]{7,5, 7,10, 10,10, 10,5, 7,5}),
}
);
poly.setSRID( -1 ); // don't have an SRID number
return poly;
}
/**
* Geometry Example "2.3.5 Point".
* <p>
* Simple Point used to test POINT_TYPE array use.</p>
* <code><pre>
* + 12,14
* </pre></code>
* <p>
* Expected Encoding:</p>
* <ul>
* <li><b>SDO_GTYPE:</b><code>2001</code><br/>
* 2 dimensional, 0 measures, 01 for point
* </li>
* <li><b>SDO_SRID:</b><code>NULL</code></li>
* <li><b>SDO_POINT:</b><code>(12,14,NULL)</code></li>
* <li><b>SDO_ELEM_INFO:</b><code>(1,1,1)</code></li>
* <li><b>SDO_ORDINATES:</b><code>(12,14)</code></li>
* </ul>
* <p>
* SQL:</p>
* <code><pre>
* MDSYS.SDO_GEOMETRY(
* 2001,
* NULL,
* MDSYS.SDO_POINT_TYPE(12, 14, NULL),
* NULL,
* NULL
* )
* </pre></code>
*/
protected Point createPoint(){
Point point = gf.createPoint(
coords( new double[]{ 12, 14} )
);
return point;
}
/**
* LineString geometry for testing fixture.
* <code><pre>
* +4,7
* |
* |
* |
* 1,2+ +4,2
* \ /
* 2,1+-+3,1
* </pre></code>
* <p>
* Expected Encoding:</p>
* <ul>
* <li><b>SDO_GTYPE:</b><code>2002</code><br/>
* 2 dimensional, 0 measures, 02 for Line
* </li>
* <li><b>SDO_SRID:</b><code>NULL</code></li>
* <li><b>SDO_POINT:</b><code>NULL</code></li>
* <li><b>SDO_ELEM_INFO:</b><code>(1,2,5)</code></li>
* <li><b>SDO_ORDINATES:</b><code>(1,2, 2,1, 3,1, 4,2 4,7)</code></li>
* </ul>
* <p>
* SQL:</p>
* <code><pre>
* MDSYS.SDO_GEOMETRY(
* 2002,
* NULL,
* NULL,
* (1,2,5),
* (1,2, 2,1, 3,1, 4,2 4,7)
* )
* </pre></code>
*/
protected LineString createLineString(){
LineString lineString = gf.createLineString(
coords( new double[]{ 1,2, 2,1, 3,1, 4,2, 4,7 })
);
return lineString;
}
/**
* MultiPoint geometry for testing fixture.
* <code><pre>
*
* 5,5+
*
* 3,3+
*
* 2,2+
* 1,1+
* </pre></code>
* <p>
* Expected Encoding:</p>
* <ul>
* <li><b>SDO_GTYPE:</b><code>2004</code><br/>
* 2 dimensional, 0 measures, 05 for MultiPoint
* </li>
* <li><b>SDO_SRID:</b><code>NULL</code></li>
* <li><b>SDO_POINT:</b><code>NULL</code></li>
* <li><b>SDO_ELEM_INFO:</b><code>(1,1,4)</code></li>
* <li><b>SDO_ORDINATES:</b><code>(1,1, 2,2, 3,3, 5,5)</code></li>
* </ul>
* <p>
* SQL:</p>
* <code><pre>
* MDSYS.SDO_GEOMETRY(
* 2005,
* NULL,
* NULL,
* (1,1,4),
* (1,1, 2,2, 3,3, 5,5)
* )
* </pre></code>
*/
protected MultiPoint createMultiPoint(){
MultiPoint multiPoint = gf.createMultiPoint(
coords( new double[]{1,1, 2,2, 3,3, 5,5})
);
return multiPoint;
}
/**
* MultiLineString geometry for testing fixture.
* <code><pre>
* 2,7+==+==+5,7
* |4,7
* |
* |
* 1,2+ +4,2
* \ /
* 2,1+-+3,1
* </pre></code>
* <p>
* Expected Encoding:</p>
* <ul>
* <li><b>SDO_GTYPE:</b><code>2005</code><br/>
* 2 dimensional, 0 measures, 05 for MultiLine
* </li>
* <li><b>SDO_SRID:</b><code>NULL</code></li>
* <li><b>SDO_POINT:</b><code>NULL</code></li>
* <li><b>SDO_ELEM_INFO:</b><code>(1,2,1,11,2,1)</code><br/>
* Two triplets
* <ul>
* <li>(1,2,1): linestring(2) of straight lines(1) starting at 1
* </li>
*
* <li>(11,2,1): linestring(2) of straight lines(1) starting at 1
* </li>
* </ul>
* </li>
* <li><b>SDO_ORDINATES:</b><code>(1,2, 2,1, 3,1, 4,2 4,7,
* 2,7, 4,7, 5,7)</code></li>
* </ul>
* <p>
* SQL:</p>
* <code><pre>
* MDSYS.SDO_GEOMETRY(
* 2005,
* NULL,
* NULL,
* (1,2,1,11,2,1),
* (1,2, 2,1, 3,1, 4,2 4,7, 2,7, 4,7, 5,7)
* )
* </pre></code>
*/
protected MultiLineString createMultiLineString(){
LineString line1 = gf.createLineString(
coords( new double[]{ 1,2, 2,1, 3,1, 4,2, 4,7 })
);
LineString line2 = gf.createLineString(
coords( new double[]{ 2,7, 4,7, 5,7 })
);
MultiLineString multiLineString =
gf.createMultiLineString( new LineString[]{line1,line2});
return multiLineString;
}
/**
* Construct a multipolyugon with a square and a triangle.
* <p>
* Used to illustrate multi polyugon encoding.</p>
* <code><pre>
*
* 2,9+------+7,9
* | | +11,8
* | | / \
* | | / \
* | |9,5-----+13,5
* | |
* 2,3+------+7,3
* </pre></code>
* <p>
* A MultiPolygon with expected encoding:</p>
* <ul>
* <li><b>SDO_GTYPE:</b><code>2006</code><br/>
* 2 dimensional polygon, 6 for multi polygon
* </li>
* <li><b>SDO_SRID:</b><code>NULL</code></li>
* <li><b>SDO_POINT:</b>NULL></li>
* <li><b>SDO_ELEM_INFO:</b><code>(1,1003,1,11,1003,1)</code><br/>
* Three triplets
* <ul>
* <li>(1,1003,1): exterior(1000) polygon(3) starting at 1 with
* straight edges(1)
* </li>
*
* <li>(11,1003,1): exterior(1000) polygon(3) starting at 11 with
* straight edges(1)
* </li>
* </ul>
* </li>
* <li><b>SDO_ORDINATES:</b>
* <code><pre>
* (2,3, 7,3, 7,9, 2,9, 2,3,
* 9,5, 13,5, 11,5, 9,5)
* </code><pre/>
* </li>
* </ul>
* <p>
* SQL:</p>
* <code><pre>
* MDSYS.SDO_GEOMETRY(
* 2006,
* 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)
* )
* </pre></code>
*/
protected MultiPolygon createMultiPolygon(){
Polygon poly1 = gf.createPolygon(
ring( new double[]{2,3, 7,3, 7,9, 2,9, 2,3}),
null
);
Polygon poly2 = gf.createPolygon(
ring( new double[]{9,5, 13,5, 11,8, 9,5}),
null
);
MultiPolygon multiPolygon = gf.createMultiPolygon(
new Polygon[]{ poly1, poly2 }
);
return multiPolygon;
}
/**
* Construct a multipolyugon with a square with a hole and a triangle.
* <p>
* Used to illustrate multi polyugon encoding.</p>
* <code><pre>
*
* 2,9+-------+7,9
* |3,8 6,8| +11,8
* | +---+ | / \
* | | / | / \
* | | / | / \
* | + |9,5+-------+13,5
* |3,4 |
* 2,3+-------+7,3
* </pre></code>
* <p>
* A MultiPolygon with expected encoding:</p>
* <ul>
* <li><b>SDO_GTYPE:</b><code>2007</code><br/>
* 2 dimensional, 6 for multipolygon
* </li>
* <li><b>SDO_SRID:</b><code>0</code></li>
* <li><b>SDO_POINT:</b>NULL></li>
* <li><b>SDO_ELEM_INFO:</b><code>(1,1003,1,11,2003,1,19,1003,1)</code><br/>
* Two triplets
* <ul>
* <li>(1,1003,1): exterior(1000) polygon(3) starting at 1 with
* straight edges(1)
* <ul>
* <li>(1,2003,1): interior(2000) polygon(3) starting at 11 with
* straight edges(1)
* </li>
* </ul>
* </li>
*
* <li>(11,1003,1): exterior(1000) polygon(3) starting at 19 with
* straight edges(1)
* </li>
* </ul>
* </li>
* <li><b>SDO_ORDINATES:</b>
* <code><pre>
* (2,3, 7,3, 7,9, 2,9, 2,3,
* 3,4, 3,8, 6,8, 3,4,
* 9,5, 13,5, 11,8, 9,5)
* </code><pre/>
* </li>
* </ul>
* <p>
* SQL:</p>
* <code><pre>
* MDSYS.SDO_GEOMETRY(
* 2006,
* NULL,
* NULL,
* MDSYS.SDO_ELEM_INFO_ARRAY(1,1003,1,11,2003,1,19,1003,1),
* MDSYS.SDO_ORDINATE_ARRAY(2,3, 7,3, 7,9, 2,9, 2,3,
* 3,4, 3,8, 6,8, 3,4,
* 9,5, 13,5, 11,8, 9,5)
* )
* </pre></code>
*/
protected MultiPolygon createMultiPolygonWithHole(){
Polygon poly1 = gf.createPolygon(
ring( new double[]{2,3, 7,3, 7,9, 2,9, 2,3}),
new LinearRing[]{ring( new double[]{3,4, 6,8, 3,8, 3,4}),}
);
Polygon poly2 = gf.createPolygon(
ring( new double[]{9,5, 11,8, 13,5, 9,5}),
null
);
MultiPolygon multiPolygon = gf.createMultiPolygon(
new Polygon[]{ poly1, poly2 }
);
return multiPolygon;
}
/**
* General Geometry Collection - with point, line, polygon, and a polygonWithHole.
* <code><pre>
*
* 5,5+-------+9,5
* | +6,4/
* | /| /
* |/ | /
* 2,3 +---+3,3 5,3+--+/6,3
* |2,2| | /
* 1,2+ +---+3,2 | /
* \ |/
* 1,1+ +2,1 5,1+
* </pre></code>
* A GeometryCollection with expected encoding:</p>
* <ul>
* <li><b>SDO_GTYPE:</b><code>2004</code><br/>
* 2000 dimensional polygon, 000 for no LRS, 4 for geometry collection
* </li>
* <li><b>SDO_SRID:</b><code>0</code></li>
* <li><b>SDO_POINT:</b>NULL></li>
* <li><b>SDO_ELEM_INFO:</b>
* <code>(1,1,1, 3,2,1, 7,1003,1, 15,1003,1, 23,2003,1)</code><br/>
* Two triplets
* <ul>
* <li>(1,1,1): starting at 1, a point(1) (single(1))
* </li>
* <li>(3,2,1): starting at 3, a line(2) with straight segments(1)
* </li>
* <li>(7,1003,1): starting at 5, an exterior(1000), polygon(3)
* </li>
*
* <li>(15,1003,1, 23,2003,1) polygon with:
* <ul>
* <li>starting at 15 and exterior(1003) and straight edges 1
* </li>
* <li>starting at 23 and interior(2003) and straight edges 1
* </li>
* </ul>
* </li>
* </ul>
* <li><b>SDO_ORDINATES:</b>
* <code><pre>
* (1,1,
* 1,2, 2,1,
* 2,2, 3,2, 3,3, 2,3, 2,2
* 5,1, 5,5, 9,5, 5,1,
* 5,3, 6,4, 6,3, 5,3)
* </code><pre/>
* </li>
* </ul>
* <p>
* SQL:</p>
* <code><pre>
* 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, 5,5, 9,5, 5,1,
* 5,3, 6,4, 6,3, 5,3
* )
* )
* </pre></code>
*/
protected GeometryCollection createGeometryCollection(){
return gf.createGeometryCollection(
new Geometry[]{
gf.createPoint( coords( new double[]{1,1}) ),
gf.createLineString( coords( new double[]{1,2, 2,1})),
gf.createPolygon( ring(new double[]{2,2, 3,2, 3,3, 2,3, 2,2}), null ),
gf.createPolygon(
ring(new double[]{5,1, 9,5, 5,5, 5,1 }),
new LinearRing[]{
ring(new double[]{5,3, 6,4, 6,3, 5,3,})
}
)
}
);
}
//
// Utility Methods
//
protected LinearRing ring( double coords[]){
CoordinateSequence seq = coords( coords );
return gf.createLinearRing( seq );
}
protected CoordinateSequence coords( double coords[]){
Coordinate array[] = new Coordinate[ coords.length / 2 ];
for( int i=0; i<array.length;i++){
array[i]=new Coordinate( coords[i*2], coords[i*2+1] );
}
return gf.getCoordinateSequenceFactory().create( array );
}
}