Search in sources :

Example 46 with JGeometry

use of oracle.spatial.geometry.JGeometry in project ili2db by claeis.

the class OracleColumnConverter method fromIomCoord.

@Override
public java.lang.Object fromIomCoord(IomObject value, int srid, boolean is3D) throws java.sql.SQLException, ConverterException {
    if (value != null) {
        String c1 = value.getattrvalue("C1");
        String c2 = value.getattrvalue("C2");
        String c3 = value.getattrvalue("C3");
        double[] ordArray = { 0, 0, 0 };
        ordArray[0] = Double.parseDouble(c1);
        ordArray[1] = Double.parseDouble(c2);
        JGeometry geom = null;
        if (is3D) {
            if (c3 == null) {
                throw new ConverterException("unexpected dimension");
            } else {
                ordArray[2] = Double.parseDouble(c3);
                geom = JGeometry.createPoint(ordArray, 3, 0);
            }
        } else {
            geom = JGeometry.createPoint(ordArray, 2, 0);
        }
        return JGeometry.store(geom, conn);
    }
    return null;
}
Also used : ConverterException(ch.ehi.ili2db.converter.ConverterException) JGeometry(oracle.spatial.geometry.JGeometry)

Example 47 with JGeometry

use of oracle.spatial.geometry.JGeometry in project ili2db by claeis.

the class OracleColumnConverter method toIomSurface.

@Override
public IomObject toIomSurface(Object geomobj, String sqlAttrName, boolean is3D) throws java.sql.SQLException, ConverterException {
    JGeometry geometry = JGeometry.load((oracle.sql.STRUCT) geomobj);
    if (geometry.getType() != JGeometry.GTYPE_POLYGON) {
        throw new ConverterException("unexpected GTYPE (" + OracleUtility.gtype2str(geometry.getType()) + ") in attribute " + sqlAttrName);
    } else {
        int dim = geometry.getDimensions();
        boolean isCurrentValue3D = (dim == 3);
        if (is3D != isCurrentValue3D) {
            throw new ConverterException("unexpected dimension (" + Integer.toString(dim) + ") in attribute " + sqlAttrName);
        } else {
            int[] elev = geometry.getElemInfo();
            double[] ordv = geometry.getOrdinatesArray();
            final int SDO_STARTING_OFFSET = 0;
            final int SDO_ETYPE = 1;
            final int SDO_INTERPRETATION = 2;
            final int NEXT_TRIPLET = 3;
            // (must be specified in counterclockwise order)
            final int EXTERIOR_POLYGON_RING = 1005;
            // (must be specified in clockwise order)
            final int INTERIOR_POLYGON_RING = 2005;
            final int LINESTRING = 2;
            final int STRAIGHT = 1;
            final int ARC = 2;
            int elei = 0;
            IomObject multisurface = new Iom_jObject("MULTISURFACE", null);
            IomObject surface = multisurface.addattrobj("surface", "SURFACE");
            while (elei < elev.length) {
                if (elev[elei + SDO_ETYPE] != EXTERIOR_POLYGON_RING && elev[elei + SDO_ETYPE] != INTERIOR_POLYGON_RING) {
                    throw new ConverterException("unexpected SDO_ETYPE (" + Integer.toString(elev[elei + SDO_ETYPE]) + ") in attribute " + sqlAttrName);
                } else {
                    int nTriplet = elev[elei + SDO_INTERPRETATION];
                    elei += NEXT_TRIPLET;
                    IomObject boundary = surface.addattrobj("boundary", "BOUNDARY");
                    IomObject polylineValue = boundary.addattrobj("polyline", "POLYLINE");
                    IomObject sequence = polylineValue.addattrobj("sequence", "SEGMENTS");
                    for (int iTriplet = 0; iTriplet < nTriplet; iTriplet++) {
                        if (elev[elei + SDO_ETYPE] != LINESTRING) {
                            throw new ConverterException("unexpected SDO_ETYPE (" + Integer.toString(elev[elei + SDO_ETYPE]) + ") in attribute " + sqlAttrName);
                        } else {
                            if (elev[elei + SDO_INTERPRETATION] == STRAIGHT) {
                                int start = elev[elei + SDO_STARTING_OFFSET] - 1;
                                int end;
                                if (elei + NEXT_TRIPLET >= elev.length) {
                                    end = ordv.length;
                                } else {
                                    end = elev[elei + NEXT_TRIPLET + SDO_STARTING_OFFSET] - 1;
                                }
                                for (int i = start; i < end; ) {
                                    // add control point
                                    IomObject coordValue = sequence.addattrobj("segment", "COORD");
                                    coordValue.setattrvalue("C1", Double.toString(ordv[i]));
                                    coordValue.setattrvalue("C2", Double.toString(ordv[i + 1]));
                                    if (isCurrentValue3D) {
                                        coordValue.setattrvalue("C3", Double.toString(ordv[i + 2]));
                                        i += 3;
                                    } else {
                                        i += 2;
                                    }
                                }
                            } else if (elev[elei + SDO_INTERPRETATION] == ARC) {
                                int start = elev[elei + SDO_STARTING_OFFSET] - 1;
                                int end;
                                if (elei + NEXT_TRIPLET >= elev.length) {
                                    end = ordv.length;
                                } else {
                                    end = elev[elei + NEXT_TRIPLET + SDO_STARTING_OFFSET] - 1;
                                }
                                for (int i = start; i < end; ) {
                                    // add control point
                                    IomObject coordValue = sequence.addattrobj("segment", "ARC");
                                    coordValue.setattrvalue("A1", Double.toString(ordv[i]));
                                    coordValue.setattrvalue("A2", Double.toString(ordv[i + 1]));
                                    if (isCurrentValue3D) {
                                        // no A3 in XTF!
                                        i += 3;
                                    } else {
                                        i += 2;
                                    }
                                    coordValue.setattrvalue("C1", Double.toString(ordv[i]));
                                    coordValue.setattrvalue("C2", Double.toString(ordv[i + 1]));
                                    if (isCurrentValue3D) {
                                        coordValue.setattrvalue("C3", Double.toString(ordv[i + 2]));
                                        i += 3;
                                    } else {
                                        i += 2;
                                    }
                                }
                            } else {
                                throw new ConverterException("unexpected SDO_INTERPRETATION (" + Integer.toString(elev[elei + SDO_INTERPRETATION]) + ") in attribute " + sqlAttrName);
                            }
                        }
                        elei += NEXT_TRIPLET;
                    }
                }
            }
            return multisurface;
        }
    }
}
Also used : ConverterException(ch.ehi.ili2db.converter.ConverterException) IomObject(ch.interlis.iom.IomObject) JGeometry(oracle.spatial.geometry.JGeometry) Iom_jObject(ch.interlis.iom_j.Iom_jObject)

