bool FGdbDataSource::OpenFGDBTables(const std::wstring &type, const std::vector<std::wstring> &layers) { fgdbError hr; for ( unsigned int i = 0; i < layers.size(); i++ ) { Table* pTable = new Table; //CPLDebug("FGDB", "Opening %s", WStringToString(layers[i]).c_str()); if (FAILED(hr = m_pGeodatabase->OpenTable(layers[i], *pTable))) { delete pTable; GDBErr(hr, "Error opening " + WStringToString(layers[i]), CE_Warning, ". Skipping it. " "Might be due to unsupported spatial reference system. Using OpenFileGDB driver should solve it"); continue; } FGdbLayer* pLayer = new FGdbLayer(); if (!pLayer->Initialize(this, pTable, layers[i], type)) { delete pLayer; return GDBErr(hr, "Error initializing OGRLayer for " + WStringToString(layers[i])); } m_layers.push_back(pLayer); } return true; }
bool FGdbDataSource::OpenFGDBTables(const std::wstring &type, const std::vector<std::wstring> &layers) { fgdbError hr; for ( unsigned int i = 0; i < layers.size(); i++ ) { Table* pTable = new Table; //CPLDebug("FGDB", "Opening %s", WStringToString(layers[i]).c_str()); if (FAILED(hr = m_pGeodatabase->OpenTable(layers[i], *pTable))) { delete pTable; GDBDebug(hr, "Error opening " + WStringToString(layers[i]) + ". Skipping it"); continue; } FGdbLayer* pLayer = new FGdbLayer; if (!pLayer->Initialize(this, pTable, layers[i], type)) { delete pLayer; return GDBErr(hr, "Error initializing OGRLayer for " + WStringToString(layers[i])); } m_layers.push_back(pLayer); } return true; }
bool FGdbDataSource::OpenFGDBTables(const std::wstring &type, const std::vector<std::wstring> &layers) { fgdbError hr; for ( unsigned int i = 0; i < layers.size(); i++ ) { Table* pTable = new Table; //CPLDebug("FGDB", "Opening %s", WStringToString(layers[i]).c_str()); if (FAILED(hr = m_pGeodatabase->OpenTable(layers[i], *pTable))) { delete pTable; std::wstring fgdb_error_desc_w; fgdbError er; er = FileGDBAPI::ErrorInfo::GetErrorDescription(hr, fgdb_error_desc_w); const char* pszLikelyReason = "Might be due to unsupported spatial reference system. Using OpenFileGDB driver or FileGDB SDK >= 1.4 should solve it"; if ( er == S_OK ) { std::string fgdb_error_desc = WStringToString(fgdb_error_desc_w); if( fgdb_error_desc == "FileGDB compression is not installed." ) { pszLikelyReason = "Using FileGDB SDK 1.4 or later should solve this issue."; } } GDBErr(hr, "Error opening " + WStringToString(layers[i]), CE_Warning, (". Skipping it. " + CPLString(pszLikelyReason)).c_str()); continue; } FGdbLayer* pLayer = new FGdbLayer(); if (!pLayer->Initialize(this, pTable, layers[i], type)) { delete pLayer; return GDBErr(hr, "Error initializing OGRLayer for " + WStringToString(layers[i])); } m_layers.push_back(pLayer); } return true; }
// Flattens out hierarchichal GDB structure bool FGdbDataSource::LoadLayersOld(const std::vector<wstring> & datasetTypes, const wstring & parent) { long hr = S_OK; // I didn't find an API to give me the type of the dataset based on name - I am *not* // parsing XML for something like this - in the meantime I can use this hack to see // if the dataset had any children whatsoever - if so, then I won't attempt to open it // otherwise, do attempt to do that bool childrenFound = false; bool errorsEncountered = false; for (size_t dsTypeIndex = 0; dsTypeIndex < datasetTypes.size(); dsTypeIndex++) { std::vector<wstring> childDatasets; m_pGeodatabase->GetChildDatasets( parent, datasetTypes[dsTypeIndex], childDatasets); if (childDatasets.size() > 0) { //it is a container of other datasets for (size_t childDatasetIndex = 0; childDatasetIndex < childDatasets.size(); childDatasetIndex++) { childrenFound = true; // do something with it // For now, we just ignore dataset containers and only open the children //std::wcout << datasetTypes[dsTypeIndex] << L" " << childDatasets[childDatasetIndex] << std::endl; if (!LoadLayersOld(datasetTypes, childDatasets[childDatasetIndex])) errorsEncountered = true; } } } //it is a full fledged dataset itself without children - open it (except the root) if ((!childrenFound) && parent != L"\\") { //wcout << "Opening " << parent << "..."; Table* pTable = new Table; if (FAILED(hr = m_pGeodatabase->OpenTable(parent,*pTable))) { delete pTable; return GDBErr(hr, "Error opening " + WStringToString(parent)); } FGdbLayer* pLayer = new FGdbLayer; //pLayer has ownership of the table pointer as soon Initialize is called if (!pLayer->Initialize(this, pTable, parent)) { delete pLayer; return GDBErr(hr, "Error initializing OGRLayer for " + WStringToString(parent)); } m_layers.push_back(pLayer); } return !errorsEncountered; }