//************************************************************************************************* //! Loads all SRS CSV files specified in the ossim prefs //************************************************************************************************* void ossimWktProjectionFactory::loadRecords() const { // Fetch filename of WKT projection DB file specified in ossim_preferences: ossimFilename db_name = ossimPreferences::instance()->preferencesKWL().find("wkt_database_file"); if (!db_name.isReadable()) return; // Create only once outside the loop: ossimString format_id; ossimString line; // Open the DB file: std::ifstream db_stream(db_name.chars()); bool good_file = false; if (db_stream.good()) { // Format specification implied in file's magic number: std::getline(db_stream, format_id.string()); format_id.trim(); if (format_id == WKT_MAGIC) good_file = true; } if (!good_file) { ossimNotify(ossimNotifyLevel_WARN) << "ossimWktProjectionDatabase::loadRecords() -- Encountered bad WKT database file <" << db_name << ">. Skipping this file." << endl; db_stream.close(); return; } // The file is good. Skip over the column descriptor line: std::getline(db_stream, line.string()); // Loop to read all data records: while (!db_stream.eof()) { std::getline(db_stream, line.string()); std::vector<ossimString> csvRecord = line.explode(","); // ONLY CSV FILES CONSIDERED HERE if (csvRecord.size()) { std::pair<std::string, ossim_uint32> projRecord; projRecord.first = csvRecord[1].string(); projRecord.second = csvRecord[0].toUInt32(); m_wktProjRecords.insert(projRecord); } } // for ( std::map<ossimString, ossim_uint32>::const_iterator it = m_wktProjRecords.begin(); // it != m_wktProjRecords.end(); it++) // cout << "[" << it->first << ", " << it->second << "]"<<endl; db_stream.close(); }
//************************************************************************************************* //! Constructor loads all SRS CSV files specified in the ossim prefs //************************************************************************************************* ossimWktProjectionFactory::ossimWktProjectionFactory() { // Fetch filename of WKT projection DB file specified in ossim_preferences: ossimFilename db_name = ossimPreferences::instance()->preferencesKWL().find("wkt_database_file"); if (!db_name.isReadable()) return; // Create only once outside the loop: ossimString format_id; ossimString line; // Open the DB file: std::ifstream db_stream (db_name.chars()); bool good_file = false; if (db_stream.good()) { // Format specification implied in file's magic number: std::getline(db_stream, format_id.string()); format_id.trim(); if (format_id == WKT_MAGIC) good_file = true; } if (!good_file) { ossimNotify(ossimNotifyLevel_WARN)<<"ossimWktProjectionDatabase Constructor -- " "Encountered bad WKT database file <"<<db_name<<">. Skipping this file."<<endl; db_stream.close(); return; } // The file is good. Skip over the column descriptor line: std::getline(db_stream, line.string()); // Loop to read all data records: while (!db_stream.eof()) { ossimRefPtr<WktProjRecord> db_record = new WktProjRecord; std::getline(db_stream, line.string()); std::vector<ossimString> csvRecord = line.explode(","); // ONLY CSV FILES CONSIDERED HERE if (csvRecord.size()) { db_record->epsgCode = csvRecord[0].toUInt32(); db_record->wktString = csvRecord[1]; m_wktProjRecords.push_back(db_record); } } db_stream.close(); }
//************************************************************************************************* //! Populates the database with contents of DB files as specified in ossim_preferences. //************************************************************************************************* void ossimEpsgProjectionDatabase::initialize() { // Fetch filenames of all projection DB files specified in ossim_preferences: ossimString regEx = ossimString("^epsg_database_file[0-9]+"); vector<ossimString> keys = ossimPreferences::instance()->preferencesKWL().getSubstringKeyList(regEx); vector<ossimString>::const_iterator i = keys.begin(); // Create only once outside the loop: ossimFilename db_name; ossimString group_id; ossimString format_id; ossimString line; // Loop over each file and read contents into memory: while ( i != keys.end() ) { db_name = ossimPreferences::instance()->preferencesKWL().find( (*i).c_str() ); ++i; if (!db_name.isReadable()) continue; // Open the DB file: std::ifstream db_stream (db_name.chars()); bool good_file = false; if (db_stream.good()) { // Format specification implied in file's magic number: getline(db_stream, format_id.string()); format_id.trim(); if ((format_id == EPSG_DB_FORMAT_A) || (format_id == STATE_PLANE_FORMAT_B) || (format_id == SPCS_EPSG_MAP_FORMAT_C) || (format_id == WKT_PCS_FORMAT_D)) good_file = true; } if (!good_file) { ossimNotify(ossimNotifyLevel_WARN)<<"ossimEpsgProjectionDatabase::initialize() -- " "Encountered bad database file <"<<db_name<<">. Skipping this file."<<endl; db_stream.close(); continue; } // The file is good. Skip over the column descriptor line: getline(db_stream, line.string()); // Loop to read all data records: while (!db_stream.eof()) { ossimRefPtr<ProjDbRecord> db_record = new ProjDbRecord; std::getline(db_stream, line.string()); db_record->csvRecord = line.explode(","); // ONLY CSV FILES CONSIDERED HERE if (db_record->csvRecord.size()) { ossimRefPtr<ossimMapProjection> proj; // Check if primary EPSG database format A: if (format_id == EPSG_DB_FORMAT_A) { db_record->code = db_record->csvRecord[A_CODE].toUInt32(); db_record->name = db_record->csvRecord[A_NAME]; db_record->csvFormat = FORMAT_A; } // Check if State Plane (subset of EPSG but handled differently until projection // geotrans-EPSG disconnect is resolved. else if (format_id == STATE_PLANE_FORMAT_B) { db_record->code = db_record->csvRecord[B_CODE].toUInt32(); db_record->name = db_record->csvRecord[B_NAME]; db_record->csvFormat = FORMAT_B; } // This format is for Ming-special State Plane Coordinate System coded format. // This format is simply a mapping from SPCS spec name (OSSIM-specific) to EPSG code. // Note that no proj is instantiated and no KWL is populated. Only name and EPSG mapped // code is saved. else if (format_id == SPCS_EPSG_MAP_FORMAT_C) { db_record->code = db_record->csvRecord[C_CODE].toUInt32(); db_record->name = db_record->csvRecord[C_NAME]; db_record->csvFormat = FORMAT_C; } // This format is for alternate projection naming scheme database CSV file format. // WKT_PCS coding is an alternate naming scheme that maps to EPSG. // Note that no proj is instantiated and no KWL is populated. Only name and EPSG mapped // code is saved. else if (format_id == WKT_PCS_FORMAT_D) { db_record->code = db_record->csvRecord[D_CODE].toUInt32(); db_record->name = db_record->csvRecord[D_NAME]; db_record->csvFormat = FORMAT_D; } m_projDatabase.insert(make_pair(db_record->code, db_record)); } } db_stream.close(); } // end of while loop over all DB files }