Example 48 with JGeometry

use of oracle.spatial.geometry.JGeometry in project ili2db by claeis.

the class OracleColumnConverter method fromIomSurface.

@Override
public java.lang.Object fromIomSurface(IomObject obj, int srid, boolean hasLineAttr, boolean is3D, double p) throws java.sql.SQLException, ConverterException {
    is3D = false;
    if (obj != null) {
        ArrayList elemInfo = new ArrayList();
        ArrayList ordinates = new ArrayList();
        // (must be specified in counterclockwise order)
        final int EXTERIOR_POLYGON_RING = 1005;
        // (must be specified in clockwise order)
        final int INTERIOR_POLYGON_RING = 2005;
        boolean clipped = obj.getobjectconsistency() == IomConstants.IOM_INCOMPLETE;
        for (int surfacei = 0; surfacei < obj.getattrvaluecount("surface"); surfacei++) {
            if (clipped) {
            // out.startElement("CLIPPED",0,0);
            } else {
                // an unclipped surface should have only one surface element
                if (surfacei > 0) {
                    EhiLogger.logError("unclipped surface with multi 'surface' elements");
                    break;
                }
            }
            IomObject surface = obj.getattrobj("surface", surfacei);
            for (int boundaryi = 0; boundaryi < surface.getattrvaluecount("boundary"); boundaryi++) {
                int eleInfoStartPos = elemInfo.size();
                if (boundaryi == 0) {
                    addElemInfo(elemInfo, ordinates.size(), EXTERIOR_POLYGON_RING, 0);
                } else {
                    addElemInfo(elemInfo, ordinates.size(), INTERIOR_POLYGON_RING, 0);
                }
                IomObject boundary = surface.getattrobj("boundary", boundaryi);
                for (int polylinei = 0; polylinei < boundary.getattrvaluecount("polyline"); polylinei++) {
                    IomObject polyline = boundary.getattrobj("polyline", polylinei);
                    addPolyline(elemInfo, ordinates, polyline, true, is3D);
                }
                // patch counter in head triplet
                int elemInfoCount = (elemInfo.size() - eleInfoStartPos) / 3 - 1;
                elemInfo.set(eleInfoStartPos + 2, new Integer(elemInfoCount));
            }
            if (clipped) {
            // out.endElement(/*CLIPPED*/);
            }
        }
        int[] elemInfov = new int[elemInfo.size()];
        for (int i = 0; i < elemInfov.length; i++) {
            elemInfov[i] = ((Integer) elemInfo.get(i)).intValue();
        }
        double[] ordinatesv = new double[ordinates.size()];
        for (int i = 0; i < ordinatesv.length; i++) {
            ordinatesv[i] = ((Double) ordinates.get(i)).doubleValue();
        }
        JGeometry geom = new JGeometry(JGeometry.GTYPE_POLYGON, 0, elemInfov, ordinatesv);
        return JGeometry.store(geom, conn);
    }
    return null;
}
Also used : IomObject(ch.interlis.iom.IomObject) JGeometry(oracle.spatial.geometry.JGeometry) ArrayList(java.util.ArrayList)

