private static void AddIMGOffering(Terradue.ServiceModel.Ogc.Eop21.EarthObservationType eo, IOpenSearchResultItem item)
        {
            Terradue.ServiceModel.Ogc.Eop21.BrowseInformationPropertyType[] bi = null;
            if (eo.result != null && eo.result.Eop21EarthObservationResult.browse != null)
            {
                bi = eo.result.Eop21EarthObservationResult.browse;
            }
            if (bi != null)
            {
                foreach (var browse in bi)
                {
                    if (browse.BrowseInformation.type != "img")
                    {
                        continue;
                    }

                    OwcOffering offering = new OwcOffering();
                    offering.Code            = "http://www.opengis.net/spec/owc-atom/1.0/req/img";
                    offering.Contents        = new OwcContent[1];
                    offering.Contents[0]     = new OwcContent();
                    offering.Contents[0].Url = new Uri(browse.BrowseInformation.fileName.ServiceReference.href);

                    item.ElementExtensions.Add(offering, new XmlSerializer(typeof(OwcOffering)));
                }
            }
        }
        public static Terradue.ServiceModel.Ogc.Eop21.EarthObservationType GetEarthObservationFromRdf(XElement rdf, XElement series) {
            
            Terradue.ServiceModel.Ogc.Eop21.EarthObservationType eo = new Terradue.ServiceModel.Ogc.Eop21.EarthObservationType();

            var sensor = series.Element(XName.Get("sensor", "http://www.genesi-dr.eu/spec/opensearch/extensions/eop/1.0/"));

            if (sensor != null) {

                switch (sensor.Value) {

                    case "AATSR":
                    case "MERIS":
                    case "OLI_TIRS":
                    case "AVHRR":
                    case "SEVIRI":
                    case "PRISM":
                    case "SPOT":
                    case "AVNIR-2":
                        return GetEarthObservationTypeFromRdf(rdf, series, "OPTICAL");

                    case "ASAR":
                    case "PALSAR2":
                    case "PALSAR":
                    case "SAR":
                    case "TSX-SAR":
                    case "MIRAS":
                    case "AMI":
                    case "ASPS":
                        return GetEarthObservationTypeFromRdf(rdf, series, "RADAR");
                    case "SIRAL":
                    case "RA2":
                    case "DORIS":
                        return GetEarthObservationTypeFromRdf(rdf, series, "ALTIMETRIC");
                    
                    
                    case "MIPAS":
                    case "SCIAMACHY":
                    case "GOMOS":
                    case "GOME":
                        throw new NotImplementedException();
                //return GetAtmEarthObservationTypeFromRdf(rdf);


                }
                    
            }

            var identifier = rdf.Element(XName.Get("identifier", "http://purl.org/dc/elements/1.1/"));

            if (identifier != null) {
                if (identifier.Value.StartsWith("S1A")) {
                    return GetEarthObservationTypeFromRdf(rdf, series, "RADAR"); 
                }
            }

            return GetEarthObservationTypeFromRdf(rdf, series, "");
        }
        public static XmlReader CreateReader(this Terradue.ServiceModel.Ogc.Eop21.EarthObservationType eop)
        {
            XmlSerializer           ser = GetXmlSerializerFromType(eop.GetType());
            XmlSerializerNamespaces ns  = GetXmlSerializerNamespacesFromType(eop.GetType());

            MemoryStream ms = new MemoryStream();

            XmlWriter xw = XmlWriter.Create(ms);

            ser.Serialize(xw, eop, ns);

            ms.Seek(0, SeekOrigin.Begin);

            return(XmlReader.Create(ms, xmlReaderSettings));
        }
