From: Chris M. (JIRA) <ji...@co...> - 2010-05-21 16:12:18
|
Oracle Spatial measured polyline bug ------------------------------------ Key: GEOT-3101 URL: http://jira.codehaus.org/browse/GEOT-3101 Project: GeoTools Issue Type: Bug Components: data oraclespatial Affects Versions: 2.6.3 Environment: Windows 2008 64-bit, Java 1.6.0_2-b02 32-bit, Tomcat 6.0.2 32-bit, Geoserver 2.0.1, Oracle 11.1.0.7 64-bit Reporter: Chris Morgan Assignee: Andrea Aime I am attempting to use Geoserver to create KML from an oracle data source of polylines with measures. I am receiving the following error message when attempting to render the layer, either as KML or as OpenLayers: IllegalArgumentException Dimension D:3 and L:3 denote Coordiantes of 6 ordinates. This cannot be resolved withan ordinate array of length 15. The Oracle Spatial layer is defined with SDO_GTYPE 3302. This is a valid layer which displays correctly when rendered with ArcSDE or a direct connection from ArcMap. There is a bug in method org.geotools.data.oracle.sdo.SDO.coordinates(CoordinateSequenceFactory f, final int GTYPE, double[] ordinates)) which incorrectly adds the measure dimenion to the total number of coordinate dimensions, when actually it should just be checking whether the measure dimension is valid. Sample SQL for inserting a line {{ insert into SEISMIC_2D_SDO (GEOMETRY_ID, LINE_NAME, GEOMETRY) values (1, 'P/PLE-1', mdsys.sdo_geometry( 3302, 8307, null, mdsys.sdo_elem_info_array(1,2,1), mdsys.sdo_ordinate_array( -- LON,LAT,SP 2.97819, 54.04142, 895, 2.98058, 54.03858, 900, 2.98497, 54.03645, 905, 2.98775, 54.03433, 910 ) ) ); }} Here is a working fix for this method (please excuse my code). Using this fixed and rebuilt jar gt-jdbc-oracle-x.x.x.jar, Geoserver renders the polylines correctly. {{ public static CoordinateSequence coordinates(CoordinateSequenceFactory f, final int GTYPE, double[] ordinates) { if ((ordinates == null) || (ordinates.length == 0)) { return f.create(new Coordinate[0]); } final int D = SDO.D(GTYPE); final int L = SDO.L(GTYPE); final int TT = SDO.TT(GTYPE); // POINT_TYPE Special Case // if ((D == 2) && (L == 0) && (TT == 1)) { CoordinateSequence cs = f.create(1, 2); for (int i = 0; i < 2; i++) cs.setOrdinate(0, i, ordinates[i]); return cs; } // CM 4/05/2010 bug fix for measured polylines - SDO_GTYPE 3302 // valid values for L are 0,3,4 - could check for this somewhere //final int LEN = D + L; // this is wrong if (L > D) { throw new IllegalArgumentException("Dimension L:"+L+" is greater than D:"+D); } final int LEN = D; if ((ordinates.length % LEN) != 0) { throw new IllegalArgumentException("Dimension D:" + D + " and L:" + L + " denote Coordiantes " + "of " + LEN + " ordinates. This cannot be resolved with" + "an ordinate array of length " + ordinates.length); } // special optimization for faster 2D rendering if (D == 2 && L == 0 && f instanceof LiteCoordinateSequenceFactory) { return ((LiteCoordinateSequenceFactory) f).create(ordinates); } // CM 4/05/2010 LENGTH never used - code removed //final int LENGTH = ordinates.length / LEN; OrdinateList x = new OrdinateList(ordinates, 0, LEN); OrdinateList y = new OrdinateList(ordinates, 1, LEN); OrdinateList z = null; if (D == 3 && L != 3) { // CM 4/05/2010 check L z = new OrdinateList(ordinates, 2, LEN); } if (L != 0) { /* // CM 4/05/2010 code removed OrdinateList[] m = new OrdinateList[L]; for (int i = 0; i < L; i++) { m[i] = new OrdinateList(ordinates, D + i, LEN); } */ // CM 4/05/2010 // Oracle SDO shapes can only have a single measure dimension, // so not sure what the point of the array and for-loop are doing here. // We just need to populate a single measure dimension OrdinateList[] m = new OrdinateList[1]; m[0] = new OrdinateList(ordinates, L-1, LEN); return coordiantes(f, x, y, z, m); } else { return coordiantes(f, x, y, z); } } }} -- This message is automatically generated by JIRA. - If you think it was sent incorrectly contact one of the administrators: http://jira.codehaus.org/secure/Administrators.jspa - For more information on JIRA, see: http://www.atlassian.com/software/jira |