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 5376 : GDALMDReaderOrbView::GDALMDReaderOrbView(const char *pszPath, 30 5376 : char **papszSiblingFiles) 31 : : GDALMDReaderBase(pszPath, papszSiblingFiles), 32 : m_osIMDSourceFilename( 33 : GDALFindAssociatedFile(pszPath, "PVL", papszSiblingFiles, 0)), 34 5376 : m_osRPBSourceFilename(CPLString()) 35 : { 36 10752 : const std::string osBaseName = CPLGetBasenameSafe(pszPath); 37 10752 : const std::string osDirName = CPLGetDirnameSafe(pszPath); 38 : 39 : std::string osRPBSourceFilename = CPLFormFilenameSafe( 40 10752 : osDirName.c_str(), (osBaseName + "_rpc").c_str(), "txt"); 41 5376 : if (CPLCheckForFile(&osRPBSourceFilename[0], papszSiblingFiles)) 42 : { 43 13 : m_osRPBSourceFilename = std::move(osRPBSourceFilename); 44 : } 45 : else 46 : { 47 10726 : osRPBSourceFilename = CPLFormFilenameSafe( 48 16089 : osDirName.c_str(), (osBaseName + "_RPC").c_str(), "TXT"); 49 5363 : if (CPLCheckForFile(&osRPBSourceFilename[0], papszSiblingFiles)) 50 : { 51 0 : m_osRPBSourceFilename = std::move(osRPBSourceFilename); 52 : } 53 : } 54 : 55 5376 : if (!m_osIMDSourceFilename.empty()) 56 1 : CPLDebug("MDReaderOrbView", "IMD Filename: %s", 57 : m_osIMDSourceFilename.c_str()); 58 5376 : if (!m_osRPBSourceFilename.empty()) 59 13 : CPLDebug("MDReaderOrbView", "RPB Filename: %s", 60 : m_osRPBSourceFilename.c_str()); 61 5376 : } 62 : 63 : /** 64 : * ~GDALMDReaderOrbView() 65 : */ 66 10752 : GDALMDReaderOrbView::~GDALMDReaderOrbView() 67 : { 68 10752 : } 69 : 70 : /** 71 : * HasRequiredFiles() 72 : */ 73 5376 : bool GDALMDReaderOrbView::HasRequiredFiles() const 74 : { 75 5376 : if (!m_osIMDSourceFilename.empty() && !m_osRPBSourceFilename.empty()) 76 1 : return true; 77 : 78 5375 : 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 : }