Beispiel #4
0
        AtomItem CreateItemFromLink(string key, Uri url, bool withOrbits)
        {
            string identifier = key.Replace(".EOF", "");
            Match  match      = Regex.Match(identifier,
                                            @"^(?'mission'\w{3})_OPER_AUX_(?'type'\w{6})_(?'system'\w{4})_(?'proddate'\w{15})_V(?'startdate'\w{15})_(?'stopdate'\w{15})$");

            if (!match.Success)
            {
                return(null);
            }

            AtomItem item = new AtomItem(identifier, string.Format("{0} {1} {2} {3}", match.Groups["mission"].Value,
                                                                   match.Groups["type"].Value,
                                                                   match.Groups["startdate"].Value,
                                                                   match.Groups["stopdate"].Value),
                                         url,
                                         identifier,
                                         DateTimeOffset.ParseExact(match.Groups["proddate"].Value, "yyyyMMddTHHmmss", CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal).ToUniversalTime());

            DateTime start = DateTime.ParseExact(match.Groups["startdate"].Value, "yyyyMMddTHHmmss", CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal).ToUniversalTime();
            DateTime stop  = DateTime.ParseExact(match.Groups["stopdate"].Value, "yyyyMMddTHHmmss", CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal).ToUniversalTime();

            item.Identifier  = identifier;
            item.PublishDate = DateTimeOffset.ParseExact(match.Groups["proddate"].Value, "yyyyMMddTHHmmss", CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal).ToUniversalTime();
            item.Links.Add(SyndicationLink.CreateMediaEnclosureLink(url, "application/xml", 0));
            item.ElementExtensions.Add("polygon", "http://www.georss.org/georss", "-90 -180 -90 180 90 180 90 -180 -90 -180");
            item.ElementExtensions.Add("date", "http://purl.org/dc/elements/1.1/", string.Format("{0}/{1}", start.ToString("O"), stop.ToString("O")));

            Terradue.ServiceModel.Ogc.Eop21.EarthObservationType eo = OrbToEo(identifier, match.Groups["mission"].Value, match.Groups["type"].Value, start, stop, item.PublishDate);
            if (eo != null)
            {
                log.DebugFormat("EOP extension created from {0}", url);
                item.ElementExtensions.Add(eo.CreateReader());
            }

            if (withOrbits)
            {
                var request = HttpWebRequest.Create(url);

                using (var response = request.GetResponse())
                {
                    Terradue.OpenSearch.Sentinel.Data.Earth_Explorer_File eefile = (Terradue.OpenSearch.Sentinel.Data.Earth_Explorer_File)eeser.Deserialize(response.GetResponseStream());
                    item.ElementExtensions.Add(GenerateOrbitsExtension(eefile));
                }
            }

            return(item);
        }
Beispiel #5
0
 public static Func <IOpenSearchResultItem, bool> GetArchivingStatusValidator(Terradue.ServiceModel.Ogc.Eop21.StatusSubTypeValueEnumerationType st)
 {
     return((IOpenSearchResultItem item)
            =>
     {
         try
         {
             Terradue.ServiceModel.Ogc.Eop21.EarthObservationType eop = (Terradue.ServiceModel.Ogc.Eop21.EarthObservationType)item.GetEarthObservationProfile();
             if (eop.EopMetaDataProperty.EarthObservationMetaData.statusSubTypeSpecified)
             {
                 return eop.EopMetaDataProperty.EarthObservationMetaData.statusSubType == st;
             }
         }
         catch
         {
         }
         return st == Terradue.ServiceModel.Ogc.Eop21.StatusSubTypeValueEnumerationType.ONLINE;
     });
 }
