/**
   * Populate the geometry data from the bytes
   *
   * @param bytes
   */
  public void fromBytes(byte[] bytes) {
    this.bytes = bytes;

    ByteReader reader = new ByteReader(bytes);

    // Get 2 bytes as the magic number and validate
    String magic = null;
    try {
      magic = reader.readString(2);
    } catch (UnsupportedEncodingException e) {
      throw new GeoPackageException(
          "Unexpected GeoPackage Geometry magic number character encoding: Expected: "
              + GeoPackageConstants.GEO_PACKAGE_GEOMETRY_MAGIC_NUMBER);
    }
    if (!magic.equals(GeoPackageConstants.GEO_PACKAGE_GEOMETRY_MAGIC_NUMBER)) {
      throw new GeoPackageException(
          "Unexpected GeoPackage Geometry magic number: "
              + magic
              + ", Expected: "
              + GeoPackageConstants.GEO_PACKAGE_GEOMETRY_MAGIC_NUMBER);
    }

    // Get a byte as the version and validate, value of 0 = version 1
    byte version = reader.readByte();
    if (version != GeoPackageConstants.GEO_PACKAGE_GEOMETRY_VERSION_1) {
      throw new GeoPackageException(
          "Unexpected GeoPackage Geometry version: "
              + version
              + ", Expected: "
              + GeoPackageConstants.GEO_PACKAGE_GEOMETRY_VERSION_1);
    }

    // Get a flags byte and then read the flag values
    byte flags = reader.readByte();
    int envelopeIndicator = readFlags(flags);
    reader.setByteOrder(byteOrder);

    // Read the 5th - 8th bytes as the srs id
    srsId = reader.readInt();

    // Read the envelope
    envelope = readEnvelope(envelopeIndicator, reader);

    // Save off where the WKB bytes start
    wkbGeometryIndex = reader.getNextByte();

    // Read the Well-Known Binary Geometry if not marked as empty
    if (!empty) {
      geometry = WkbGeometryReader.readGeometry(reader);
    }
  }