?? mitab_feature.cpp
字號:
*------------------------------------------------------------*/
m_nComprOrgX = nComprOrgX;
m_nComprOrgY = nComprOrgY;
m_nMapInfoType = nMapInfoType;
if (bCompr && ((m_nMapInfoType%3) == 2))
m_nMapInfoType--; // compr = 1, 4, 7, ...
else if (!bCompr && ((m_nMapInfoType%3) == 1))
m_nMapInfoType++; // non-compr = 2, 5, 8, ...
m_nXMin = nXMin;
m_nYMin = nYMin;
m_nXMax = nXMax;
m_nYMax = nYMax;
}
/**********************************************************************
* TABFeature::WriteGeometryToMAPFile()
*
*
* In derived classes, this method should be reimplemented to
* write the geometry and representation (color, etc...) part of the
* feature to the .MAP object pointed to by poMAPFile.
*
* It is assumed that before calling WriteGeometryToMAPFile(), poMAPFile
* currently points to a valid map object.
*
* bCoordBlockDataOnly=TRUE is used when this method is called to copy only
* the CoordBlock data during splitting of object blocks. In this case we
* need to process only the information related to the CoordBlock. One
* important thing to avoid is reading/writing pen/brush/symbol definitions
* as that would screw up their ref counters.
*
* ppoCoordBlock is used by TABCollection and by index splitting code
* to provide a CoordBlock to use instead of the one from the poMAPFile and
* return the current pointer at the end of the call.
*
* The current implementation does nothing since instances of TABFeature
* objects contain no geometry (i.e. TAB_GEOM_NONE).
*
* Returns 0 on success, -1 on error, in which case CPLError() will have
* been called.
**********************************************************************/
int TABFeature::WriteGeometryToMAPFile(TABMAPFile * /* poMapFile*/,
TABMAPObjHdr * /*poObjHdr*/,
GBool /*bCoordBlockDataOnly=FALSE*/,
TABMAPCoordBlock ** /*ppoCoordBlock=NULL*/)
{
/*-----------------------------------------------------------------
* Nothing to do... instances of TABFeature objects contain no geometry.
*----------------------------------------------------------------*/
return 0;
}
/**********************************************************************
* TABFeature::DumpMID()
*
* Dump feature attributes in a format similar to .MID data records.
**********************************************************************/
void TABFeature::DumpMID(FILE *fpOut /*=NULL*/)
{
OGRFeatureDefn *poDefn = GetDefnRef();
if (fpOut == NULL)
fpOut = stdout;
for( int iField = 0; iField < GetFieldCount(); iField++ )
{
OGRFieldDefn *poFDefn = poDefn->GetFieldDefn(iField);
fprintf( fpOut, " %s (%s) = %s\n",
poFDefn->GetNameRef(),
OGRFieldDefn::GetFieldTypeName(poFDefn->GetType()),
GetFieldAsString( iField ) );
}
fflush(fpOut);
}
/**********************************************************************
* TABFeature::DumpMIF()
*
* Dump feature geometry in a format similar to .MIF files.
**********************************************************************/
void TABFeature::DumpMIF(FILE *fpOut /*=NULL*/)
{
if (fpOut == NULL)
fpOut = stdout;
/*-----------------------------------------------------------------
* Generate output... not much to do, feature contains no geometry.
*----------------------------------------------------------------*/
fprintf(fpOut, "NONE\n" );
fflush(fpOut);
}
/*=====================================================================
* class TABPoint
*====================================================================*/
/**********************************************************************
* TABPoint::TABPoint()
*
* Constructor.
**********************************************************************/
TABPoint::TABPoint(OGRFeatureDefn *poDefnIn):
TABFeature(poDefnIn)
{
}
/**********************************************************************
* TABPoint::~TABPoint()
*
* Destructor.
**********************************************************************/
TABPoint::~TABPoint()
{
}
/**********************************************************************
* TABPoint::CloneTABFeature()
*
* Duplicate feature, including stuff specific to each TABFeature type.
*
* This method calls the generic TABFeature::CloneTABFeature() and
* then copies any members specific to its own type.
**********************************************************************/
TABFeature *TABPoint::CloneTABFeature(OGRFeatureDefn *poNewDefn /*=NULL*/)
{
/*-----------------------------------------------------------------
* Alloc new feature and copy the base stuff
*----------------------------------------------------------------*/
TABPoint *poNew = new TABPoint(poNewDefn ? poNewDefn : GetDefnRef());
CopyTABFeatureBase(poNew);
/*-----------------------------------------------------------------
* And members specific to this class
*----------------------------------------------------------------*/
// ITABFeatureSymbol
*(poNew->GetSymbolDefRef()) = *GetSymbolDefRef();
return poNew;
}
/**********************************************************************
* TABPoint::ValidateMapInfoType()
*
* Check the feature's geometry part and return the corresponding
* mapinfo object type code. The m_nMapInfoType member will also
* be updated for further calls to GetMapInfoType();
*
* Returns TAB_GEOM_NONE if the geometry is not compatible with what
* is expected for this object class.
**********************************************************************/
int TABPoint::ValidateMapInfoType(TABMAPFile *poMapFile /*=NULL*/)
{
OGRGeometry *poGeom;
/*-----------------------------------------------------------------
* Fetch and validate geometry
* __TODO__ For now we always write in uncompressed format (until we
* find that this is not correct... note that at this point the
* decision to use compressed/uncompressed will likely be based on
* the distance between the point and the object block center in
* integer coordinates being > 32767 or not... remains to be verified)
*----------------------------------------------------------------*/
poGeom = GetGeometryRef();
if (poGeom && wkbFlatten(poGeom->getGeometryType()) == wkbPoint)
{
switch(GetFeatureClass())
{
case TABFCFontPoint:
m_nMapInfoType = TAB_GEOM_FONTSYMBOL;
break;
case TABFCCustomPoint:
m_nMapInfoType = TAB_GEOM_CUSTOMSYMBOL;
break;
case TABFCPoint:
default:
m_nMapInfoType = TAB_GEOM_SYMBOL;
break;
}
}
else
{
CPLError(CE_Failure, CPLE_AssertionFailed,
"TABPoint: Missing or Invalid Geometry!");
m_nMapInfoType = TAB_GEOM_NONE;
}
UpdateMBR(poMapFile);
return m_nMapInfoType;
}
/**********************************************************************
* TABPoint::ReadGeometryFromMAPFile()
*
* Fill the geometry and representation (color, etc...) part of the
* feature from the contents of the .MAP object pointed to by poMAPFile.
*
* It is assumed that poMAPFile currently points to the beginning of
* a map object.
*
* Returns 0 on success, -1 on error, in which case CPLError() will have
* been called.
**********************************************************************/
int TABPoint::ReadGeometryFromMAPFile(TABMAPFile *poMapFile,
TABMAPObjHdr *poObjHdr,
GBool bCoordBlockDataOnly /*=FALSE*/,
TABMAPCoordBlock ** /*ppoCoordBlock=NULL*/)
{
double dX, dY;
OGRGeometry *poGeometry;
/* Nothing to do for bCoordBlockDataOnly (used by index splitting) */
if (bCoordBlockDataOnly)
return 0;
/*-----------------------------------------------------------------
* Fetch and validate geometry type
*----------------------------------------------------------------*/
m_nMapInfoType = poObjHdr->m_nType;
if (m_nMapInfoType != TAB_GEOM_SYMBOL &&
m_nMapInfoType != TAB_GEOM_SYMBOL_C )
{
CPLError(CE_Failure, CPLE_AssertionFailed,
"ReadGeometryFromMAPFile(): unsupported geometry type %d (0x%2.2x)",
m_nMapInfoType, m_nMapInfoType);
return -1;
}
/*-----------------------------------------------------------------
* Read object information
*----------------------------------------------------------------*/
TABMAPObjPoint *poPointHdr = (TABMAPObjPoint *)poObjHdr;
m_nSymbolDefIndex = poPointHdr->m_nSymbolId; // Symbol index
poMapFile->ReadSymbolDef(m_nSymbolDefIndex, &m_sSymbolDef);
/*-----------------------------------------------------------------
* Create and fill geometry object
*----------------------------------------------------------------*/
poMapFile->Int2Coordsys(poPointHdr->m_nX, poPointHdr->m_nY, dX, dY);
poGeometry = new OGRPoint(dX, dY);
SetGeometryDirectly(poGeometry);
SetMBR(dX, dY, dX, dY);
SetIntMBR(poObjHdr->m_nMinX, poObjHdr->m_nMinY,
poObjHdr->m_nMaxX, poObjHdr->m_nMaxY);
return 0;
}
/**********************************************************************
* TABPoint::WriteGeometryToMAPFile()
*
* Write the geometry and representation (color, etc...) part of the
* feature to the .MAP object pointed to by poMAPFile.
*
* It is assumed that poMAPFile currently points to a valid map object.
*
* Returns 0 on success, -1 on error, in which case CPLError() will have
* been called.
**********************************************************************/
int TABPoint::WriteGeometryToMAPFile(TABMAPFile *poMapFile,
TABMAPObjHdr *poObjHdr,
GBool bCoordBlockDataOnly /*=FALSE*/,
TABMAPCoordBlock ** /*ppoCoordBlock=NULL*/)
{
GInt32 nX, nY;
OGRGeometry *poGeom;
OGRPoint *poPoint;
/* Nothing to do for bCoordBlockDataOnly (used by index splitting) */
if (bCoordBlockDataOnly)
return 0;
/*-----------------------------------------------------------------
* We assume that ValidateMapInfoType() was called already and that
* the type in poObjHdr->m_nType is valid.
*----------------------------------------------------------------*/
CPLAssert(m_nMapInfoType == poObjHdr->m_nType);
/*-----------------------------------------------------------------
* Fetch and validate geometry
*----------------------------------------------------------------*/
poGeom = GetGeometryRef();
if (poGeom && wkbFlatten(poGeom->getGeometryType()) == wkbPoint)
poPoint = (OGRPoint*)poGeom;
else
{
CPLError(CE_Failure, CPLE_AssertionFailed,
"TABPoint: Missing or Invalid Geometry!");
return -1;
}
poMapFile->Coordsys2Int(poPoint->getX(), poPoint->getY(), nX, nY);
/*-----------------------------------------------------------------
* Copy object information
*----------------------------------------------------------------*/
TABMAPObjPoint *poPointHdr = (TABMAPObjPoint *)poObjHdr;
poPointHdr->m_nX = nX;
poPointHdr->m_nY = nY;
poPointHdr->SetMBR(nX, nY, nX, nY);
m_nSymbolDefIndex = poMapFile->WriteSymbolDef(&m_sSymbolDef);
poPointHdr->m_nSymbolId = m_nSymbolDefIndex; // Symbol index
if (CPLGetLastErrorNo() != 0)
return -1;
return 0;
}
/**********************************************************************
* TABPoint::GetX()
*
* Return this point's X coordinate.
**********************************************************************/
double TABPoint::GetX()
{
OGRGeometry *poGeom;
OGRPoint *poPoint=NULL;
/*-----------------------------------------------------------------
* Fetch and validate geometry
*----------------------------------------------------------------*/
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -