📄 tabdump.cpp
字号:
/*---------------------------------------------------------------------
* 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 + -