Line data Source code
1 : /****************************************************************************** 2 : * 3 : * Project: GDAL Core 4 : * Purpose: Read metadata from RapidEye imagery. 5 : * Author: Alexander Lisovenko 6 : * Author: Dmitry Baryshnikov, polimax@mail.ru 7 : * 8 : ****************************************************************************** 9 : * Copyright (c) 2014-2015 NextGIS <info@nextgis.ru> 10 : * 11 : * SPDX-License-Identifier: MIT 12 : ****************************************************************************/ 13 : 14 : #include "reader_rapid_eye.h" 15 : 16 : #include <ctime> 17 : 18 : #include "cpl_conv.h" 19 : #include "cpl_error.h" 20 : #include "cpl_minixml.h" 21 : #include "cpl_string.h" 22 : #include "cpl_time.h" 23 : 24 : /** 25 : * GDALMDReaderRapidEye() 26 : */ 27 5083 : GDALMDReaderRapidEye::GDALMDReaderRapidEye(const char *pszPath, 28 5083 : char **papszSiblingFiles) 29 5083 : : GDALMDReaderBase(pszPath, papszSiblingFiles) 30 : { 31 5083 : const char *pszDirName = CPLGetDirname(pszPath); 32 5083 : const char *pszBaseName = CPLGetBasename(pszPath); 33 : 34 : std::string osIMDSourceFilename = CPLFormFilename( 35 10166 : pszDirName, CPLSPrintf("%s_metadata", pszBaseName), "xml"); 36 5083 : if (CPLCheckForFile(&osIMDSourceFilename[0], papszSiblingFiles)) 37 : { 38 1 : m_osXMLSourceFilename = std::move(osIMDSourceFilename); 39 : } 40 : else 41 : { 42 : osIMDSourceFilename = CPLFormFilename( 43 5082 : pszDirName, CPLSPrintf("%s_METADATA", pszBaseName), "XML"); 44 5082 : if (CPLCheckForFile(&osIMDSourceFilename[0], papszSiblingFiles)) 45 : { 46 0 : m_osXMLSourceFilename = std::move(osIMDSourceFilename); 47 : } 48 : } 49 : 50 5083 : if (!m_osXMLSourceFilename.empty()) 51 1 : CPLDebug("MDReaderRapidEye", "XML Filename: %s", 52 : m_osXMLSourceFilename.c_str()); 53 5083 : } 54 : 55 : /** 56 : * ~GDALMDReaderRapidEye() 57 : */ 58 10166 : GDALMDReaderRapidEye::~GDALMDReaderRapidEye() 59 : { 60 10166 : } 61 : 62 : /** 63 : * HasRequiredFiles() 64 : */ 65 5083 : bool GDALMDReaderRapidEye::HasRequiredFiles() const 66 : { 67 : // check re:EarthObservation 68 5084 : if (!m_osXMLSourceFilename.empty() && 69 1 : GDALCheckFileHeader(m_osXMLSourceFilename, "re:EarthObservation")) 70 1 : return true; 71 : 72 5082 : return false; 73 : } 74 : 75 : /** 76 : * GetMetadataFiles() 77 : */ 78 1 : char **GDALMDReaderRapidEye::GetMetadataFiles() const 79 : { 80 1 : char **papszFileList = nullptr; 81 1 : if (!m_osXMLSourceFilename.empty()) 82 1 : papszFileList = CSLAddString(papszFileList, m_osXMLSourceFilename); 83 : 84 1 : return papszFileList; 85 : } 86 : 87 : /** 88 : * LoadMetadata() 89 : */ 90 2 : void GDALMDReaderRapidEye::LoadMetadata() 91 : { 92 2 : if (m_bIsMetadataLoad) 93 1 : return; 94 : 95 1 : CPLXMLNode *psNode = CPLParseXMLFile(m_osXMLSourceFilename); 96 : 97 1 : if (psNode != nullptr) 98 : { 99 : CPLXMLNode *pRootNode = 100 1 : CPLSearchXMLNode(psNode, "=re:EarthObservation"); 101 : 102 1 : if (pRootNode != nullptr) 103 : { 104 1 : m_papszIMDMD = ReadXMLToList(pRootNode->psChild, m_papszIMDMD); 105 : } 106 1 : CPLDestroyXMLNode(psNode); 107 : } 108 : 109 1 : m_papszDEFAULTMD = CSLAddNameValue(m_papszDEFAULTMD, MD_NAME_MDTYPE, "RE"); 110 : 111 1 : m_bIsMetadataLoad = true; 112 : 113 1 : if (nullptr == m_papszIMDMD) 114 : { 115 0 : return; 116 : } 117 : 118 : // extract imagery metadata 119 2 : const char *pszSatId = CSLFetchNameValue( 120 1 : m_papszIMDMD, "gml:using.eop:EarthObservationEquipment.eop:platform." 121 : "eop:Platform.eop:serialIdentifier"); 122 1 : if (nullptr != pszSatId) 123 : { 124 1 : m_papszIMAGERYMD = CSLAddNameValue(m_papszIMAGERYMD, MD_NAME_SATELLITE, 125 2 : CPLStripQuotes(pszSatId)); 126 : } 127 : 128 2 : const char *pszDateTime = CSLFetchNameValue( 129 1 : m_papszIMDMD, 130 : "gml:using.eop:EarthObservationEquipment.eop:acquisitionParameters.re:" 131 : "Acquisition.re:acquisitionDateTime"); 132 1 : if (nullptr != pszDateTime) 133 : { 134 : char buffer[80]; 135 1 : GIntBig timeMid = GetAcquisitionTimeFromString(pszDateTime); 136 : struct tm tmBuf; 137 1 : strftime(buffer, 80, MD_DATETIMEFORMAT, 138 1 : CPLUnixTimeToYMDHMS(timeMid, &tmBuf)); 139 1 : m_papszIMAGERYMD = 140 1 : CSLAddNameValue(m_papszIMAGERYMD, MD_NAME_ACQDATETIME, buffer); 141 : } 142 : 143 2 : const char *pszCC = CSLFetchNameValue( 144 1 : m_papszIMDMD, 145 : "gml:resultOf.re:EarthObservationResult.opt:cloudCoverPercentage"); 146 1 : if (nullptr != pszSatId) 147 : { 148 1 : m_papszIMAGERYMD = 149 1 : CSLAddNameValue(m_papszIMAGERYMD, MD_NAME_CLOUDCOVER, pszCC); 150 : } 151 : }