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)); }
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); }
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; }); }
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); } }