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