isValid, isSimple, Dimension and CoordDim methods for SDO_Geometry

I have just added to my Java Spatial For Oracle (JS4O) project exposure of the JTS/Jaspa functions for:

  • ST_IsValid
  • ST_IsSimple
  • ST_Dimension
  • ST_CoordDim

Here are the type signatures in the JTS PL/SQL package.

   FUNCTION ST_IsValid(p_geom IN mdsys.sdo_geometry )
     RETURN NUMBER Deterministic;
 .
   FUNCTION ST_IsSimple(p_geom IN mdsys.sdo_geometry )
     RETURN NUMBER Deterministic;
 .
   FUNCTION ST_Dimension(p_geom IN mdsys.sdo_geometry)
     RETURN NUMBER Deterministic;
 .
   FUNCTION ST_CoordDim(p_geom IN mdsys.sdo_geometry)
     RETURN NUMBER Deterministic;

Here is a test of these functions.

 SELECT DISTINCT
        SC4O.ST_IsValid(a.geometry) AS ST_isValid,
        SC4O.ST_IsSimple(a.geometry) AS ST_isSimple,
        SC4O.ST_Dimension(a.geometry) AS ST_Dimension,
        SC4O.ST_CoordDim(a.geometry) AS ST_CoordDim,
        CASE WHEN a.geometry.get_gtype() IN (1) THEN 'Point'
             WHEN a.geometry.get_gtype() IN (5) THEN 'MultiPoint'
             WHEN a.geometry.get_gtype() IN (2) THEN 'Line'
             WHEN a.geometry.get_gtype() IN (6) THEN 'MultiLine'
             WHEN a.geometry.get_gtype() IN (3) AND geom.isRectangle(a.geometry.sdo_elem_info)>0 THEN 'Area(Rectangle)'
             WHEN a.geometry.get_gtype() IN (3) AND geom.isRectangle(a.geometry.sdo_elem_info)=0 THEN 'Area'
             WHEN a.geometry.get_gtype() IN (7) AND geom.isRectangle(a.geometry.sdo_elem_info)>0 THEN 'MultiArea(Rectangle)'
             WHEN a.geometry.get_gtype() IN (7) AND geom.isRectangle(a.geometry.sdo_elem_info)=0 THEN 'MultiArea'
             ELSE 'Not Supported'
         END geometryType
   FROM ORACLE_TEST_GEOMETRIES a
  WHERE a.geometry IS NOT NULL
    AND a.geometry.sdo_gtype IS NOT NULL
    AND a.geometry.get_dims() = 2
    AND sdo_geom.validate_geometry(a.geometry, 0.0005) = 'TRUE'
    AND ( a.geometry.get_gtype() IN (1,5) OR ( a.geometry.sdo_elem_info IS NOT NULL AND geom.isCompound(a.geometry.sdo_elem_info) = 0 ) )
    AND a.geometry.get_gtype() <> 4
   ORDER BY 5,1,3;
 -- Results
 ST_ISVALID ST_ISSIMPLE ST_DIMENSION ST_COORDDIM GEOMETRYTYPE
 ---------- ----------- ------------ ----------- --------------------
 1          1           2            2           Area
 1          1           2            2           Area(Rectangle)
 1          0           1            2           Line
 1          1           1            2           Line
 1          1           2            2           MultiArea
 1          1           2            2           MultiArea(Rectangle)
 1          0           1            2           MultiLine
 1          1           1            2           MultiLine
 1          1           0            2           MultiPoint
 1          1           0            2           Point
 .
  10 ROWS selected

I hope this is helpful to someone.