Line data Source code
1 : /******************************************************************************
2 : *
3 : * Project: GDAL Core
4 : * Purpose: Read metadata from OrbView 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 "cpl_port.h"
31 : #include "reader_orb_view.h"
32 :
33 : #include <ctime>
34 :
35 : #include "cpl_conv.h"
36 : #include "cpl_error.h"
37 : #include "cpl_string.h"
38 : #include "cpl_time.h"
39 :
40 : #include "gdal_priv.h"
41 :
42 : /**
43 : * GDALMDReaderOrbView()
44 : */
45 5057 : GDALMDReaderOrbView::GDALMDReaderOrbView(const char *pszPath,
46 5057 : char **papszSiblingFiles)
47 : : GDALMDReaderBase(pszPath, papszSiblingFiles),
48 : m_osIMDSourceFilename(
49 : GDALFindAssociatedFile(pszPath, "PVL", papszSiblingFiles, 0)),
50 5057 : m_osRPBSourceFilename(CPLString())
51 : {
52 5057 : const char *pszBaseName = CPLGetBasename(pszPath);
53 5057 : const char *pszDirName = CPLGetDirname(pszPath);
54 :
55 : std::string osRPBSourceFilename =
56 10114 : CPLFormFilename(pszDirName, CPLSPrintf("%s_rpc", pszBaseName), "txt");
57 5057 : if (CPLCheckForFile(&osRPBSourceFilename[0], papszSiblingFiles))
58 : {
59 13 : m_osRPBSourceFilename = std::move(osRPBSourceFilename);
60 : }
61 : else
62 : {
63 : osRPBSourceFilename = CPLFormFilename(
64 5044 : pszDirName, CPLSPrintf("%s_RPC", pszBaseName), "TXT");
65 5044 : if (CPLCheckForFile(&osRPBSourceFilename[0], papszSiblingFiles))
66 : {
67 0 : m_osRPBSourceFilename = std::move(osRPBSourceFilename);
68 : }
69 : }
70 :
71 5057 : if (!m_osIMDSourceFilename.empty())
72 1 : CPLDebug("MDReaderOrbView", "IMD Filename: %s",
73 : m_osIMDSourceFilename.c_str());
74 5057 : if (!m_osRPBSourceFilename.empty())
75 13 : CPLDebug("MDReaderOrbView", "RPB Filename: %s",
76 : m_osRPBSourceFilename.c_str());
77 5057 : }
78 :
79 : /**
80 : * ~GDALMDReaderOrbView()
81 : */
82 10114 : GDALMDReaderOrbView::~GDALMDReaderOrbView()
83 : {
84 10114 : }
85 :
86 : /**
87 : * HasRequiredFiles()
88 : */
89 5057 : bool GDALMDReaderOrbView::HasRequiredFiles() const
90 : {
91 5057 : if (!m_osIMDSourceFilename.empty() && !m_osRPBSourceFilename.empty())
92 1 : return true;
93 :
94 5056 : return false;
95 : }
96 :
97 : /**
98 : * GetMetadataFiles()
99 : */
100 1 : char **GDALMDReaderOrbView::GetMetadataFiles() const
101 : {
102 1 : char **papszFileList = nullptr;
103 1 : if (!m_osIMDSourceFilename.empty())
104 1 : papszFileList = CSLAddString(papszFileList, m_osIMDSourceFilename);
105 1 : if (!m_osRPBSourceFilename.empty())
106 1 : papszFileList = CSLAddString(papszFileList, m_osRPBSourceFilename);
107 :
108 1 : return papszFileList;
109 : }
110 :
111 : /**
112 : * LoadMetadata()
113 : */
114 2 : void GDALMDReaderOrbView::LoadMetadata()
115 : {
116 2 : if (m_bIsMetadataLoad)
117 1 : return;
118 :
119 1 : if (!m_osIMDSourceFilename.empty())
120 : {
121 1 : m_papszIMDMD = GDALLoadIMDFile(m_osIMDSourceFilename);
122 : }
123 :
124 1 : if (!m_osRPBSourceFilename.empty())
125 : {
126 1 : m_papszRPCMD = GDALLoadRPCFile(m_osRPBSourceFilename);
127 : }
128 :
129 1 : m_papszDEFAULTMD = CSLAddNameValue(m_papszDEFAULTMD, MD_NAME_MDTYPE, "OV");
130 :
131 1 : m_bIsMetadataLoad = true;
132 :
133 1 : if (nullptr == m_papszIMDMD)
134 : {
135 0 : return;
136 : }
137 :
138 : // extract imagery metadata
139 : const char *pszSatId =
140 1 : CSLFetchNameValue(m_papszIMDMD, "sensorInfo.satelliteName");
141 1 : if (nullptr != pszSatId)
142 : {
143 1 : m_papszIMAGERYMD = CSLAddNameValue(m_papszIMAGERYMD, MD_NAME_SATELLITE,
144 2 : CPLStripQuotes(pszSatId));
145 : }
146 :
147 2 : const char *pszCloudCover = CSLFetchNameValue(
148 1 : m_papszIMDMD, "productInfo.productCloudCoverPercentage");
149 1 : if (nullptr != pszCloudCover)
150 : {
151 1 : m_papszIMAGERYMD = CSLAddNameValue(m_papszIMAGERYMD, MD_NAME_CLOUDCOVER,
152 : pszCloudCover);
153 : }
154 :
155 2 : const char *pszDateTime = CSLFetchNameValue(
156 1 : m_papszIMDMD, "inputImageInfo.firstLineAcquisitionDateTime");
157 :
158 1 : if (nullptr != pszDateTime)
159 : {
160 : char buffer[80];
161 1 : GIntBig timeMid = GetAcquisitionTimeFromString(pszDateTime);
162 : struct tm tmBuf;
163 1 : strftime(buffer, 80, MD_DATETIMEFORMAT,
164 1 : CPLUnixTimeToYMDHMS(timeMid, &tmBuf));
165 1 : m_papszIMAGERYMD =
166 1 : CSLAddNameValue(m_papszIMAGERYMD, MD_NAME_ACQDATETIME, buffer);
167 : }
168 : }
|