@Override protected <P extends Position> int calculateSize(Geometry<P> geom, boolean includeSrid) { int size = super.calculateSize(geom, includeSrid); // HANA always expects the SRID, the Postgis encoder doesn't write it unless it's > 0 return (includeSrid && geom.getSRID() <= 0) ? size + 4 : size; }
@Override public String getLiteral(Geometry geometry) { String str = Wkt.newEncoder(Wkt.Dialect.POSTGIS_EWKT_1).encode(geometry); if (geometry.getSRID() > -1) { return "geometry::STGeomFromText('" + str + "', " + geometry.getSRID() + ")"; } else { return "geometry::STGeomFromText('" + str + "', " + DEFAULT_SRID + ")"; } }
@Override public String getLiteral(Geometry geometry) { String str = Wkt.newEncoder(Wkt.Dialect.POSTGIS_EWKT_1).encode(geometry); if (geometry.getSRID() > -1) { return "geometry::STGeomFromText('" + str + "', " + geometry.getSRID() + ")"; } else { return "geometry::STGeomFromText('" + str + "', " + DEFAULT_SRID + ")"; } }
public static <P extends Position> org.locationtech.jts.geom.Geometry to(org.geolatte.geom.Geometry<P> geometry) { if (geometry == null) { throw new IllegalArgumentException("Null object passed."); } GeometryFactory gFact = geometryFactory(geometry.getSRID()); return to(geometry, gFact); }
@Override public void setValue(PreparedStatement st, int startIndex, Geometry value) throws SQLException { WkbEncoder encoder = Wkb.newEncoder(Wkb.Dialect.POSTGIS_EWKB_1); ByteBuffer buffer = encoder.encode(value, byteOrder); int srid = value.getSRID(); // prepend srid into first 4 bytes byte[] wkb = buffer.toByteArray(); byte[] bytes = new byte[wkb.length + 4]; bytes[3] = (byte) ((srid >> 24) & 0xFF); bytes[2] = (byte) ((srid >> 16) & 0xFF); bytes[1] = (byte) ((srid >> 8) & 0xFF); bytes[0] = (byte) (srid & 0xFF); System.arraycopy(wkb, 0, bytes, 4, wkb.length); st.setBytes(startIndex, bytes); }
@Override public void setValue(PreparedStatement st, int startIndex, Geometry value) throws SQLException { WkbEncoder encoder = Wkb.newEncoder(Wkb.Dialect.POSTGIS_EWKB_1); ByteBuffer buffer = encoder.encode(value, byteOrder); int srid = value.getSRID(); // prepend srid into first 4 bytes byte[] wkb = buffer.toByteArray(); byte[] bytes = new byte[wkb.length + 4]; bytes[3] = (byte) ((srid >> 24) & 0xFF); bytes[2] = (byte) ((srid >> 16) & 0xFF); bytes[1] = (byte) ((srid >> 8) & 0xFF); bytes[0] = (byte) (srid & 0xFF); System.arraycopy(wkb, 0, bytes, 4, wkb.length); st.setBytes(startIndex, bytes); }
@Override public <P extends Position> ByteBuffer encode(Geometry<P> geometry, ByteOrder byteOrder) { if (geometry == null || hasEmpty(geometry)) return null; //size is size for WKB + 4 bytes for the SRID ByteBuffer output = ByteBuffer.allocate(calculateSize(geometry, false) + 4); if (byteOrder != null) { output.setByteOrder(byteOrder); } output.putInt(geometry.getSRID() == -1 ? 0 : geometry.getSRID()); writeGeometry(geometry, output); output.rewind(); return output; }
@Override public <P extends Position, G extends Geometry<P>> SDOGeometry encode(G geom) { final int dim = geom.getCoordinateDimension(); final int lrsPos = getLRSDim(geom); SDOGType sdogType = new SDOGType(dim, lrsPos, TypeGeometry.POLYGON); SDOGeometry base = new SDOGeometry(sdogType, geom.getSRID(), null, null, null); Polygon<?> polygon = (Polygon<?>)geom; return addPolygon(base, polygon); }
@Override @SuppressWarnings("unchecked") public <P extends Position, G extends Geometry<P>> SDOGeometry encode(G geom) { MultiPolygon<P> multiPolygon = (MultiPolygon<P>)geom; final int dim = multiPolygon.getCoordinateDimension(); final int lrsPos = getLRSDim(multiPolygon); SDOGType gType = new SDOGType(dim, lrsPos, TypeGeometry.MULTIPOLYGON); SDOGeometry sdoGeom = new SDOGeometry(gType, geom.getSRID(), null, null, null); for (int i = 0; i < multiPolygon.getNumGeometries(); i++) { try { final Polygon<P> pg = multiPolygon.getGeometryN(i); sdoGeom = addPolygon(sdoGeom, pg); } catch (Exception e) { throw new RuntimeException("Found geometry that was not a geometry in MultiPolygon"); } } return sdoGeom; } }
@Override protected void writeTypeCodeAndSrid(Geometry<P> geometry, ByteBuffer output) { int typeCode = getGeometryType(geometry); CoordinateReferenceSystem<P> crs = geometry.getCoordinateReferenceSystem(); if (!this.hasWrittenSrid) { typeCode |= PostgisWkbTypeMasks.SRID_FLAG; } if (hasMeasureAxis(crs)) { typeCode |= PostgisWkbTypeMasks.M_FLAG; } if (hasVerticalAxis(crs)) { typeCode |= PostgisWkbTypeMasks.Z_FLAG; } output.putUInt(typeCode); if (!this.hasWrittenSrid) { int srid = geometry.getSRID(); // Write the SRID, the HANA default SRID is 0 output.putInt(srid < 0 ? 0 : srid); this.hasWrittenSrid = true; } }
protected <P extends Position> int calculateSize(Geometry<P> geom, boolean includeSrid) { int size = 1 + ByteBuffer.UINT_SIZE; //size for order byte + type field if (geom.getSRID() > 0 && includeSrid) { size += 4; } //empty geoms have same representation as an empty GeometryCollection if (geom.isEmpty()) return size + sizeEmptyGeometry(geom); if (geom instanceof GeometryCollection) { size += sizeOfGeometryCollection((GeometryCollection<P, ?>) geom); } else if (geom instanceof Polygon) { size += getPolygonSize((Polygon<P>) geom); } else if (geom instanceof Point) { size += getPointByteSize(geom); } else { size += ByteBuffer.UINT_SIZE; //to hold number of points size += getPointByteSize(geom) * geom.getNumPositions(); } return size; }
@SuppressWarnings("unchecked") public <P extends Position, G extends Geometry<P>> SqlServerGeometry encode(G geom) { SqlServerGeometry nativeGeom = new SqlServerGeometry(); if( geom.getSRID() > 0 ) { nativeGeom.setCoordinateReferenceSystem(geom.getCoordinateReferenceSystem()); } nativeGeom.setIsValid(); if ( CoordinateReferenceSystems.hasMeasureAxis(geom.getCoordinateReferenceSystem()) ) { nativeGeom.setHasMValues(); } if ( CoordinateReferenceSystems.hasVerticalAxis(geom.getCoordinateReferenceSystem()) ) { nativeGeom.setHasZValues(); } CountingPositionSequenceBuilder<?> coordinates = new CountingPositionSequenceBuilder(geom.getCoordinateReferenceSystem()); List<Figure> figures = new ArrayList<Figure>(); List<Shape> shapes = new ArrayList<Shape>(); encode( geom, -1, coordinates, figures, shapes ); encodePoints( nativeGeom, coordinates.toPositionSequence() ); encodeFigures( nativeGeom, figures ); encodeShapes( nativeGeom, shapes ); return nativeGeom; }
@Override public <P extends Position, G extends Geometry<P>> SDOGeometry encode(G geom) { final int dim = geom.getCoordinateDimension(); final int lrsPos = getLRSDim(geom); final boolean isLrs = lrsPos > 0; final Double[] ordinates = convertPositionSequence(geom.getPositions()); final ElemInfo info = new ElemInfo(1); info.setElement(0, 1, ElementType.LINE_STRAITH_SEGMENTS, 0); return new SDOGeometry( new SDOGType(dim, lrsPos, TypeGeometry.LINE), geom.getSRID(), null, info, new Ordinates(ordinates)); }
@Override @SuppressWarnings("unchecked") public <P extends Position, G extends Geometry<P>> SDOGeometry encode(G geom) { final int dim = geom.getCoordinateDimension(); final int lrsDim = getLRSDim(geom); final boolean isLrs = (lrsDim != 0); MultiPoint<P> multiPoint = (MultiPoint<P>) geom; final ElemInfo info = new ElemInfo(multiPoint.getNumGeometries()); int oordinatesOffset = 1; Double[] ordinates = new Double[]{}; for (int i = 0; i < multiPoint.getNumGeometries(); i++) { info.setElement(i, oordinatesOffset, ElementType.POINT, 0); ordinates = addOrdinates(ordinates, pointToOrdinates(multiPoint, i)); oordinatesOffset = ordinates.length + 1; } return new SDOGeometry(new SDOGType(dim, lrsDim, TypeGeometry.MULTIPOINT), geom.getSRID(), null, info, new Ordinates(ordinates)); }
@Override @SuppressWarnings("unchecked") public <P extends Position, G extends Geometry<P>> SDOGeometry encode(G geom) { MultiLineString<P> multiLineString = (MultiLineString<P>)geom; final int dim = multiLineString.getCoordinateDimension(); final int lrsDim = getLRSDim(multiLineString); final boolean isLrs = (lrsDim != 0); SDOGType sdoGtype = new SDOGType(dim, lrsDim, TypeGeometry.MULTILINE); final ElemInfo info = new ElemInfo(multiLineString.getNumGeometries()); int oordinatesOffset = 1; Double[] ordinates = new Double[]{}; for (int i = 0; i < multiLineString.getNumGeometries(); i++) { info.setElement(i, oordinatesOffset, ElementType.LINE_STRAITH_SEGMENTS, 0); ordinates = addOrdinates(ordinates, convertPositionSequence(multiLineString.getGeometryN(i).getPositions())); oordinatesOffset = ordinates.length + 1; } return new SDOGeometry(sdoGtype, geom.getSRID(), null, info, new Ordinates(ordinates)); }