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 : * Permission is hereby granted, free of charge, to any person obtaining a
12 : * copy of this software and associated documentation files (the "Software"),
13 : * to deal in the Software without restriction, including without limitation
14 : * the rights to use, copy, modify, merge, publish, distribute, sublicense,
15 : * and/or sell copies of the Software, and to permit persons to whom the
16 : * Software is furnished to do so, subject to the following conditions:
17 : *
18 : * The above copyright notice and this permission notice shall be included
19 : * in all copies or substantial portions of the Software.
20 : *
21 : * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
22 : * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
23 : * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
24 : * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
25 : * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
26 : * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
27 : * DEALINGS IN THE SOFTWARE.
28 : ****************************************************************************/
29 :
30 : #include "reader_rapid_eye.h"
31 :
32 : #include <ctime>
33 :
34 : #include "cpl_conv.h"
35 : #include "cpl_error.h"
36 : #include "cpl_minixml.h"
37 : #include "cpl_string.h"
38 : #include "cpl_time.h"
39 :
40 : /**
41 : * GDALMDReaderRapidEye()
42 : */
43 5027 : GDALMDReaderRapidEye::GDALMDReaderRapidEye(const char *pszPath,
44 5027 : char **papszSiblingFiles)
45 5027 : : GDALMDReaderBase(pszPath, papszSiblingFiles)
46 : {
47 5027 : const char *pszDirName = CPLGetDirname(pszPath);
48 5027 : const char *pszBaseName = CPLGetBasename(pszPath);
49 :
50 : std::string osIMDSourceFilename = CPLFormFilename(
51 10054 : pszDirName, CPLSPrintf("%s_metadata", pszBaseName), "xml");
52 5027 : if (CPLCheckForFile(&osIMDSourceFilename[0], papszSiblingFiles))
53 : {
54 1 : m_osXMLSourceFilename = std::move(osIMDSourceFilename);
55 : }
56 : else
57 : {
58 : osIMDSourceFilename = CPLFormFilename(
59 5026 : pszDirName, CPLSPrintf("%s_METADATA", pszBaseName), "XML");
60 5026 : if (CPLCheckForFile(&osIMDSourceFilename[0], papszSiblingFiles))
61 : {
62 0 : m_osXMLSourceFilename = std::move(osIMDSourceFilename);
63 : }
64 : }
65 :
66 5027 : if (!m_osXMLSourceFilename.empty())
67 1 : CPLDebug("MDReaderRapidEye", "XML Filename: %s",
68 : m_osXMLSourceFilename.c_str());
69 5027 : }
70 :
71 : /**
72 : * ~GDALMDReaderRapidEye()
73 : */
74 10054 : GDALMDReaderRapidEye::~GDALMDReaderRapidEye()
75 : {
76 10054 : }
77 :
78 : /**
79 : * HasRequiredFiles()
80 : */
81 5027 : bool GDALMDReaderRapidEye::HasRequiredFiles() const
82 : {
83 : // check re:EarthObservation
84 5028 : if (!m_osXMLSourceFilename.empty() &&
85 1 : GDALCheckFileHeader(m_osXMLSourceFilename, "re:EarthObservation"))
86 1 : return true;
87 :
88 5026 : return false;
89 : }
90 :
91 : /**
92 : * GetMetadataFiles()
93 : */
94 1 : char **GDALMDReaderRapidEye::GetMetadataFiles() const
95 : {
96 1 : char **papszFileList = nullptr;
97 1 : if (!m_osXMLSourceFilename.empty())
98 1 : papszFileList = CSLAddString(papszFileList, m_osXMLSourceFilename);
99 :
100 1 : return papszFileList;
101 : }
102 :
103 : /**
104 : * LoadMetadata()
105 : */
106 2 : void GDALMDReaderRapidEye::LoadMetadata()
107 : {
108 2 : if (m_bIsMetadataLoad)
109 1 : return;
110 :
111 1 : CPLXMLNode *psNode = CPLParseXMLFile(m_osXMLSourceFilename);
112 :
113 1 : if (psNode != nullptr)
114 : {
115 : CPLXMLNode *pRootNode =
116 1 : CPLSearchXMLNode(psNode, "=re:EarthObservation");
117 :
118 1 : if (pRootNode != nullptr)
119 : {
120 1 : m_papszIMDMD = ReadXMLToList(pRootNode->psChild, m_papszIMDMD);
121 : }
122 1 : CPLDestroyXMLNode(psNode);
123 : }
124 :
125 1 : m_papszDEFAULTMD = CSLAddNameValue(m_papszDEFAULTMD, MD_NAME_MDTYPE, "RE");
126 :
127 1 : m_bIsMetadataLoad = true;
128 :
129 1 : if (nullptr == m_papszIMDMD)
130 : {
131 0 : return;
132 : }
133 :
134 : // extract imagery metadata
135 2 : const char *pszSatId = CSLFetchNameValue(
136 1 : m_papszIMDMD, "gml:using.eop:EarthObservationEquipment.eop:platform."
137 : "eop:Platform.eop:serialIdentifier");
138 1 : if (nullptr != pszSatId)
139 : {
140 1 : m_papszIMAGERYMD = CSLAddNameValue(m_papszIMAGERYMD, MD_NAME_SATELLITE,
141 2 : CPLStripQuotes(pszSatId));
142 : }
143 :
144 2 : const char *pszDateTime = CSLFetchNameValue(
145 1 : m_papszIMDMD,
146 : "gml:using.eop:EarthObservationEquipment.eop:acquisitionParameters.re:"
147 : "Acquisition.re:acquisitionDateTime");
148 1 : if (nullptr != pszDateTime)
149 : {
150 : char buffer[80];
151 1 : GIntBig timeMid = GetAcquisitionTimeFromString(pszDateTime);
152 : struct tm tmBuf;
153 1 : strftime(buffer, 80, MD_DATETIMEFORMAT,
154 1 : CPLUnixTimeToYMDHMS(timeMid, &tmBuf));
155 1 : m_papszIMAGERYMD =
156 1 : CSLAddNameValue(m_papszIMAGERYMD, MD_NAME_ACQDATETIME, buffer);
157 : }
158 :
159 2 : const char *pszCC = CSLFetchNameValue(
160 1 : m_papszIMDMD,
161 : "gml:resultOf.re:EarthObservationResult.opt:cloudCoverPercentage");
162 1 : if (nullptr != pszSatId)
163 : {
164 1 : m_papszIMAGERYMD =
165 1 : CSLAddNameValue(m_papszIMAGERYMD, MD_NAME_CLOUDCOVER, pszCC);
166 : }
167 : }
|