PAuxDataset::~PAuxDataset() { FlushCache(); if( fpImage != NULL ) { if( VSIFCloseL( fpImage ) != 0 ) { CPLError(CE_Failure, CPLE_FileIO, "I/O error"); } } if( bAuxUpdated ) { CSLSetNameValueSeparator( papszAuxLines, ": " ); CSLSave( papszAuxLines, pszAuxFilename ); } CPLFree( pszProjection ); CPLFree( pszGCPProjection ); GDALDeinitGCPs( nGCPCount, pasGCPList ); CPLFree( pasGCPList ); CPLFree( pszAuxFilename ); CSLDestroy( papszAuxLines ); }
int OGRIdrisiLayer::Detect_AVL_ADC(const char* pszFilename) { // -------------------------------------------------------------------- // Look for .adc file // -------------------------------------------------------------------- const char* pszADCFilename = CPLResetExtension(pszFilename, "adc"); VSILFILE* fpADC = VSIFOpenL(pszADCFilename, "rb"); if (fpADC == NULL) { pszADCFilename = CPLResetExtension(pszFilename, "ADC"); fpADC = VSIFOpenL(pszADCFilename, "rb"); } char** papszADC = NULL; if (fpADC != NULL) { VSIFCloseL(fpADC); fpADC = NULL; CPLPushErrorHandler(CPLQuietErrorHandler); papszADC = CSLLoad2(pszADCFilename, 1024, 256, NULL); CPLPopErrorHandler(); CPLErrorReset(); } if (papszADC == NULL) return FALSE; CSLSetNameValueSeparator( papszADC, ":" ); const char *pszVersion = CSLFetchNameValue( papszADC, "file format " ); if( pszVersion == NULL || !EQUAL( pszVersion, "IDRISI Values A.1" ) ) { CSLDestroy( papszADC ); return FALSE; } const char *pszFileType = CSLFetchNameValue( papszADC, "file type " ); if( pszFileType == NULL || !EQUAL( pszFileType, "ascii" ) ) { CPLDebug("IDRISI", ".adc file found, but file type != ascii"); CSLDestroy( papszADC ); return FALSE; } const char* pszRecords = CSLFetchNameValue( papszADC, "records " ); if( pszRecords == NULL || atoi(pszRecords) != (int)nTotalFeatures ) { CPLDebug("IDRISI", ".adc file found, but 'records' not found or not " "consistent with feature number declared in .vdc"); CSLDestroy( papszADC ); return FALSE; } const char* pszFields = CSLFetchNameValue( papszADC, "fields " ); if( pszFields == NULL || atoi(pszFields) <= 1 ) { CPLDebug("IDRISI", ".adc file found, but 'fields' not found or invalid"); CSLDestroy( papszADC ); return FALSE; } // -------------------------------------------------------------------- // Look for .avl file // -------------------------------------------------------------------- const char* pszAVLFilename = CPLResetExtension(pszFilename, "avl"); fpAVL = VSIFOpenL(pszAVLFilename, "rb"); if (fpAVL == NULL) { pszAVLFilename = CPLResetExtension(pszFilename, "AVL"); fpAVL = VSIFOpenL(pszAVLFilename, "rb"); } if (fpAVL == NULL) { CSLDestroy( papszADC ); return FALSE; } // -------------------------------------------------------------------- // Build layer definition // -------------------------------------------------------------------- int iCurField; char szKey[32]; iCurField = 0; sprintf(szKey, "field %d ", iCurField); char** papszIter = papszADC; const char* pszLine; int bFieldFound = FALSE; CPLString osFieldName; while((pszLine = *papszIter) != NULL) { //CPLDebug("IDRISI", "%s", pszLine); if (strncmp(pszLine, szKey, strlen(szKey)) == 0) { const char* pszColon = strchr(pszLine, ':'); if (pszColon) { osFieldName = pszColon + 1; bFieldFound = TRUE; } } else if (bFieldFound && strncmp(pszLine, "data type :", strlen("data type :")) == 0) { const char* pszFieldType = pszLine + strlen("data type :"); OGRFieldDefn oFieldDefn(osFieldName.c_str(), EQUAL(pszFieldType, "integer") ? OFTInteger : EQUAL(pszFieldType, "real") ? OFTReal : OFTString); if( iCurField == 0 && oFieldDefn.GetType() != OFTInteger ) { CSLDestroy( papszADC ); return FALSE; } if( iCurField != 0 ) poFeatureDefn->AddFieldDefn( &oFieldDefn ); iCurField ++; sprintf(szKey, "field %d ", iCurField); } papszIter++; } CSLDestroy(papszADC); return TRUE; }
int OGRIdrisiDataSource::Open( const char * pszFilename ) { pszName = CPLStrdup( pszFilename ); VSILFILE* fpVCT = VSIFOpenL(pszFilename, "rb"); if (fpVCT == NULL) return FALSE; char* pszWTKString = NULL; // -------------------------------------------------------------------- // Look for .vdc file // -------------------------------------------------------------------- const char* pszVDCFilename = CPLResetExtension(pszFilename, "vdc"); VSILFILE* fpVDC = VSIFOpenL(pszVDCFilename, "rb"); if (fpVDC == NULL) { pszVDCFilename = CPLResetExtension(pszFilename, "VDC"); fpVDC = VSIFOpenL(pszVDCFilename, "rb"); } char** papszVDC = NULL; if (fpVDC != NULL) { VSIFCloseL(fpVDC); fpVDC = NULL; CPLPushErrorHandler(CPLQuietErrorHandler); papszVDC = CSLLoad2(pszVDCFilename, 1024, 256, NULL); CPLPopErrorHandler(); CPLErrorReset(); } OGRwkbGeometryType eType = wkbUnknown; if (papszVDC != NULL) { CSLSetNameValueSeparator( papszVDC, ":" ); const char *pszVersion = CSLFetchNameValue( papszVDC, "file format " ); if( pszVersion == NULL || !EQUAL( pszVersion, "IDRISI Vector A.1" ) ) { CSLDestroy( papszVDC ); VSIFCloseL(fpVCT); return FALSE; } const char *pszRefSystem = CSLFetchNameValue( papszVDC, "ref. system " ); const char *pszRefUnits = CSLFetchNameValue( papszVDC, "ref. units " ); if (pszRefSystem != NULL && pszRefUnits != NULL) IdrisiGeoReference2Wkt( pszFilename, pszRefSystem, pszRefUnits, &pszWTKString); } GByte chType; if (VSIFReadL(&chType, 1, 1, fpVCT) != 1) { VSIFCloseL(fpVCT); CSLDestroy( papszVDC ); return FALSE; } if (chType == 1) eType = wkbPoint; else if (chType == 2) eType = wkbLineString; else if (chType == 3) eType = wkbPolygon; else { CPLError( CE_Failure, CPLE_AppDefined, "Unsupport geometry type : %d", static_cast<int>(chType) ); VSIFCloseL(fpVCT); CSLDestroy( papszVDC ); return FALSE; } const char *pszMinX = CSLFetchNameValue( papszVDC, "min. X " ); const char *pszMaxX = CSLFetchNameValue( papszVDC, "max. X " ); const char *pszMinY = CSLFetchNameValue( papszVDC, "min. Y " ); const char *pszMaxY = CSLFetchNameValue( papszVDC, "max. Y " ); OGRIdrisiLayer* poLayer = new OGRIdrisiLayer(pszFilename, CPLGetBasename(pszFilename), fpVCT, eType, pszWTKString); papoLayers = static_cast<OGRLayer**>( CPLMalloc(sizeof(OGRLayer*)) ); papoLayers[nLayers ++] = poLayer; if( pszMinX != NULL && pszMaxX != NULL && pszMinY != NULL && pszMaxY != NULL) { poLayer->SetExtent( CPLAtof(pszMinX), CPLAtof(pszMinY), CPLAtof(pszMaxX), CPLAtof(pszMaxY) ); } CPLFree(pszWTKString); CSLDestroy( papszVDC ); return TRUE; }