📄 tabdump.cpp
字号:
printf("\n"); delete poBlock; } /*--------------------------------------------------------------------- * Cleanup and exit. *--------------------------------------------------------------------*/ fclose(fp); return 0;}/********************************************************************** * DumpTabFile() * * Open a .TAB file and print all the geogr. objects found. **********************************************************************/static int DumpTabFile(const char *pszFname){ IMapInfoFile *poFile; int nFeatureId; TABFeature *poFeature; /*--------------------------------------------------------------------- * Try to open source file *--------------------------------------------------------------------*/ if ((poFile = IMapInfoFile::SmartOpen(pszFname)) == NULL) { printf("Failed to open %s\n", pszFname); return -1; } poFile->Dump(); /*--------------------------------------------------------------------- * Check for indexed fields *--------------------------------------------------------------------*/ for(int iField=0; iField<poFile->GetLayerDefn()->GetFieldCount(); iField++) { if (poFile->IsFieldIndexed(iField)) printf(" Field %d is indexed\n", iField); } /*--------------------------------------------------------------------- * Read/Dump objects until EOF is reached *--------------------------------------------------------------------*/ nFeatureId = -1; while ( (nFeatureId = poFile->GetNextFeatureId(nFeatureId)) != -1 ) { poFeature = poFile->GetFeatureRef(nFeatureId); if (poFeature) {// poFeature->DumpReadable(stdout); printf("\nFeature %d:\n", nFeatureId); poFeature->DumpMID(); poFeature->DumpMIF(); } else break; // GetFeatureRef() failed: Abort the loop } /*--------------------------------------------------------------------- * Cleanup and exit. *--------------------------------------------------------------------*/ poFile->Close(); delete poFile; return 0;}/********************************************************************** * DumpIndFileObjects() * * Read and dump a .IND file **********************************************************************/static int DumpIndFileObjects(const char *pszFname){ TABINDFile oINDFile; /*--------------------------------------------------------------------- * Try to open source file *--------------------------------------------------------------------*/ if (oINDFile.Open(pszFname, "rb") != 0) { printf("Failed to open %s\n", pszFname); return -1; } // oINDFile.SetIndexFieldType(1,TABFChar); oINDFile.Dump(); /*--------------------------------------------------------------------- * Read/Dump objects until EOF is reached *--------------------------------------------------------------------*/ while ( 0 ) { } /*--------------------------------------------------------------------- * Cleanup and exit. *--------------------------------------------------------------------*/ oINDFile.Close(); return 0;}/********************************************************************** * DumpCoordsys() * * Open a .TAB file and dump coordsys info **********************************************************************/static int DumpCoordsys(const char *pszFname){ IMapInfoFile *poFile; double dXMin, dYMin, dXMax, dYMax; /*--------------------------------------------------------------------- * Try to open source file *--------------------------------------------------------------------*/ if ((poFile = IMapInfoFile::SmartOpen(pszFname)) == NULL) { printf("Failed to open %s\n", pszFname); return -1; } OGRSpatialReference *poSRS = poFile->GetSpatialRef(); char *pszCoordSys = MITABSpatialRef2CoordSys(poSRS); char *pszProjString=NULL; printf("CoordSys %s\n", pszCoordSys?pszCoordSys:"(null)"); if (poFile->GetBounds(dXMin, dYMin, dXMax, dYMax) == 0) { printf(" Proj. Bounds (%.15g %.15g) (%.15g %.15g)\n", dXMin, dYMin, dXMax, dYMax); printf(" dX dY = %.15g %.15g\n", dXMax - dXMin, dYMax - dYMin); } else { printf(" Projection Bounds not available!\n"); } OGREnvelope oEnv; if (poFile->GetExtent(&oEnv, TRUE) == 0) { printf(" Data Extents (%.15g %.15g) (%.15g %.15g)\n", oEnv.MinX, oEnv.MinY, oEnv.MaxX, oEnv.MaxY); } else { printf(" Data Extents not available!\n"); } if (poSRS) {// poSRS->exportToWkt(&pszProjString);// printf(" WKT SRS = %s\n", pszProjString);// CPLFree(pszProjString); poSRS->exportToProj4(&pszProjString); printf(" PROJ4 SRS = %s\n", pszProjString); // Write bounds to a file and launch 'proj' to convert them to LAT/LON FILE *fpOut; if (pszProjString && (fpOut = fopen("/tmp/tttbounds.txt", "w"))) { fprintf(fpOut, "%.15g %.15g\n", dXMin, dYMin); fprintf(fpOut, "%.15g %.15g\n", dXMax, dYMax); fclose(fpOut); fflush(stdout); system(CPLSPrintf("proj -I %s /tmp/tttbounds.txt", pszProjString)); } } /*--------------------------------------------------------------------- * Cleanup and exit. *--------------------------------------------------------------------*/ CPLFree(pszProjString); poFile->Close(); delete poFile; return 0;}/********************************************************************** * DumpCoordsysStruct() * * Open a .TAB file and dump coordsys info in a format usable to build * C array of MapInfoBoundsInfo[] **********************************************************************/static int DumpCoordsysStruct(const char *pszFname){ IMapInfoFile *poFile; double dXMin, dYMin, dXMax, dYMax; /*--------------------------------------------------------------------- * Try to open source file *--------------------------------------------------------------------*/ if ((poFile = IMapInfoFile::SmartOpen(pszFname)) == NULL) { printf("Failed to open %s\n", pszFname); return -1; } TABProjInfo sProjInfo; if (poFile->GetProjInfo(&sProjInfo) != 0) { printf("Cannot fetch TABProjInfo from %s\n", pszFname); return -1; } if (sProjInfo.nProjId == 0) { printf("Nonearth coordsys in %s\n", pszFname); return 0; } if (poFile->GetBounds(dXMin, dYMin, dXMax, dYMax) == 0) { printf("{{%d, %d, %d, " "{%.15g,%.15g,%.15g,%.15g,%.15g,%.15g}, " "%d,%.15g,%.15g,%.15g, " "{%.15g,%.15g,%.15g,%.15g,%.15g}}, ", sProjInfo.nProjId, sProjInfo.nEllipsoidId, sProjInfo.nUnitsId, sProjInfo.adProjParams[0], sProjInfo.adProjParams[1], sProjInfo.adProjParams[2], sProjInfo.adProjParams[3], sProjInfo.adProjParams[4], sProjInfo.adProjParams[5], sProjInfo.nDatumId, sProjInfo.dDatumShiftX, sProjInfo.dDatumShiftY, sProjInfo.dDatumShiftZ, sProjInfo.adDatumParams[0], sProjInfo.adDatumParams[1], sProjInfo.adDatumParams[2], sProjInfo.adDatumParams[3], sProjInfo.adDatumParams[4] ); printf(" %.15g, %.15g, %.15g, %.15g},\n", dXMin, dYMin, dXMax, dYMax); } else { printf(" Bounds struct cannot be generated!\n"); } /*--------------------------------------------------------------------- * Cleanup and exit. *--------------------------------------------------------------------*/ poFile->Close(); delete poFile; return 0;}/********************************************************************** * SearchIndex() * * Search a TAB dataset's .IND file for pszVal in index nIndexNo **********************************************************************/static int SearchIndex(const char *pszFname, int nIndexNo, const char *pszVal){ TABFile oTABFile; TABINDFile *poINDFile; /*--------------------------------------------------------------------- * Try to open source file *--------------------------------------------------------------------*/ if (oTABFile.Open(pszFname, "rb") != 0) { printf("Failed to open %s as a TABFile.\n", pszFname); return -1; } /*--------------------------------------------------------------------- * Fetch IND file handle *--------------------------------------------------------------------*/ if ((poINDFile = oTABFile.GetINDFileRef()) == NULL) { printf("Dataset %s has no .IND file\n", pszFname); return -1; } /*--------------------------------------------------------------------- * Search the index. * For now we search only 'char' index types!!! *--------------------------------------------------------------------*/ GByte *pKey; int nRecordNo; pKey = poINDFile->BuildKey(nIndexNo, pszVal); nRecordNo = poINDFile->FindFirst(nIndexNo, pKey); if (nRecordNo < 1) { printf("Value '%s' not found in index #%d\n", pszVal, nIndexNo); } else { while(nRecordNo > 0) { printf("Record %d...\n", nRecordNo); nRecordNo = poINDFile->FindNext(nIndexNo, pKey); } } /*--------------------------------------------------------------------- * Cleanup and exit. *--------------------------------------------------------------------*/ oTABFile.Close(); return 0;}/********************************************************************** * DumpViaSpatialIndex() * * Open a .TAB file and print all the geogr. objects that match the * specified filter. Scanes the file via the spatial index. **********************************************************************/static int DumpViaSpatialIndex(const char *pszFname, double dXMin, double dYMin, double dXMax, double dYMax){ IMapInfoFile *poFile; TABFeature *poFeature; /*--------------------------------------------------------------------- * Try to open source file *--------------------------------------------------------------------*/ if ((poFile = IMapInfoFile::SmartOpen(pszFname)) == NULL) { printf("Failed to open %s\n", pszFname); return -1; } poFile->Dump(); /*--------------------------------------------------------------------- * Check for indexed fields *--------------------------------------------------------------------*/ for(int iField=0; iField<poFile->GetLayerDefn()->GetFieldCount(); iField++) { if (poFile->IsFieldIndexed(iField)) printf(" Field %d is indexed\n", iField); } /*--------------------------------------------------------------------- * Set spatial filter *--------------------------------------------------------------------*/ OGRLinearRing oSpatialFilter; oSpatialFilter.setNumPoints(5); oSpatialFilter.setPoint(0, dXMin, dYMin); oSpatialFilter.setPoint(1, dXMax, dYMin); oSpatialFilter.setPoint(2, dXMax, dYMax); oSpatialFilter.setPoint(3, dXMin, dYMax); oSpatialFilter.setPoint(4, dXMin, dYMin); poFile->SetSpatialFilter( &oSpatialFilter ); /*--------------------------------------------------------------------- * Read/Dump objects until EOF is reached *--------------------------------------------------------------------*/ while ( (poFeature = (TABFeature*)poFile->GetNextFeature()) != NULL ) {// poFeature->DumpReadable(stdout); printf("\nFeature %ld:\n", poFeature->GetFID()); poFeature->DumpMID(); poFeature->DumpMIF(); } /*--------------------------------------------------------------------- * Cleanup and exit. *--------------------------------------------------------------------*/ poFile->Close(); delete poFile; return 0;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -