public static Terradue.ServiceModel.Ogc.Opt21.OptEarthObservationType LandsatToEo(Terradue.OpenSearch.Model.Schemas.EarthExplorer.scene scene)
        {
            Terradue.ServiceModel.Ogc.Opt21.OptEarthObservationType optEo = new Terradue.ServiceModel.Ogc.Opt21.OptEarthObservationType();

            List <Terradue.ServiceModel.Ogc.Eop21.SpecificInformationPropertyType> vs = new List <Terradue.ServiceModel.Ogc.Eop21.SpecificInformationPropertyType>();

            optEo.EopMetaDataProperty = new Terradue.ServiceModel.Ogc.Eop21.EarthObservationMetaDataPropertyType();
            optEo.EopMetaDataProperty.EarthObservationMetaData = new Terradue.ServiceModel.Ogc.Eop21.EarthObservationMetaDataType();
            var identifier = scene.metadataFields.FirstOrDefault(m => m.name == "Landsat Scene Identifier");

            optEo.EopMetaDataProperty.EarthObservationMetaData.identifier = identifier.metadataValue;

            optEo.procedure = new Terradue.ServiceModel.Ogc.Om20.OM_ProcessPropertyType();
            optEo.procedure.Eop21EarthObservationEquipment                             = new Terradue.ServiceModel.Ogc.Eop21.EarthObservationEquipmentType();
            optEo.procedure.Eop21EarthObservationEquipment.platform                    = new Terradue.ServiceModel.Ogc.Eop21.PlatformPropertyType();
            optEo.procedure.Eop21EarthObservationEquipment.platform.Platform           = new Terradue.ServiceModel.Ogc.Eop21.PlatformType();
            optEo.procedure.Eop21EarthObservationEquipment.platform.Platform.shortName = "Landsat-" + identifier.metadataValue.Substring(2, 1);
            optEo.procedure.Eop21EarthObservationEquipment.platform.Platform.orbitType = Terradue.ServiceModel.Ogc.Eop21.OrbitTypeValueType.LEO;
            optEo.procedure.Eop21EarthObservationEquipment.instrument                  = new Terradue.ServiceModel.Ogc.Eop21.InstrumentPropertyType();
            optEo.procedure.Eop21EarthObservationEquipment.instrument.Instrument       = new Terradue.ServiceModel.Ogc.Eop21.InstrumentType();
            switch (identifier.metadataValue.Substring(1, 1))
            {
            case "T":
                optEo.procedure.Eop21EarthObservationEquipment.instrument.Instrument.shortName   = "TIRS";
                optEo.procedure.Eop21EarthObservationEquipment.instrument.Instrument.description = "Thermal Infrared Sensor";
                break;

            case "O":
                optEo.procedure.Eop21EarthObservationEquipment.instrument.Instrument.shortName   = "OLI";
                optEo.procedure.Eop21EarthObservationEquipment.instrument.Instrument.description = "Operational Land Imager";
                break;

            case "C":
                optEo.procedure.Eop21EarthObservationEquipment.instrument.Instrument.shortName   = "OLI_TIRS";
                optEo.procedure.Eop21EarthObservationEquipment.instrument.Instrument.description = "Operational Land Imager & Thermal Infrared Sensor";
                break;
            }
            optEo.procedure.Eop21EarthObservationEquipment.sensor                   = new Terradue.ServiceModel.Ogc.Eop21.SensorPropertyType();
            optEo.procedure.Eop21EarthObservationEquipment.sensor.Sensor            = new Terradue.ServiceModel.Ogc.Eop21.SensorType();
            optEo.procedure.Eop21EarthObservationEquipment.sensor.Sensor.sensorType = "OPTICAL";

            optEo.procedure.Eop21EarthObservationEquipment.acquisitionParameters             = new Terradue.ServiceModel.Ogc.Eop21.AcquisitionPropertyType();
            optEo.procedure.Eop21EarthObservationEquipment.acquisitionParameters.Acquisition = new Terradue.ServiceModel.Ogc.Eop21.AcquisitionType();
            var swrsRow = scene.metadataFields.FirstOrDefault(m => m.name == "Target WRS Row");

            if (swrsRow != null)
            {
                int wrsRow = int.Parse(swrsRow.metadataValue);
                if (wrsRow > 1 && wrsRow <= 122)
                {
                    optEo.procedure.Eop21EarthObservationEquipment.acquisitionParameters.Acquisition.orbitDirection = Terradue.ServiceModel.Ogc.Eop21.OrbitDirectionValueType.DESCENDING;
                }
                if (wrsRow >= 123 && wrsRow <= 246)
                {
                    optEo.procedure.Eop21EarthObservationEquipment.acquisitionParameters.Acquisition.orbitDirection = Terradue.ServiceModel.Ogc.Eop21.OrbitDirectionValueType.ASCENDING;
                }
                if (wrsRow >= 247 && wrsRow <= 248)
                {
                    optEo.procedure.Eop21EarthObservationEquipment.acquisitionParameters.Acquisition.orbitDirection = Terradue.ServiceModel.Ogc.Eop21.OrbitDirectionValueType.DESCENDING;
                }
                optEo.procedure.Eop21EarthObservationEquipment.acquisitionParameters.Acquisition.orbitDirectionSpecified = true;
                optEo.procedure.Eop21EarthObservationEquipment.acquisitionParameters.Acquisition.wrsLatitudeGrid         = new Terradue.ServiceModel.Ogc.Gml321.CodeWithAuthorityType();
                optEo.procedure.Eop21EarthObservationEquipment.acquisitionParameters.Acquisition.wrsLatitudeGrid.Value   = wrsRow.ToString();
            }
            var swrsPath = scene.metadataFields.FirstOrDefault(m => m.name == "Target WRS Path");

            if (swrsPath != null)
            {
                optEo.procedure.Eop21EarthObservationEquipment.acquisitionParameters.Acquisition.wrsLongitudeGrid       = new Terradue.ServiceModel.Ogc.Gml321.CodeWithAuthorityType();
                optEo.procedure.Eop21EarthObservationEquipment.acquisitionParameters.Acquisition.wrsLongitudeGrid.Value = swrsPath.metadataValue.Trim();
            }

            var fullscene = scene.metadataFields.FirstOrDefault(m => m.name == "Full or Partial Scene");

            if (fullscene != null)
            {
                Terradue.ServiceModel.Ogc.Eop21.SpecificInformationPropertyType vss = new Terradue.ServiceModel.Ogc.Eop21.SpecificInformationPropertyType();
                vss.SpecificInformation = new Terradue.ServiceModel.Ogc.Eop21.SpecificInformationType();
                vss.SpecificInformation.localAttribute = "full_partial_scene";
                vss.SpecificInformation.localValue     = fullscene.metadataValue;
            }

            var dataCat = scene.metadataFields.FirstOrDefault(m => m.name == "Data Category");

            if (dataCat != null)
            {
                switch (dataCat.metadataValue)
                {
                case "NOMINAL":
                    optEo.EopMetaDataProperty.EarthObservationMetaData.acquisitionType = Terradue.ServiceModel.Ogc.Eop21.AcquisitionTypeValueType.NOMINAL;
                    break;

                case "EXCHANGE":
                    optEo.EopMetaDataProperty.EarthObservationMetaData.acquisitionType = Terradue.ServiceModel.Ogc.Eop21.AcquisitionTypeValueType.OTHER;
                    break;

                case "TEST":
                    optEo.EopMetaDataProperty.EarthObservationMetaData.acquisitionType = Terradue.ServiceModel.Ogc.Eop21.AcquisitionTypeValueType.OTHER;
                    break;

                case "ENGINEERING":
                    optEo.EopMetaDataProperty.EarthObservationMetaData.acquisitionType = Terradue.ServiceModel.Ogc.Eop21.AcquisitionTypeValueType.OTHER;
                    break;

                case "VALIDATION":
                    optEo.EopMetaDataProperty.EarthObservationMetaData.acquisitionType = Terradue.ServiceModel.Ogc.Eop21.AcquisitionTypeValueType.CALIBRATION;
                    break;
                }
            }

            optEo.EopMetaDataProperty.EarthObservationMetaData.processing    = new Terradue.ServiceModel.Ogc.Eop21.ProcessingInformationPropertyType[1];
            optEo.EopMetaDataProperty.EarthObservationMetaData.processing[0] = new Terradue.ServiceModel.Ogc.Eop21.ProcessingInformationPropertyType();
            optEo.EopMetaDataProperty.EarthObservationMetaData.processing[0].ProcessingInformation = new Terradue.ServiceModel.Ogc.Eop21.ProcessingInformationType();

            var level1 = scene.metadataFields.FirstOrDefault(m => m.name == "Data Type Level 1");

            if (level1 != null)
            {
                optEo.EopMetaDataProperty.EarthObservationMetaData.processing[0].ProcessingInformation.processingLevel = level1.metadataValue;
            }



            List <string> aux = new List <string>();

            var bpfoli = scene.metadataFields.FirstOrDefault(m => m.name == "Bias Parameter File Name OLI");

            if (bpfoli != null)
            {
                aux.Add(bpfoli.metadataValue);
            }
            var bpftirs = scene.metadataFields.FirstOrDefault(m => m.name == "Bias Parameter File Name TIRS");

            if (bpftirs != null)
            {
                aux.Add(bpftirs.metadataValue);
            }
            var bpfcal = scene.metadataFields.FirstOrDefault(m => m.name == "Calibration Parameter File");

            if (bpfcal != null)
            {
                aux.Add(bpfcal.metadataValue);
            }
            var bpfrlut = scene.metadataFields.FirstOrDefault(m => m.name == "RLUT File Name");

            if (bpfrlut != null)
            {
                aux.Add(bpfrlut.metadataValue);
            }

            optEo.EopMetaDataProperty.EarthObservationMetaData.processing[0].ProcessingInformation.auxiliaryDataSetFileName = aux.ToArray();

            optEo.phenomenonTime = new Terradue.ServiceModel.Ogc.Om20.TimeObjectPropertyType();
            optEo.phenomenonTime.GmlTimePeriod = new Terradue.ServiceModel.Ogc.Gml321.TimePeriodType();
            var start = scene.metadataFields.FirstOrDefault(m => m.name == "Start Time");
            var stop  = scene.metadataFields.FirstOrDefault(m => m.name == "Stop Time");

            if (start != null)
            {
                DateTime startdate = ParseDateTime(start.metadataValue);
                optEo.phenomenonTime.GmlTimePeriod.beginPosition       = new Terradue.ServiceModel.Ogc.Gml321.TimePositionType();
                optEo.phenomenonTime.GmlTimePeriod.beginPosition.Value = startdate.ToString("O");
            }
            if (stop != null)
            {
                DateTime stopdate = ParseDateTime(stop.metadataValue);
                optEo.phenomenonTime.GmlTimePeriod.endPosition       = new Terradue.ServiceModel.Ogc.Gml321.TimePositionType();
                optEo.phenomenonTime.GmlTimePeriod.endPosition.Value = stopdate.ToString("O");
            }

            optEo.EopMetaDataProperty.EarthObservationMetaData.vendorSpecific = vs.ToArray();

            var qua = scene.metadataFields.FirstOrDefault(m => m.name == "Image Quality");

            if (qua != null)
            {
                optEo.EopMetaDataProperty.EarthObservationMetaData.imageQualityDegradation       = new Terradue.ServiceModel.Ogc.Gml321.MeasureType();
                optEo.EopMetaDataProperty.EarthObservationMetaData.imageQualityDegradation.Value = double.Parse(qua.metadataValue);
            }

            optEo.result = new Terradue.ServiceModel.Ogc.Opt21.OptEarthObservationResultPropertyType();
            optEo.result.Opt21EarthObservationResult = new Terradue.ServiceModel.Ogc.Opt21.OptEarthObservationResultType();


            var    cc = scene.metadataFields.FirstOrDefault(m => m.name == "Scene Cloud Cover");
            double ccd;

            if (cc != null && double.TryParse(cc.metadataValue, out ccd))
            {
                optEo.result.Opt21EarthObservationResult.cloudCoverPercentage       = new Terradue.ServiceModel.Ogc.Gml321.MeasureType();
                optEo.result.Opt21EarthObservationResult.cloudCoverPercentage.Value = ccd;
            }

            var sunelev = scene.metadataFields.FirstOrDefault(m => m.name == "Sun Elevation");

            if (sunelev != null)
            {
                optEo.procedure.Eop21EarthObservationEquipment.acquisitionParameters.Acquisition.illuminationElevationAngle       = new Terradue.ServiceModel.Ogc.Gml321.AngleType();
                optEo.procedure.Eop21EarthObservationEquipment.acquisitionParameters.Acquisition.illuminationElevationAngle.Value = double.Parse(sunelev.metadataValue);
            }

            var sunazimuth = scene.metadataFields.FirstOrDefault(m => m.name == "Sun Azimuth");

            if (sunazimuth != null)
            {
                optEo.procedure.Eop21EarthObservationEquipment.acquisitionParameters.Acquisition.illuminationAzimuthAngle       = new Terradue.ServiceModel.Ogc.Gml321.AngleType();
                optEo.procedure.Eop21EarthObservationEquipment.acquisitionParameters.Acquisition.illuminationAzimuthAngle.Value = double.Parse(sunazimuth.metadataValue);
            }

            var brwexist = scene.metadataFields.FirstOrDefault(m => m.name == "Browse Exists");

            if (brwexist != null && brwexist.metadataValue == "Y")
            {
                if (scene.overlayLinks.Count() > 0)
                {
                    var overlay = scene.overlayLinks.FirstOrDefault(l => l.caption.Contains("Natural"));
                    if (overlay != null)
                    {
                        optEo.result.Opt21EarthObservationResult.browse    = new Terradue.ServiceModel.Ogc.Eop21.BrowseInformationPropertyType[1];
                        optEo.result.Opt21EarthObservationResult.browse[0] = new Terradue.ServiceModel.Ogc.Eop21.BrowseInformationPropertyType();
                        optEo.result.Opt21EarthObservationResult.browse[0].BrowseInformation = new Terradue.ServiceModel.Ogc.Eop21.BrowseInformationType();
                        var wmsparams = overlay.overlayLink.Split('&');
                        if (wmsparams.Count() > 0 && wmsparams.FirstOrDefault(p => p.StartsWith("srs=")) != null)
                        {
                            optEo.result.Opt21EarthObservationResult.browse[0].BrowseInformation.referenceSystemIdentifier       = new Terradue.ServiceModel.Ogc.Gml321.CodeWithAuthorityType();
                            optEo.result.Opt21EarthObservationResult.browse[0].BrowseInformation.referenceSystemIdentifier.Value = wmsparams.FirstOrDefault(p => p.StartsWith("srs=")).Split('=')[1];
                        }
                        optEo.result.Opt21EarthObservationResult.browse[0].BrowseInformation.fileName = new Terradue.ServiceModel.Ogc.Eop21.BrowseInformationTypeFileName();
                        optEo.result.Opt21EarthObservationResult.browse[0].BrowseInformation.fileName.ServiceReference      = new Terradue.ServiceModel.Ogc.Ows20.ServiceReferenceType();
                        optEo.result.Opt21EarthObservationResult.browse[0].BrowseInformation.fileName.ServiceReference.href = overlay.overlayLink;
                        optEo.result.Opt21EarthObservationResult.browse[0].BrowseInformation.type = "img";
                        optEo.result.Opt21EarthObservationResult.browse[0].BrowseInformation.fileName.ServiceReference.title = overlay.caption;
                        optEo.result.Opt21EarthObservationResult.browse[0].BrowseInformation.fileName.ServiceReference.type  = "image/png";
                    }
                }
            }

            return(optEo);
        }
        public static Terradue.ServiceModel.Ogc.Eop21.EarthObservationType GetEarthObservationTypeFromRdf(XElement rdf, XElement series, string type) {

            Terradue.ServiceModel.Ogc.Eop21.EarthObservationType eo =new Terradue.ServiceModel.Ogc.Eop21.EarthObservationType();

            if (type == "RADAR")
                eo = new Terradue.ServiceModel.Ogc.Sar21.SarEarthObservationType();
            if (type == "OPTICAL")
                eo = new Terradue.ServiceModel.Ogc.Opt21.OptEarthObservationType();
            if (type == "ALTIMETRIC")
                eo = new Terradue.ServiceModel.Ogc.Alt21.AltEarthObservationType();
            if (type == "ATMOSPHERIC")
                eo = new Terradue.ServiceModel.Ogc.Atm21.AtmEarthObservationType();
            if (type == "LIMB")
                eo = new Terradue.ServiceModel.Ogc.Lmb21.LmbEarthObservationType();
            if (type == "SSP")
                eo = new Terradue.ServiceModel.Ogc.Ssp21.SspEarthObservationType();
             

            // Equipment
            eo.procedure = new Terradue.ServiceModel.Ogc.Om.OM_ProcessPropertyType();
            eo.procedure.Eop21EarthObservationEquipment = GetEop21EarthObservationEquipmentFromRdf(rdf, series, type);

            // Phenomenon
            eo.phenomenonTime = GetEOPhenomenonTypeFromRdf(rdf, series);

            // Metadata
            eo.EopMetaDataProperty = GetMetadataTypeFromRdf(rdf, series);

            // Result
            eo.result = GetEopResultTypeFromRdf(rdf, series, type);

            // Footprint
            eo.featureOfInterest = GetFeatureOfInterest(rdf, series, type);

            return eo;
        }
        public static Terradue.ServiceModel.Ogc.Opt21.OptEarthObservationType LandsatToEo(Terradue.OpenSearch.Model.Schemas.EarthExplorer.scene scene)
        {
            Terradue.ServiceModel.Ogc.Opt21.OptEarthObservationType optEo = new Terradue.ServiceModel.Ogc.Opt21.OptEarthObservationType();

            List<Terradue.ServiceModel.Ogc.Eop21.SpecificInformationPropertyType> vs = new List<Terradue.ServiceModel.Ogc.Eop21.SpecificInformationPropertyType>();

            optEo.EopMetaDataProperty = new Terradue.ServiceModel.Ogc.Eop21.EarthObservationMetaDataPropertyType();
            optEo.EopMetaDataProperty.EarthObservationMetaData = new Terradue.ServiceModel.Ogc.Eop21.EarthObservationMetaDataType();
            var identifier = scene.metadataFields.FirstOrDefault(m => m.name == "Landsat Scene Identifier");
            optEo.EopMetaDataProperty.EarthObservationMetaData.identifier = identifier.metadataValue;

            optEo.procedure = new Terradue.ServiceModel.Ogc.Om.OM_ProcessPropertyType();
            optEo.procedure.Eop21EarthObservationEquipment = new Terradue.ServiceModel.Ogc.Eop21.EarthObservationEquipmentType();
            optEo.procedure.Eop21EarthObservationEquipment.platform = new Terradue.ServiceModel.Ogc.Eop21.PlatformPropertyType();
            optEo.procedure.Eop21EarthObservationEquipment.platform.Platform = new Terradue.ServiceModel.Ogc.Eop21.PlatformType();
            optEo.procedure.Eop21EarthObservationEquipment.platform.Platform.shortName = "Landsat-" + identifier.metadataValue.Substring(2, 1);
            optEo.procedure.Eop21EarthObservationEquipment.platform.Platform.orbitType = Terradue.ServiceModel.Ogc.Eop21.OrbitTypeValueType.LEO;
            optEo.procedure.Eop21EarthObservationEquipment.instrument = new Terradue.ServiceModel.Ogc.Eop21.InstrumentPropertyType();
            optEo.procedure.Eop21EarthObservationEquipment.instrument.Instrument = new Terradue.ServiceModel.Ogc.Eop21.InstrumentType();
            switch (identifier.metadataValue.Substring(1, 1))
            {
                case "T":
                    optEo.procedure.Eop21EarthObservationEquipment.instrument.Instrument.shortName = "TIRS";
                    optEo.procedure.Eop21EarthObservationEquipment.instrument.Instrument.description = "Thermal Infrared Sensor";
                    break;
                case "O":
                    optEo.procedure.Eop21EarthObservationEquipment.instrument.Instrument.shortName = "OLI";
                    optEo.procedure.Eop21EarthObservationEquipment.instrument.Instrument.description = "Operational Land Imager";
                    break;
                case "C":
                    optEo.procedure.Eop21EarthObservationEquipment.instrument.Instrument.shortName = "OLI_TIRS";
                    optEo.procedure.Eop21EarthObservationEquipment.instrument.Instrument.description = "Operational Land Imager & Thermal Infrared Sensor";
                    break;
            }
            optEo.procedure.Eop21EarthObservationEquipment.sensor = new Terradue.ServiceModel.Ogc.Eop21.SensorPropertyType();
            optEo.procedure.Eop21EarthObservationEquipment.sensor.Sensor = new Terradue.ServiceModel.Ogc.Eop21.SensorType();
            optEo.procedure.Eop21EarthObservationEquipment.sensor.Sensor.sensorType = "OPTICAL";

            optEo.procedure.Eop21EarthObservationEquipment.acquisitionParameters = new Terradue.ServiceModel.Ogc.Eop21.AcquisitionPropertyType();
            optEo.procedure.Eop21EarthObservationEquipment.acquisitionParameters.Acquisition = new Terradue.ServiceModel.Ogc.Eop21.AcquisitionType();
            var swrsRow = scene.metadataFields.FirstOrDefault(m => m.name == "Target WRS Row");
            if (swrsRow != null)
            {
                int wrsRow = int.Parse(swrsRow.metadataValue);
                if (wrsRow > 1 && wrsRow <= 122)
                    optEo.procedure.Eop21EarthObservationEquipment.acquisitionParameters.Acquisition.orbitDirection = Terradue.ServiceModel.Ogc.Eop21.OrbitDirectionValueType.DESCENDING;
                if (wrsRow >= 123 && wrsRow <= 246)
                    optEo.procedure.Eop21EarthObservationEquipment.acquisitionParameters.Acquisition.orbitDirection = Terradue.ServiceModel.Ogc.Eop21.OrbitDirectionValueType.ASCENDING;
                if (wrsRow >= 247 && wrsRow <= 248)
                    optEo.procedure.Eop21EarthObservationEquipment.acquisitionParameters.Acquisition.orbitDirection = Terradue.ServiceModel.Ogc.Eop21.OrbitDirectionValueType.DESCENDING;
                optEo.procedure.Eop21EarthObservationEquipment.acquisitionParameters.Acquisition.orbitDirectionSpecified = true;
                optEo.procedure.Eop21EarthObservationEquipment.acquisitionParameters.Acquisition.wrsLatitudeGrid = new Terradue.ServiceModel.Ogc.Gml321.CodeWithAuthorityType();
                optEo.procedure.Eop21EarthObservationEquipment.acquisitionParameters.Acquisition.wrsLatitudeGrid.Value = wrsRow.ToString();
            }
            var swrsPath = scene.metadataFields.FirstOrDefault(m => m.name == "Target WRS Path");
            if (swrsPath != null)
            {
                optEo.procedure.Eop21EarthObservationEquipment.acquisitionParameters.Acquisition.wrsLongitudeGrid = new Terradue.ServiceModel.Ogc.Gml321.CodeWithAuthorityType();
                optEo.procedure.Eop21EarthObservationEquipment.acquisitionParameters.Acquisition.wrsLongitudeGrid.Value = swrsPath.metadataValue.Trim();
            }

            var fullscene = scene.metadataFields.FirstOrDefault(m => m.name == "Full or Partial Scene");
            if (fullscene != null)
            {
                Terradue.ServiceModel.Ogc.Eop21.SpecificInformationPropertyType vss = new Terradue.ServiceModel.Ogc.Eop21.SpecificInformationPropertyType();
                vss.SpecificInformation = new Terradue.ServiceModel.Ogc.Eop21.SpecificInformationType();
                vss.SpecificInformation.localAttribute = "full_partial_scene";
                vss.SpecificInformation.localValue = fullscene.metadataValue;
            }

            var dataCat = scene.metadataFields.FirstOrDefault(m => m.name == "Data Category");
            if (dataCat != null)
            {
                switch (dataCat.metadataValue)
                {
                    case "NOMINAL":
                        optEo.EopMetaDataProperty.EarthObservationMetaData.acquisitionType = Terradue.ServiceModel.Ogc.Eop21.AcquisitionTypeValueType.NOMINAL;
                        break;
                    case "EXCHANGE":
                        optEo.EopMetaDataProperty.EarthObservationMetaData.acquisitionType = Terradue.ServiceModel.Ogc.Eop21.AcquisitionTypeValueType.OTHER;
                        break;
                    case "TEST":
                        optEo.EopMetaDataProperty.EarthObservationMetaData.acquisitionType = Terradue.ServiceModel.Ogc.Eop21.AcquisitionTypeValueType.OTHER;
                        break;
                    case "ENGINEERING":
                        optEo.EopMetaDataProperty.EarthObservationMetaData.acquisitionType = Terradue.ServiceModel.Ogc.Eop21.AcquisitionTypeValueType.OTHER;
                        break;
                    case "VALIDATION":
                        optEo.EopMetaDataProperty.EarthObservationMetaData.acquisitionType = Terradue.ServiceModel.Ogc.Eop21.AcquisitionTypeValueType.CALIBRATION;
                        break;
                }
            }

            optEo.EopMetaDataProperty.EarthObservationMetaData.processing = new Terradue.ServiceModel.Ogc.Eop21.ProcessingInformationPropertyType[1];
            optEo.EopMetaDataProperty.EarthObservationMetaData.processing[0] = new Terradue.ServiceModel.Ogc.Eop21.ProcessingInformationPropertyType();
            optEo.EopMetaDataProperty.EarthObservationMetaData.processing[0].ProcessingInformation = new Terradue.ServiceModel.Ogc.Eop21.ProcessingInformationType();

            var level1 = scene.metadataFields.FirstOrDefault(m => m.name == "Data Type Level 1");
            if (level1 != null)
            {
                optEo.EopMetaDataProperty.EarthObservationMetaData.processing[0].ProcessingInformation.processingLevel = level1.metadataValue;
            }

            List<string> aux = new List<string>();

            var bpfoli = scene.metadataFields.FirstOrDefault(m => m.name == "Bias Parameter File Name OLI");
            if (bpfoli != null)
            {
                aux.Add(bpfoli.metadataValue);
            }
            var bpftirs = scene.metadataFields.FirstOrDefault(m => m.name == "Bias Parameter File Name TIRS");
            if (bpftirs != null)
            {
                aux.Add(bpftirs.metadataValue);
            }
            var bpfcal = scene.metadataFields.FirstOrDefault(m => m.name == "Calibration Parameter File");
            if (bpfcal != null)
            {
                aux.Add(bpfcal.metadataValue);
            }
            var bpfrlut = scene.metadataFields.FirstOrDefault(m => m.name == "RLUT File Name");
            if (bpfrlut != null)
            {
                aux.Add(bpfrlut.metadataValue);
            }

            optEo.EopMetaDataProperty.EarthObservationMetaData.processing[0].ProcessingInformation.auxiliaryDataSetFileName = aux.ToArray();

            optEo.phenomenonTime = new Terradue.ServiceModel.Ogc.Om.TimeObjectPropertyType();
            optEo.phenomenonTime.GmlTimePeriod = new Terradue.ServiceModel.Ogc.Gml321.TimePeriodType();
            var start = scene.metadataFields.FirstOrDefault(m => m.name == "Start Time");
            var stop = scene.metadataFields.FirstOrDefault(m => m.name == "Stop Time");
            if (start != null)
            {
                DateTime startdate = ParseDateTime(start.metadataValue);
                optEo.phenomenonTime.GmlTimePeriod.beginPosition = new Terradue.ServiceModel.Ogc.Gml321.TimePositionType();
                optEo.phenomenonTime.GmlTimePeriod.beginPosition.Value = startdate.ToString("O");
            }
            if (stop != null)
            {
                DateTime stopdate = ParseDateTime(stop.metadataValue);
                optEo.phenomenonTime.GmlTimePeriod.endPosition = new Terradue.ServiceModel.Ogc.Gml321.TimePositionType();
                optEo.phenomenonTime.GmlTimePeriod.endPosition.Value = stopdate.ToString("O");
            }

            optEo.EopMetaDataProperty.EarthObservationMetaData.vendorSpecific = vs.ToArray();

            var qua = scene.metadataFields.FirstOrDefault(m => m.name == "Image Quality");
            if (qua != null)
            {
                optEo.EopMetaDataProperty.EarthObservationMetaData.imageQualityDegradation = new Terradue.ServiceModel.Ogc.Gml321.MeasureType();
                optEo.EopMetaDataProperty.EarthObservationMetaData.imageQualityDegradation.Value = double.Parse(qua.metadataValue);
            }

            optEo.result = new Terradue.ServiceModel.Ogc.Opt21.OptEarthObservationResultPropertyType();
            optEo.result.Opt21EarthObservationResult = new Terradue.ServiceModel.Ogc.Opt21.OptEarthObservationResultType();

            var cc = scene.metadataFields.FirstOrDefault(m => m.name == "Scene Cloud Cover");
            double ccd;
            if (cc != null && double.TryParse(cc.metadataValue, out ccd))
            {
                optEo.result.Opt21EarthObservationResult.cloudCoverPercentage = new Terradue.ServiceModel.Ogc.Gml321.MeasureType();
                optEo.result.Opt21EarthObservationResult.cloudCoverPercentage.Value = ccd;
            }

            var sunelev = scene.metadataFields.FirstOrDefault(m => m.name == "Sun Elevation");
            if (sunelev != null)
            {
                optEo.procedure.Eop21EarthObservationEquipment.acquisitionParameters.Acquisition.illuminationElevationAngle = new Terradue.ServiceModel.Ogc.Gml321.AngleType();
                optEo.procedure.Eop21EarthObservationEquipment.acquisitionParameters.Acquisition.illuminationElevationAngle.Value = double.Parse(sunelev.metadataValue);
            }

            var sunazimuth = scene.metadataFields.FirstOrDefault(m => m.name == "Sun Azimuth");
            if (sunazimuth != null)
            {
                optEo.procedure.Eop21EarthObservationEquipment.acquisitionParameters.Acquisition.illuminationAzimuthAngle = new Terradue.ServiceModel.Ogc.Gml321.AngleType();
                optEo.procedure.Eop21EarthObservationEquipment.acquisitionParameters.Acquisition.illuminationAzimuthAngle.Value = double.Parse(sunazimuth.metadataValue);
            }

            var brwexist = scene.metadataFields.FirstOrDefault(m => m.name == "Browse Exists");
            if (brwexist != null && brwexist.metadataValue == "Y")
            {

                if (scene.overlayLinks.Count() > 0)
                {

                    var overlay = scene.overlayLinks.FirstOrDefault(l => l.caption.Contains("Natural"));
                    if (overlay != null)
                    {
                        optEo.result.Opt21EarthObservationResult.browse = new Terradue.ServiceModel.Ogc.Eop21.BrowseInformationPropertyType[1];
                        optEo.result.Opt21EarthObservationResult.browse[0] = new Terradue.ServiceModel.Ogc.Eop21.BrowseInformationPropertyType();
                        optEo.result.Opt21EarthObservationResult.browse[0].BrowseInformation = new Terradue.ServiceModel.Ogc.Eop21.BrowseInformationType();
                        var wmsparams = overlay.overlayLink.Split('&');
                        if (wmsparams.Count() > 0 && wmsparams.FirstOrDefault(p => p.StartsWith("srs=")) != null)
                        {
                            optEo.result.Opt21EarthObservationResult.browse[0].BrowseInformation.referenceSystemIdentifier = new Terradue.ServiceModel.Ogc.Gml321.CodeWithAuthorityType();
                            optEo.result.Opt21EarthObservationResult.browse[0].BrowseInformation.referenceSystemIdentifier.Value = wmsparams.FirstOrDefault(p => p.StartsWith("srs=")).Split('=')[1];
                        }
                        optEo.result.Opt21EarthObservationResult.browse[0].BrowseInformation.fileName = new Terradue.ServiceModel.Ogc.Eop21.BrowseInformationTypeFileName();
                        optEo.result.Opt21EarthObservationResult.browse[0].BrowseInformation.fileName.ServiceReference = new Terradue.ServiceModel.Ogc.Ows.ServiceReferenceType();
                        optEo.result.Opt21EarthObservationResult.browse[0].BrowseInformation.fileName.ServiceReference.href = overlay.overlayLink;
                        optEo.result.Opt21EarthObservationResult.browse[0].BrowseInformation.type = "img";
                        optEo.result.Opt21EarthObservationResult.browse[0].BrowseInformation.fileName.ServiceReference.title = overlay.caption;
                        optEo.result.Opt21EarthObservationResult.browse[0].BrowseInformation.fileName.ServiceReference.type = "image/png";
                    }
                }
            }

            return optEo;
        }