readHeader method
OptimizedGeoPackageBinary {
byte3
magic = 0x47504230; // 'GPB'
byte flags; // see flags layout below
unit32 srid;
double[] envelope; // see flags envelope contents indicator code below
WKBGeometry geometry; // per OGC 06-103r4 clause 8
flags layout: bit 7 6 5 4 3 2 1 0 use - - X Y E E E B
use: X: GeoPackageBinary type (0: StandardGeoPackageBinary, 1: ExtendedGeoPackageBinary) Y: 0: non-empty geometry, 1: empty geometry
E: envelope contents indicator code (3-bit unsigned integer)
value | description | envelope length (bytes)
0 | no envelope (space saving slower indexing option) | 0
1 | envelope is minx, maxx, miny, maxy
| 32
2 | envelope is minx, maxx, miny, maxy, minz, maxz
| 48
3 | envelope is minx, maxx, miny, maxy, minm, maxm
| 48
4 | envelope is minx, maxx, miny, maxy, minz, maxz, minm, maxm
| 64
B: byte order for header values (1-bit Boolean)
0 = Big Endian (most significant bit first)
1 = Little Endian (least significant bit first)
Implementation
GeometryHeader readHeader() {
GeometryHeader h = new GeometryHeader();
// read first 4 bytes
// TODO: something with the magic number
// byte[] buf = new byte[4];
_din = ByteOrderDataInStream(_dataBuffer);
_din.readByte();
_din.readByte();
_din.readByte();
int flag = _din.readByte();
// next byte flags
h.setFlags(new GeometryHeaderFlags(flag)); //(byte) buf[3]));
// set endianess
// ByteOrderDataInStream din = new ByteOrderDataInStream(input);
_din.setOrder(h.getFlags().getEndianess());
// read the srid
h.setSrid(_din.readInt());
// read the envelope
EnvelopeType envelopeIndicator = h.getFlags().getEnvelopeIndicator();
if (envelopeIndicator != EnvelopeType.NONE) {
double x1 = _din.readDouble();
double x2 = _din.readDouble();
double y1 = _din.readDouble();
double y2 = _din.readDouble();
if (envelopeIndicator.value > 1) {
// 2 = minz,maxz; 3 = minm,maxm - we ignore these for now
_din.readDouble();
_din.readDouble();
}
if (envelopeIndicator.value > 3) {
// 4 = minz,maxz,minm,maxm - we ignore these for now
_din.readDouble();
_din.readDouble();
}
h.setEnvelope(new Envelope(x1, x2, y1, y2));
}
return h;
}