Example 49 with JGeometry

use of oracle.spatial.geometry.JGeometry in project ili2db by claeis.

the class OracleColumnConverter method fromIomPolyline.

@Override
public java.lang.Object fromIomPolyline(IomObject obj, int srid, boolean is3D, double p) throws java.sql.SQLException, ConverterException {
    is3D = false;
    if (obj != null) {
        ArrayList elemInfo = new ArrayList();
        ArrayList ordinates = new ArrayList();
        final int COMPOUND_LINESTRING = 4;
        int eleInfoStartPos = elemInfo.size();
        addElemInfo(elemInfo, ordinates.size(), COMPOUND_LINESTRING, 0);
        addPolyline(elemInfo, ordinates, obj, false, is3D);
        // patch counter in head triplet
        int elemInfoCount = (elemInfo.size() - eleInfoStartPos) / 3 - 1;
        elemInfo.set(eleInfoStartPos + 2, new Integer(elemInfoCount));
        int[] elemInfov = new int[elemInfo.size()];
        for (int i = 0; i < elemInfov.length; i++) {
            elemInfov[i] = ((Integer) elemInfo.get(i)).intValue();
        }
        double[] ordinatesv = new double[ordinates.size()];
        for (int i = 0; i < ordinatesv.length; i++) {
            ordinatesv[i] = ((Double) ordinates.get(i)).doubleValue();
        }
        JGeometry geom = new JGeometry(JGeometry.GTYPE_MULTICURVE, 0, elemInfov, ordinatesv);
        return JGeometry.store(geom, conn);
    }
    return null;
}
Also used : JGeometry(oracle.spatial.geometry.JGeometry) ArrayList(java.util.ArrayList)

Example 50 with JGeometry

use of oracle.spatial.geometry.JGeometry in project tests by datanucleus.

the class JGeometrySpatialTest method testInteriorRingNMethod.

public void testInteriorRingNMethod() throws SQLException {
    PersistenceManager pm = pmf.getPersistenceManager();
    Transaction tx = pm.currentTransaction();
    try {
        tx.begin();
        Short n = new Short((short) 1);
        Query query = pm.newQuery(SampleGeometry.class, "id == 3001 && Spatial.interiorRingN(geom, 1) != null");
        List list = (List) query.execute(n);
        assertEquals("Wrong number of geometries which have interior ring(s) returned", 1, list.size());
        assertTrue("Polygon 1 should be in the list of geometries which have interior ring(s)", list.contains(getSamplePolygon(1)));
        query = pm.newQuery(SampleGeometry.class, "id == :id");
        query.setResult("Spatial.interiorRingN(geom, 1)");
        query.setUnique(true);
        JGeometry interiorRing_read = (JGeometry) query.execute(new Long(getSamplePolygon(1).getId()));
        assertTrue("First interior ring of Polygon 1 should be a polygon", interiorRing_read.getType() == JGeometry.GTYPE_POLYGON);
    } finally {
        tx.commit();
    }
}
Also used : SampleGeometry(org.datanucleus.samples.jgeometry.SampleGeometry) Transaction(javax.jdo.Transaction) Query(javax.jdo.Query) PersistenceManager(javax.jdo.PersistenceManager) JGeometry(oracle.spatial.geometry.JGeometry) List(java.util.List)

Aggregations

JGeometry (oracle.spatial.geometry.JGeometry)65 PersistenceManager (javax.jdo.PersistenceManager)46 Transaction (javax.jdo.Transaction)46 List (java.util.List)37 Query (javax.jdo.Query)37 SampleGeometry (org.datanucleus.samples.jgeometry.SampleGeometry)25 Point (org.geolatte.geom.Point)8 ConverterException (ch.ehi.ili2db.converter.ConverterException)4 IomObject (ch.interlis.iom.IomObject)4 Iom_jObject (ch.interlis.iom_j.Iom_jObject)3 Test (org.junit.Test)3 ArrayList (java.util.ArrayList)2 CrsId (org.geolatte.geom.crs.CrsId)2 SQLException (java.sql.SQLException)1 STRUCT (oracle.sql.STRUCT)1 SampleGeometry3D (org.datanucleus.samples.jgeometry.SampleGeometry3D)1 SampleGeometryM (org.datanucleus.samples.jgeometry.SampleGeometryM)1