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;
}
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;
}
}
}
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;
}
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;
}
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();
}
}
Aggregations