private static ByteBuffer toByteBuffer(Object obj) { byte[] raw = null; if ( obj == null ) { return null; } if ( ( obj instanceof byte[] ) ) { raw = (byte[]) obj; } else if ( obj instanceof Blob ) { raw = toByteArray( (Blob) obj ); } else { throw new IllegalArgumentException( "Expected byte array or BLOB" ); } ByteBuffer buffer = ByteBuffer.from( raw ); buffer.setByteOrder( ByteOrder.valueOf( raw[0] ) ); return buffer; }
private static ByteBuffer addCrsId(byte[] wkb, byte orderByte, int typeCode, int crsId) { ByteBuffer buffer = ByteBuffer.allocate( wkb.length + 4 ); // original capacity + 4 bytes for the CRS ID buffer.setByteOrder( ByteOrder.valueOf( orderByte ) ); buffer.put( orderByte ); // write byte order buffer.putUInt( typeCode | POSTGIS_SRID_FLAG ); // set SRID flag buffer.putInt( crsId ); // write CRS ID // write remaining data for ( int i = 5; i < wkb.length; i++ ) { buffer.put( wkb[i] ); } buffer.rewind(); return buffer; }
/** * Read the first four bytes: this contains the SRID * * @param byteBuffer */ @Override protected void prepare(ByteBuffer byteBuffer) { byteBuffer.setByteOrder(ByteOrder.NDR); srid = byteBuffer.getInt(); }
private void alignByteOrder(ByteBuffer byteBuffer) { byte orderByte = byteBuffer.get(); ByteOrder byteOrder = ByteOrder.valueOf(orderByte); byteBuffer.setByteOrder(byteOrder); } }
/** * Encodes a <code>Geometry</code> into a WKB representation using the specified byte-order. * * @param geometry The <code>Geometry</code> to be encoded as WKB. * @param byteOrder The WKB byte order, either {@link org.geolatte.geom.ByteOrder#XDR XDR} or {@link org.geolatte.geom.ByteOrder#NDR NDR} * @return A buffer of bytes that contains the WKB-encoded <code>Geometry</code>. */ @Override public <P extends Position> ByteBuffer encode(Geometry<P> geometry, ByteOrder byteOrder) { ByteBuffer output = ByteBuffer.allocate(calculateSize(geometry, true)); if (byteOrder != null) { output.setByteOrder(byteOrder); } writeGeometry(geometry, output); output.rewind(); return output; }
@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; }