private static String interpretElements(final GeoKey geoKey, final int ref, final int len, final int valueOrPosition, final double[] doubleParameters,
            final String asciiParameters) {
        switch (geoKey) {
        case GTModelTypeGeoKey:
            switch (valueOrPosition) {
            case 1:
                return "Projected Coordinate System";
            case 2:
                return "Geographic Coordinate System";
            case 3:
                // the Geocentric coordinate system is seldom used
                return "Geocentric Coordinate System";
            default:
                break;
            }
            break;
        case GTRasterTypeGeoKey:
            switch (valueOrPosition) {
            case 1:
                return "RasterPixelIsArea";
            case 2:
                return "RasterPixelIsPoint";
            default:
                return "User Defined";
            }
        case GeographicTypeGeoKey:
            switch (valueOrPosition) {
            case 4269:
                return "North American Datum 1983";
            case 4030:
                return "World Geodetic Survey 1984";
            case 4326:
                return "EPSG 4326, Geographic 2D WGS 84";
            default:
                break;
            }
            break;
        case GTCitationGeoKey:
            return extractAscii(asciiParameters, valueOrPosition, len);
        case GeogCitationGeoKey:
            return extractAscii(asciiParameters, valueOrPosition, len);
        case GeogAngularUnitsGeoKey:
            switch (valueOrPosition) {
            case 9101:
                return "Radians";
            case 9102:
                return "Degrees";
            default:
                break;
            }
            break;
        case GeogSemiMajorAxisGeoKey:
            return extractDouble(doubleParameters, valueOrPosition, len);
        case GeogInvFlatteningGeoKey:
            return extractDouble(doubleParameters, valueOrPosition, len);
        case To_WGS84_GeoKey:
            return extractDouble(doubleParameters, valueOrPosition, len);
        case ProjectedCRSGeoKey:
            // in original spec was "ProjectedCSTypeGeoKey"
            if (0 <= valueOrPosition && valueOrPosition <= 1023) {
                return "Reserved";
            }
            if (1024 <= valueOrPosition && valueOrPosition <= 32766) {
                return "EPSG Code #" + valueOrPosition;
            }
            if (valueOrPosition == 32767) {
                return "User-Defined Projection";
            }
            break;
        case ProjectionGeoKey:
            if (valueOrPosition == 32767) {
                return "User-Defined";
            }
            break;
        case ProjCoordTransGeoKey:
            final CoordinateTransformationCode code = CoordinateTransformationCode.getValueForKey(valueOrPosition);
            if (code != null) {
                return code.name();
            }
            break;
        case ProjLinearUnitsGeoKey:
            switch (valueOrPosition) {
            case 9001:
                return "Meter";
            case 9002:
                return "Foot";
            case 9003:
                return "Survey Foot"; // used in U.S.
            default:
                break;
            }
            break;
        case ProjStdParallel1GeoKey:
        case ProjStdParallel2GeoKey:
        case ProjNatOriginLongGeoKey:
        case ProjFalseEastingGeoKey:
        case ProjFalseNorthingGeoKey:
        case ProjFalseOriginLongGeoKey:
        case ProjFalseOriginLatGeoKey:
        case ProjFalseOriginEastingGeoKey:
        case ProjFalseOriginNorthingGeoKey:
        case ProjCenterLongGeoKey:
        case ProjCenterLatGeoKey:
            return String.format("%13.4f", doubleParameters[valueOrPosition]);

        default:
            break;
        }
        return "See GeoTIFF specification";
    }
Interprets elements from one row of the GeoKey table, returning a descriptive string where possible. The GeoTIFF specification is extensive, and only a
subset of the possible descriptions are supported here.

@param geoKey           a valid GeoKey enumeration
@param ref              the reference (not used at this time)
@param len              the length of the associated string or floating-point value array (if used)
@param valueOrPosition  a single integer value or the position within the associated floating point array
@param doubleParameters an array of doubles
@param asciiParameters  a String consisting of ASCII characters.
@return a valid string, potentially a note to see the specification if a more useful description is not available.
src/test/java/org/apache/commons/imaging/examples/tiff/ReadTagsAndImages.java