/**
   * Read the envelope based upon the indicator value
   *
   * @param envelopeIndicator
   * @param reader
   * @return
   */
  private GeometryEnvelope readEnvelope(int envelopeIndicator, ByteReader reader) {

    GeometryEnvelope envelope = null;

    if (envelopeIndicator > 0) {

      // Read x and y values and create envelope
      double minX = reader.readDouble();
      double maxX = reader.readDouble();
      double minY = reader.readDouble();
      double maxY = reader.readDouble();

      boolean hasZ = false;
      Double minZ = null;
      Double maxZ = null;

      boolean hasM = false;
      Double minM = null;
      Double maxM = null;

      // Read z values
      if (envelopeIndicator == 2 || envelopeIndicator == 4) {
        hasZ = true;
        minZ = reader.readDouble();
        maxZ = reader.readDouble();
      }

      // Read m values
      if (envelopeIndicator == 3 || envelopeIndicator == 4) {
        hasM = true;
        minM = reader.readDouble();
        maxM = reader.readDouble();
      }

      envelope = new GeometryEnvelope(hasZ, hasM);

      envelope.setMinX(minX);
      envelope.setMaxX(maxX);
      envelope.setMinY(minY);
      envelope.setMaxY(maxY);

      if (hasZ) {
        envelope.setMinZ(minZ);
        envelope.setMaxZ(maxZ);
      }

      if (hasM) {
        envelope.setMinM(minM);
        envelope.setMaxM(maxM);
      }
    }

    return envelope;
  }