📄 mitab_priv.h
字号:
/**********************************************************************
* $Id: mitab_priv.h,v 1.52 2008/02/20 21:35:30 dmorissette Exp $
*
* Name: mitab_priv.h
* Project: MapInfo TAB Read/Write library
* Language: C++
* Purpose: Header file containing private definitions for the library.
* Author: Daniel Morissette, dmorissette@dmsolutions.ca
*
**********************************************************************
* Copyright (c) 1999-2003, Daniel Morissette
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
* DEALINGS IN THE SOFTWARE.
**********************************************************************
*
* $Log: mitab_priv.h,v $
* Revision 1.52 2008/02/20 21:35:30 dmorissette
* Added support for V800 COLLECTION of large objects (bug 1496)
*
* Revision 1.51 2008/02/05 22:22:48 dmorissette
* Added support for TAB_GEOM_V800_MULTIPOINT (bug 1496)
*
* Revision 1.50 2008/02/01 19:36:31 dmorissette
* Initial support for V800 REGION and MULTIPLINE (bug 1496)
*
* Revision 1.49 2008/01/29 20:46:32 dmorissette
* Added support for v9 Time and DateTime fields (byg 1754)
*
* Revision 1.48 2007/10/09 17:43:16 fwarmerdam
* Remove static variables that interfere with reentrancy. (GDAL #1883)
*
* Revision 1.47 2007/06/12 12:50:39 dmorissette
* Use Quick Spatial Index by default until bug 1732 is fixed (broken files
* produced by current coord block splitting technique).
*
* Revision 1.46 2007/06/11 14:52:31 dmorissette
* Return a valid m_nCoordDatasize value for Collection objects to prevent
* trashing of collection data during object splitting (bug 1728)
*
* Revision 1.45 2007/03/21 21:15:56 dmorissette
* Added SetQuickSpatialIndexMode() which generates a non-optimal spatial
* index but results in faster write time (bug 1669)
*
* Revision 1.44 2007/02/22 18:35:53 dmorissette
* Fixed problem writing collections where MITAB was sometimes trying to
* read past EOF in write mode (bug 1657).
*
* Revision 1.43 2006/11/28 18:49:08 dmorissette
* Completed changes to split TABMAPObjectBlocks properly and produce an
* optimal spatial index (bug 1585)
*
* Revision 1.42 2006/11/20 20:05:58 dmorissette
* First pass at improving generation of spatial index in .map file (bug 1585)
* New methods for insertion and splittung in the spatial index are done.
* Also implemented a method to dump the spatial index to .mif/.mid
* Still need to implement splitting of TABMapObjectBlock to get optimal
* results.
*
* Revision 1.41 2006/09/05 23:05:08 dmorissette
* Added TABMAPFile::DumpSpatialIndex() (bug 1585)
*
* Revision 1.40 2005/10/06 19:15:31 dmorissette
* Collections: added support for reading/writing pen/brush/symbol ids and
* for writing collection objects to .TAB/.MAP (bug 1126)
*
* Revision 1.39 2005/10/04 15:44:31 dmorissette
* First round of support for Collection objects. Currently supports reading
* from .TAB/.MAP and writing to .MIF. Still lacks symbol support and write
* support. (Based in part on patch and docs from Jim Hope, bug 1126)
*
* Revision 1.38 2005/03/22 23:24:54 dmorissette
* Added support for datum id in .MAP header (bug 910)
*
* Revision 1.37 2004/06/30 20:29:04 dmorissette
* Fixed refs to old address danmo@videotron.ca
*
* Revision 1.36 2003/08/12 23:17:21 dmorissette
* Added reading of v500+ coordsys affine params (Anthony D. - Encom)
*
* Revision 1.35 2003/01/18 20:25:44 daniel
* Increased MIDMAXCHAR value to 10000
*
* Revision 1.34 2002/04/25 16:05:24 julien
* Disabled the overflow warning in SetCoordFilter() by adding bIgnoreOverflow
* variable in Coordsys2Int of the TABMAPFile class and TABMAPHeaderBlock class
*
* Revision 1.33 2002/04/22 13:49:09 julien
* Add EOF validation in MIDDATAFile::GetLastLine() (Bug 819)
*
* Revision 1.32 2002/03/26 19:27:43 daniel
* Got rid of tabs in source
*
* Revision 1.31 2002/03/26 01:48:40 daniel
* Added Multipoint object type (V650)
*
* Revision 1.30 2002/02/22 20:44:51 julien
* Prevent infinite loop with TABRelation by suppress the m_poCurFeature object
* from the class and setting it in the calling function and add GetFeature in
* the class. (bug 706)
*
* Revision 1.29 2001/11/19 15:07:54 daniel
* Added TABMAPObjNone to handle the case of TAB_GEOM_NONE
*
* Revision 1.28 2001/11/17 21:54:06 daniel
* Made several changes in order to support writing objects in 16 bits
* coordinate format. New TABMAPObjHdr-derived classes are used to hold
* object info in mem until block is full.
*
* Revision 1.27 2001/09/18 20:33:52 warmerda
* fixed case of spatial search on file with just one object block
*
* Revision 1.26 2001/09/14 03:23:55 warmerda
* Substantial upgrade to support spatial queries using spatial indexes
*
* Revision 1.25 2001/05/01 18:28:10 daniel
* Fixed default BRUSH, should be BRUSH(1,0,16777215).
*
* Revision 1.24 2001/05/01 03:39:51 daniel
* Added SetLastPtr() to TABBinBlockManager.
*
* Revision 1.23 2001/03/15 03:57:51 daniel
* Added implementation for new OGRLayer::GetExtent(), returning data MBR.
*
* Revision 1.22 2000/11/23 21:11:07 daniel
* OOpps... VC++ didn't like the way TABPenDef, etc. were initialized
*
* Revision 1.21 2000/11/23 20:47:46 daniel
* Use MI defaults for Pen, Brush, Font, Symbol instead of all zeros
*
* Revision 1.20 2000/11/15 04:13:50 daniel
* Fixed writing of TABMAPToolBlock to allocate a new block when full
*
* Revision 1.19 2000/11/13 22:19:30 daniel
* Added TABINDNode::UpdateCurChildEntry()
*
* Revision 1.18 2000/05/19 06:45:25 daniel
* Modified generation of spatial index to split index nodes and produce a
* more balanced tree.
*
* Revision 1.17 2000/03/01 00:30:03 daniel
* Completed support for joined tables
*
* Revision 1.16 2000/02/28 16:53:23 daniel
* Added support for indexed, unique, and for new V450 object types
*
* ...
*
* Revision 1.1 1999/07/12 04:18:25 daniel
* Initial checkin
*
**********************************************************************/
#ifndef _MITAB_PRIV_H_INCLUDED_
#define _MITAB_PRIV_H_INCLUDED_
#include "cpl_conv.h"
#include "cpl_string.h"
#include "ogr_feature.h"
class TABFile;
class TABFeature;
class TABMAPToolBlock;
class TABMAPIndexBlock;
/*---------------------------------------------------------------------
* Access mode: Read or Write
*--------------------------------------------------------------------*/
typedef enum
{
TABRead,
TABWrite,
TABReadWrite /* ReadWrite not implemented yet */
} TABAccess;
/*---------------------------------------------------------------------
* Supported .MAP block types (the first byte at the beginning of a block)
*--------------------------------------------------------------------*/
#define TAB_RAWBIN_BLOCK -1
#define TABMAP_HEADER_BLOCK 0
#define TABMAP_INDEX_BLOCK 1
#define TABMAP_OBJECT_BLOCK 2
#define TABMAP_COORD_BLOCK 3
#define TABMAP_GARB_BLOCK 4
#define TABMAP_TOOL_BLOCK 5
#define TABMAP_LAST_VALID_BLOCK_TYPE 5
/*---------------------------------------------------------------------
* Drawing Tool types
*--------------------------------------------------------------------*/
#define TABMAP_TOOL_PEN 1
#define TABMAP_TOOL_BRUSH 2
#define TABMAP_TOOL_FONT 3
#define TABMAP_TOOL_SYMBOL 4
/*---------------------------------------------------------------------
* Limits related to .TAB version number. If we pass any of those limits
* then we have to use larger object types
*--------------------------------------------------------------------*/
#define TAB_REGION_PLINE_300_MAX_VERTICES 32767
#define TAB_REGION_PLINE_450_MAX_SEGMENTS 32767
#define TAB_REGION_PLINE_450_MAX_VERTICES 1048575
#define TAB_MULTIPOINT_650_MAX_VERTICES 1048576
/* Use this macro to test whether the number of segments and vertices
* in this object exceeds the V450/650 limits and requires a V800 object
*/
#define TAB_REGION_PLINE_REQUIRES_V800(numSegments, numVerticesTotal) \
((numSegments) > TAB_REGION_PLINE_450_MAX_SEGMENTS || \
((numSegments)*3 + numVerticesTotal) > TAB_REGION_PLINE_450_MAX_VERTICES )
/*---------------------------------------------------------------------
* struct TABMAPIndexEntry - Entries found in type 1 blocks of .MAP files
*
* We will use this struct to rebuild the geographic index in memory
*--------------------------------------------------------------------*/
typedef struct TABMAPIndexEntry_t
{
// These members refer to the info we find in the file
GInt32 XMin;
GInt32 YMin;
GInt32 XMax;
GInt32 YMax;
GInt32 nBlockPtr;
}TABMAPIndexEntry;
#define TAB_MAX_ENTRIES_INDEX_BLOCK ((512-4)/20)
/*---------------------------------------------------------------------
* TABVertex
*--------------------------------------------------------------------*/
typedef struct TABVertex_t
{
double x;
double y;
} TABVertex;
/*---------------------------------------------------------------------
* TABTableType - Attribute table format
*--------------------------------------------------------------------*/
typedef enum
{
TABTableNative, // The default
TABTableDBF,
TABTableAccess
} TABTableType;
/*---------------------------------------------------------------------
* TABFieldType - Native MapInfo attribute field types
*--------------------------------------------------------------------*/
typedef enum
{
TABFUnknown = 0,
TABFChar,
TABFInteger,
TABFSmallInt,
TABFDecimal,
TABFFloat,
TABFDate,
TABFLogical,
TABFTime,
TABFDateTime
} TABFieldType;
#define TABFIELDTYPE_2_STRING(type) \
(type == TABFChar ? "Char" : \
type == TABFInteger ? "Integer" : \
type == TABFSmallInt ? "SmallInt" : \
type == TABFDecimal ? "Decimal" : \
type == TABFFloat ? "Float" : \
type == TABFDate ? "Date" : \
type == TABFLogical ? "Logical" : \
type == TABFTime ? "Time" : \
type == TABFDateTime ? "DateTime" : \
"Unknown field type" )
/*---------------------------------------------------------------------
* TABDATFieldDef
*--------------------------------------------------------------------*/
typedef struct TABDATFieldDef_t
{
char szName[11];
char cType;
GByte byLength;
GByte byDecimals;
TABFieldType eTABType;
} TABDATFieldDef;
/*---------------------------------------------------------------------
* TABMAPCoordSecHdr
* struct used in the TABMAPCoordBlock to store info about the coordinates
* for a section of a PLINE MULTIPLE or a REGION.
*--------------------------------------------------------------------*/
typedef struct TABMAPCoordSecHdr_t
{
GInt32 numVertices;
GInt32 numHoles;
GInt32 nXMin;
GInt32 nYMin;
GInt32 nXMax;
GInt32 nYMax;
GInt32 nDataOffset;
int nVertexOffset;
} TABMAPCoordSecHdr;
/*---------------------------------------------------------------------
* TABProjInfo
* struct used to store the projection parameters from the .MAP header
*--------------------------------------------------------------------*/
typedef struct TABProjInfo_t
{
GByte nProjId; // See MapInfo Ref. Manual, App. F and G
GByte nEllipsoidId;
GByte nUnitsId;
double adProjParams[6]; // params in same order as in .MIF COORDSYS
GInt16 nDatumId; // Datum Id added in MapInfo 7.8+ (.map V500)
double dDatumShiftX; // Before that, we had to always lookup datum
double dDatumShiftY; // parameters to establish datum id
double dDatumShiftZ;
double adDatumParams[5];
// Affine parameters only in .map version 500 and up
GByte nAffineFlag; // 0=No affine param, 1=Affine params
GByte nAffineUnits;
double dAffineParamA; // Affine params
double dAffineParamB;
double dAffineParamC;
double dAffineParamD;
double dAffineParamE;
double dAffineParamF;
} TABProjInfo;
/*---------------------------------------------------------------------
* TABPenDef - Pen definition information
*--------------------------------------------------------------------*/
typedef struct TABPenDef_t
{
GInt32 nRefCount;
GByte nPixelWidth;
GByte nLinePattern;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -