readHeader method

GeometryHeader readHeader()

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;
}