Beispiel #6
0
        public static Terradue.ServiceModel.Ogc.Eop21.EarthObservationType OrbToEo(string identifier, string mission, string type, DateTime start, DateTime stop, DateTimeOffset published)
        {
            Terradue.ServiceModel.Ogc.Eop21.EarthObservationType eo = new Terradue.ServiceModel.Ogc.Eop21.EarthObservationType();

            eo.EopMetaDataProperty = new Terradue.ServiceModel.Ogc.Eop21.EarthObservationMetaDataPropertyType();
            eo.EopMetaDataProperty.EarthObservationMetaData            = new Terradue.ServiceModel.Ogc.Eop21.EarthObservationMetaDataType();
            eo.EopMetaDataProperty.EarthObservationMetaData.identifier = identifier;

            eo.procedure = new Terradue.ServiceModel.Ogc.Om20.OM_ProcessPropertyType();
            eo.procedure.Eop21EarthObservationEquipment                                         = new Terradue.ServiceModel.Ogc.Eop21.EarthObservationEquipmentType();
            eo.procedure.Eop21EarthObservationEquipment.platform                                = new Terradue.ServiceModel.Ogc.Eop21.PlatformPropertyType();
            eo.procedure.Eop21EarthObservationEquipment.platform.Platform                       = new Terradue.ServiceModel.Ogc.Eop21.PlatformType();
            eo.procedure.Eop21EarthObservationEquipment.platform.Platform.shortName             = mission;
            eo.procedure.Eop21EarthObservationEquipment.platform.Platform.orbitType             = Terradue.ServiceModel.Ogc.Eop21.OrbitTypeValueType.LEO;
            eo.EopMetaDataProperty.EarthObservationMetaData.acquisitionType                     = Terradue.ServiceModel.Ogc.Eop21.AcquisitionTypeValueType.NOMINAL;
            eo.EopMetaDataProperty.EarthObservationMetaData.productType                         = type;
            eo.EopMetaDataProperty.EarthObservationMetaData.processing                          = new Terradue.ServiceModel.Ogc.Eop21.ProcessingInformationPropertyType[1];
            eo.EopMetaDataProperty.EarthObservationMetaData.processing[0]                       = new Terradue.ServiceModel.Ogc.Eop21.ProcessingInformationPropertyType();
            eo.EopMetaDataProperty.EarthObservationMetaData.processing[0].ProcessingInformation = new Terradue.ServiceModel.Ogc.Eop21.ProcessingInformationType();
            eo.EopMetaDataProperty.EarthObservationMetaData.processing[0].ProcessingInformation.processingCenter      = new ServiceModel.Ogc.Gml321.CodeListType();
            eo.EopMetaDataProperty.EarthObservationMetaData.processing[0].ProcessingInformation.processingCenter.Text = "POD";
            eo.EopMetaDataProperty.EarthObservationMetaData.processing[0].ProcessingInformation.processingDate        = published.DateTime;

            eo.phenomenonTime = new Terradue.ServiceModel.Ogc.Om20.TimeObjectPropertyType();
            eo.phenomenonTime.GmlTimePeriod = new Terradue.ServiceModel.Ogc.Gml321.TimePeriodType();
            if (start != null)
            {
                eo.phenomenonTime.GmlTimePeriod.beginPosition       = new Terradue.ServiceModel.Ogc.Gml321.TimePositionType();
                eo.phenomenonTime.GmlTimePeriod.beginPosition.Value = start.ToString("O");
            }
            if (stop != null)
            {
                eo.phenomenonTime.GmlTimePeriod.endPosition       = new Terradue.ServiceModel.Ogc.Gml321.TimePositionType();
                eo.phenomenonTime.GmlTimePeriod.endPosition.Value = stop.ToString("O");
            }



            return(eo);
        }
        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.Eop21.EarthObservationType OrbToEo(string identifier, string mission, string type, DateTime start, DateTime stop, DateTimeOffset published)
        {
            Terradue.ServiceModel.Ogc.Eop21.EarthObservationType eo = new Terradue.ServiceModel.Ogc.Eop21.EarthObservationType();

            eo.EopMetaDataProperty = new Terradue.ServiceModel.Ogc.Eop21.EarthObservationMetaDataPropertyType();
            eo.EopMetaDataProperty.EarthObservationMetaData = new Terradue.ServiceModel.Ogc.Eop21.EarthObservationMetaDataType();
            eo.EopMetaDataProperty.EarthObservationMetaData.identifier = identifier;

            eo.procedure = new Terradue.ServiceModel.Ogc.Om.OM_ProcessPropertyType();
            eo.procedure.Eop21EarthObservationEquipment = new Terradue.ServiceModel.Ogc.Eop21.EarthObservationEquipmentType();
            eo.procedure.Eop21EarthObservationEquipment.platform = new Terradue.ServiceModel.Ogc.Eop21.PlatformPropertyType();
            eo.procedure.Eop21EarthObservationEquipment.platform.Platform = new Terradue.ServiceModel.Ogc.Eop21.PlatformType();
            eo.procedure.Eop21EarthObservationEquipment.platform.Platform.shortName = mission;
            eo.procedure.Eop21EarthObservationEquipment.platform.Platform.orbitType = Terradue.ServiceModel.Ogc.Eop21.OrbitTypeValueType.LEO;
            eo.EopMetaDataProperty.EarthObservationMetaData.acquisitionType = Terradue.ServiceModel.Ogc.Eop21.AcquisitionTypeValueType.NOMINAL;
            eo.EopMetaDataProperty.EarthObservationMetaData.productType = type;
            eo.EopMetaDataProperty.EarthObservationMetaData.processing = new Terradue.ServiceModel.Ogc.Eop21.ProcessingInformationPropertyType[1];
            eo.EopMetaDataProperty.EarthObservationMetaData.processing[0] = new Terradue.ServiceModel.Ogc.Eop21.ProcessingInformationPropertyType();
            eo.EopMetaDataProperty.EarthObservationMetaData.processing[0].ProcessingInformation = new Terradue.ServiceModel.Ogc.Eop21.ProcessingInformationType();
            eo.EopMetaDataProperty.EarthObservationMetaData.processing[0].ProcessingInformation.processingCenter = new ServiceModel.Ogc.Gml321.CodeListType();
            eo.EopMetaDataProperty.EarthObservationMetaData.processing[0].ProcessingInformation.processingCenter.Text = "POD";
            eo.EopMetaDataProperty.EarthObservationMetaData.processing[0].ProcessingInformation.processingDate = published.DateTime;

            eo.phenomenonTime = new Terradue.ServiceModel.Ogc.Om.TimeObjectPropertyType();
            eo.phenomenonTime.GmlTimePeriod = new Terradue.ServiceModel.Ogc.Gml321.TimePeriodType();
            if (start != null)
            {
                eo.phenomenonTime.GmlTimePeriod.beginPosition = new Terradue.ServiceModel.Ogc.Gml321.TimePositionType();
                eo.phenomenonTime.GmlTimePeriod.beginPosition.Value = start.ToString("O");
            }
            if (stop != null)
            {
                eo.phenomenonTime.GmlTimePeriod.endPosition = new Terradue.ServiceModel.Ogc.Gml321.TimePositionType();
                eo.phenomenonTime.GmlTimePeriod.endPosition.Value = stop.ToString("O");
            }

            return eo;
        }
        private void QueryEarthObservationResult(ref IOpenSearchResultCollection osr)
        {
            foreach (var item in osr.Items)
            {
                log.DebugFormat("Searching for alternate link to metadata URL for item {0}", item.Identifier);

                var altlink = item.Links.FirstOrDefault(l => l.RelationshipType == "via" && l.Title == "Original source metadata");

                string identifier = null;

                if (altlink != null)
                {
                    log.DebugFormat("Link found at {0}", altlink.Uri);
                    var req = HttpWebRequest.Create(altlink.Uri);
                    log.DebugFormat("Query {0}...", altlink.Uri);
                    var response = req.GetResponse();
                    using (var xr = XmlReader.Create(response.GetResponseStream()))
                    {
                        while (xr.Read())
                        {
                            if (xr.LocalName == "scene" && xr.NamespaceURI == "http://earthexplorer.usgs.gov/eemetadata.xsd")
                            {
                                log.DebugFormat("Found scene metadata, harvesting {0} ...", altlink.Uri);
                                Terradue.OpenSearch.Model.Schemas.EarthExplorer.scene eescene = (Terradue.OpenSearch.Model.Schemas.EarthExplorer.scene)eeSer.Deserialize(xr);
                                Terradue.ServiceModel.Ogc.Eop21.EarthObservationType  eo      = EarthExplorerToEo(eescene);
                                AddIMGOffering(eo, item);
                                if (eo != null)
                                {
                                    log.DebugFormat("EOP extension created from {0}", altlink.Uri);
                                    item.ElementExtensions.Add(eo.CreateReader());
                                    identifier = eo.EopMetaDataProperty.EarthObservationMetaData.identifier;
                                    item.Title = new ServiceModel.Syndication.TextSyndicationContent(
                                        string.Format("{0}, {1}, Path: {2}, Row: {3}",
                                                      identifier,
                                                      DateTime.Parse(eo.phenomenonTime.GmlTimePeriod.beginPosition.Value).ToString("yy-MMM-dd hh:mm:ss"),
                                                      eo.procedure.Eop21EarthObservationEquipment.acquisitionParameters.Acquisition.wrsLongitudeGrid.Value,
                                                      eo.procedure.Eop21EarthObservationEquipment.acquisitionParameters.Acquisition.wrsLatitudeGrid.Value
                                                      ));
                                }
                                continue;
                            }
                        }
                    }
                }

                var identifierext = item.ElementExtensions.FirstOrDefault(e => e.OuterName == "identifier" && e.OuterNamespace == "http://purl.org/dc/elements/1.1/");
                if (identifier == null)
                {
                    UriBuilder          url = new UriBuilder(identifierext.GetObject <string>());
                    NameValueCollection nvc = System.Web.HttpUtility.ParseQueryString(url.Query);
                    identifier = nvc["uid"];
                    if (identifier.Contains(":"))
                    {
                        identifier = identifier.Split(':')[1];
                    }
                }
                item.ElementExtensions.Remove(identifierext);
                item.ElementExtensions.Add("identifier", "http://purl.org/dc/elements/1.1/", identifier);
                identifierext = item.ElementExtensions.FirstOrDefault(e => e.OuterName == "identifier" && e.OuterNamespace == "http://purl.org/dc/terms/");
                item.ElementExtensions.Remove(identifierext);
            }
        }