/*
* 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);
}
}