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