MITAB Library - Revision History
CHANGES - Current Version:
Version 1.2.3 - (2002-10-15)
- Support auto-addition of a dummy "FID" column if TAB files are created
with no fields, instead of producing an error. A corresponding change
has not yet been applied to the MIF driver. NFW
- Fixed lots of places that check for errors by examining CPLGetLastErrorNo().
A warning will trigger all these places as an error. Changed to check that
the last error type was CE_Failure and add a CPLErrorReset() at the
beginning of many affected sections. NFW
- Modified TABGetBasename() (in mitab_utils.cpp) to stop at the first
forward or backslash otherwise "C:/warmerda/mi\can_caps.tab" will result
in a basename of "mi\can_caps.tab". NFW
- Modified datum list in mitab_spatialref.cpp with a bunch of new EPSG/OGC
datum names provided by Siro Martello from Cadcorp. NFW
- Fix memory leak of m_pszIndex in mitab_miffile.cpp, the poSpatialRef
in TABFile::SetMIFCoordSys(), and a leak in MITABExtractCoordSysBounds(). NFW
- Added untested support in mitab_spatialref.cpp, and mitab_coordsys.cpp for
projections Regional Mercator (26), Polyconic (27), Azimuthal Equidistant -
All origin latitudes (28), and Lambert Azimuthal Equal Area - any aspect
Version 1.2.2 - (2002-07-06)
- Added a validation in TABMAPFile::GetFeatureId(). When there's no .map file
or no spatial indexes or no geometry, the function return -1 like an Eof.
This prevent the reading of a file set to NULL. (bug 169 (MapServer))
- Treat Region as MultiPolygon in mitab_c_set_point() to support Regions
with multiple islands and holes. Passing a part number <= 0 (second
parameter in mitab_c_set_point()) will result in adding a new island
(i.e. polygon). By default, parts > 1 are treated as holes in the
last island (polygon) that was created.
- Added IsInteriorRing() function in the TABRegion class to validate if a ring
in a polygon is an external or an internal ring. The function returns
true if the specified ring is an interior ring. The function
mitab_c_is_interior_ring() in mitab_capi.c has been created too to call
IsInteriorRing() if the feature is a region.
- In mitab_mapheaderblock.cpp, the Coordsys2Int() function used integer values
to check for overflow. However, in some case, integer was to small and caused
problems with applications that called SetSpatialFilter() with a filter
much larger than the file's bounds. So, this function now uses doubles
internally for comparison, but still returns and receives integers.
- Add SetSpatialFilter function in the TABSeamless class, to use seamless
layer in the right way. Now, the filter is applied on each data file and
on the index file. (Bug 164 (MapServer))
Version 1.2.1 - (2002-05-08)
- Implement SetMIFCoordSys in the MIFFile class. The coordsys was not
written when calling mitab_c_create for MIF files because
MIFFile::SetMIFCoordSys always returned -1 (Bug 984).
- Added support for TABFC_FontPoint and TABFC_CustomPoint in
mitab_c_create_feature(), mitab_c_set_points(), mitab_c_set_font() and
- mitab_capi.h: Use stdcall by default for all public mitab.dll functions
instead of cdecl. Should still work fine for C/C++ users, and will
allow VB/Delphi users to use the same DLL with Bo T.'s interface files.
Version 1.2.0 - (2002-05-03)
- Made changes in TABRelation to avoid an infinite loop. The m_poCurFeature
object have been deleted and the function GetFeatureRef() have been replace
by GetFeature(). This new function return a TABFeature object that must be
control by the calling method. (bug 706)
- Made important changes in order to support writing objects in 16 bits
coordinate format. New TABMAPObjHdr-derived classes are used to hold
object info in memory until block is full.
This was required in order to fix a problem when very small regions
were written in 32 bits coordinates when 16 bits should have been used
because MBR < 65536. In this case MapInfo would attempt to rewrite the
modified object info in 16 bits format while the coordinates blocks are
still in 32 bits format... resulting in a corrupted the file.
Note that at this point only feature types that use separate coordinate
blocks can be saved in 16 bits format (PLINE, MULTIPLINE and REGION).
- Prevent writing of coordinates outside of the +/-1e9 integer bounds.
If coordinates outside of that range are written then the values are
written as +/-1e9 instead and a warning (ERROR 503) is produced when
the file is closed. Coordinates outside of the +/-1e9 bounds limits
seemed to confuse MapInfo.
- Disabled the warning (ERROR 503) when coordinates outside of the +/-1e9
integer bounds in SetCoordFilter().
- Modified the conversion of double to integer coordinates to fix an old
problem where coordinates written by MITAB would be a little bit off
sometimes compared with the same values written by MapInfo.
- Modified mitab_capi.cpp to correctly produce "point" style arcs from
mitab_c_set_arc(). It now sets a point geometry ensuring that the
TABArc::ValidateMapInfoType() method will succeed. As per DMSG Bug 644. NFW
- Fixed some TABView issues (bug 703):
- Support "select * ..." syntax
- Accept source table names with or without the .tab extension
- Avoid crash if .IND file for related table is missing (i.e. deleted)
- The OGRDriver Create method will now accept the FORMAT=MIF option to
create a dataset of mif files instead of tab files. NFW
- Prevent an infinite loop of calls to LoadNextMatchingObjectBlock() in
GetNextFeatureId() if no objects found in spatial index when using a
- False Easting/Northing should be in the linear units of measure in MapInfo,
but in OGRSpatialReference/WKT they are always in meters. Convert
accordingly in mitab_coordsys.cpp and mitab_spatialref.cpp. NFW
- Added support for reading and writing new V650 Multipoint for both TAB and
- Added support for Cassini Soldner projection (projection 30). NFW
- Add EOF validation in MIDDATAFile::GetLastLine() to fix EOF problems
while reading some MIF/MID files (Bug 819, JSL)
- New VB, Pascal, and MapBasic interfaces contributed by Bo Thomsen.
- Added to C API: mitab_c_get_field_width(), mitab_c_get_field_precision()
Version 1.1.3 - (2001-11-02)
- mitab_tabview.cpp: Use VSIUnlink() instead of unlink(). NFW.
- mitab_utils.cpp: Don't use multi-byte support if _WIN32 and unix are
defined to try and preserve cygwin support. NFW
- C API: Added mitab_c_get_text().
Added mitab_c_get_projinfo() and mitab_c_set_projinfo()
Changed mitab_c_create() to make bounds optional and allow using
default projection bounds if available
- GetLabelStyleString(): take line spacing and num. of lines into account
when calculating text height.
- Test for NULL geometries if spatial filter enabled in GetNextFeature()
(objects with NONE geometry would have caused a crash when a spatial
filter was set).
- Fixed a few memory leaks in mitab_miffile.cpp. NFW.
- Fixed mitab_capi.c to not delete the spatial ref unless dereferencing it
drops the count to 0. NFW.
- Modified TABFile::SetSpatialRef() to clone the passed in OGRSpatialReference
instead of taking a reference to it, so it will work with stack allocated
OGRSpatialReferences or in cases where the caller doesn't check ref counts.
- TABPolyline::ValidateMapInfoType(): return TAB_GEOM_NONE if numpoints < 2
- Substantial additions to lots of files adding support for efficient
spatial queries by utilizing the spatial indexes when reading. NFW.
- TABText should not produce an error if reading a 0-length text.
- Seamless files: when reading on Unix, replace '\\' with '/' in file path
read from the index table.
- Modified mitab_miffile.cpp to keep track of the feature id of the
preloaded text line in m_nPreloadedId instead of m_nCurFeatureId to fix
serious problems with access through IMapInfo::GetNextFeature() - this
affects applications using the pure OGRLayer API to access mif files. NFW
- mitab_middatafile.cpp: Use VSIRewind() instead of rewind() to ensure that
IO remains virtualized. NFW
- mitab_miffile.cpp: modified to return extents collected by PreParse. Made
distinction between extents and projection bounds explicit. NFW
- mitab_spatialref.cpp: added OGC name for datum 12.
Version 1.1.2 - (2001-06-24)
- Support reading and writing TEXT objects with strings longer than 512
bytes. MITABMAPCoordBlock's Read/WriteBytes() had to be fixed to
allow reading/writing data split over more than 2 blocks.
- StyleString fixes: include font name in text style string, and placed
brush before pen in region style strings.
- C API: added get methods for all pen, brush, font and symbol properties.
- Fixed MIF Text object output: negative text angles were lost. Also use
TABText::SetTextAngle() when reading MIF instead of setting class members
directly so that negative angles get converted to the [0..360] range.
Version 1.1.1 - (2001-05-01)
- Added implementation for OGRLayer::GetExtent() that returns extents
of the data, which is differents from the bounds of the projection.
- Added code to set TOWGS84 values for mitab_coordsys.cpp and
- Fixed serious bug in TABFile::SetSpatialRef() (mitab_spatialref.cpp). A
core dump could occur for type 999 and 9999 datums. Thanks to Stephen
Cheesman of Geosoft for finding and pointing this out. (NFW)
- Modified TABINDFile/TABINDNode to support update (i.e. read/write) access
and created 'tabindex' program to test creation of indexes on existing
- Modified reading of TABRegion to maintain outside/inside ring relationship
when it's available in the source file.
- Fixed default for BRUSH when brush index=0 in the source file. It should
be BRUSH(1,0,16777215) and not BRUSH(2,16777215,16777215).
Version 1.1.0 - (2001-03-08)
- Modified mitab_imapinfofile.cpp so that variable width fields (nWidth=0)
is translated to 254 characters, instead of 255 so it will actually be
a legal field width in TAB. (NFW)
- Make default and max char field with 254 chars in TABFile::AddFieldNative()
- Added a warning (TAB_WarningBoundsOverflow) on close of .MAP file if any
object was written with coordinates outside of the file's predefined
bounds. (Causing an overflow of the +/-1e9 integer coord. range)
- Use MI defaults for Pen, Brush, Font, Symbol when creating new objects
and when reading objects with no Pen, Brush, etc. set (used to just set
everything to zero which was inconsistent with MI's behavior)
New defaults are: PEN(1,2,0), BRUSH(2,16777215,16777215),
- Accept "TABLE TYPE LINKED" and handle them the same way as type NATIVE
i.e. the link to the RDBMS is simply ignored.
- Added support for Swiss Oblique Mercator/Cylindrical. (NFW)
- Expand tabs (NFW)
- Added projection bounds lookup tables, automatically called by
TABFile::SetProjInfo() (and SetSpatialRef() by the same way).
TABFile::IsBoundsSet() can be used after setting projection to
establish if some default bounds were found or not for the projection.
- Fixed IMapInfoFile::CreateFeature(), was leaking feature memory. (NFW)
- Fixed small memory leak in OGRTABDataSource::CreateLayer() (NFW)
- Support SpatialFilter inside IMapInfoFile::GetNextFeature().
TAB files should support spatial filter via their spatial index for
- Avoid unnecessary cloning of features in IMapInfoFile::GetNextFeature() and
- Added TABText::Get/SetTextLineEndPoint() and properly read/write label
line end point in TAB files.
- Fixed writing MIF header: for decimal fields, an extra field of type
logical with same name was always added because of a missing break; (Kieron)
- Added support for reading seamless TAB files (TABSeamless class)
- Fixed problem creating new files with mixed case extensions (e.g. ".Tab")
Version 1.0.4 - (2000-11-14)
- Fixed a problem writing indexes - When a new entry was inserted at the
beginning of an index node (changing this node's key) then the parent was
not properly updated and some records were not queriable through that index.
- Handle '\t' just like a space when parsing mif files.
- Fixed MIFFile::GotoFeature() to avoid calling ResetReading() before moving
- Fixed writing of drawing tool blocks - when more than 512 bytes worth of
drawing tool info had to be written, an error was produced instead of
automatically allocating a new block, resulting in a truncated file.
Version 1.0.3 - (2000-10-19)
- Fixed reading of MAPCoordBlocks to accept text strings that overlap on
2 data blocks.
- Added graceful recovery from NULL OGRSpatialReference pointers in
mitab_capi.cpp, and mitab_spatialref.cpp (NFW).
- Added what I hope to be working support for NonEarth translation
(into LOCAL_CS in WKT format) (NFW).
- Initialize m_dWidth to 0 in TABText constructor. (NFW)
- Made TABFile::GetBounds() return bounds corresponding to the +/- 1e9
integer coordinate limits instead of using min/max int. coord. from header
Version 1.0.2 - (2000-10-03)
- Avoid warnings building with gcc -Wall -O2 (NFW).
- Modified generation of .MAP spatial index to generate a balanced tree
instead of the old 'chained list of nodes' that exceeded the 255 levels
limit on the tree depth with files with > 100,000 objects.
There would still be room for improvement by implementing splitting of
object data blocks.
- Handle m_nOriginQuadrant value of 0 the same way as quadrant 3
- Added bDeletedFlag to TABFeature with get/set methods
- Maintain and/or compute values of regions and polyline center/label point
(Used to always use the center of the MBR and this was not correct)
- Fixes for old Version 100 files:
- Set valid Scale/displacement when reading V100 .map header.
Use m_nCoordPrecision to define scale since scale in header is 0.
- Accept "FORMAT: DBF" in .tab header file.
- Made all open() methods completely case-insensitive on filenames on Unix
- Added new MapInfo 6.0 datums in datum list.
- Added OGR Feature Style String support when reading
- Added support for writing arcs, ellipses and rectangles using the C API
- Flushed tab2mif.cpp and mif2tab.cpp. There is now a single tab2tab.cpp
conversion program that can generate both TAB or MIF output, depending
on output filename extension
- Added #define MITAB_VERSION for apps that want to report library version.
Version 1.0.1 - (2000-04-21)
- Added C API documentation (mitab_capi.cpp) + functions to read vertices
and field information and included C API in public release.
- Modified fltering of new table field name to accept extended chars with
Version 1.0 - (2000-03-26)
- Changed to use same MIT/X-Consortium license as other CPL + OGR libs.
- Fixed problem opening datasets with 0 features in them.
- Added support for reading TAB datasets with "Table Type DBF"... only
type "NATIVE" was supported until now.
- Produce only a warning when unsupported feature types encountered in the
.MAP file, and return a valid feature with a NONE geometry.
- Done more tests (and required changes) to fix the way the quadrant
setting affects the way to read arc angles... hopefully it's right
- TABText objects now return their text string with any "\n" escaped on
2 chars (i.e. "\"+"n"). TABText::SetText() also expects newlines to
be escaped in the string it receives.
- Fixed some projection problems, including possible crashes with some
9999 datums with big parameter values or with some unrecognized projections.
- Outside/inside ring relationship from a TABRegion's OGRPolygon is now
properly written to the .MAP file's coord block section header.
Prior to MapInfo 5.0, this info was ignored, but now it has to be valid
otherwise some parts of a region won't be displayed properly in MI5.0
- Added support to write indexed fields and create joined tables (TABView).
- Added validation on field names (no special chars) on write and
produce a warning if name had to be fixed.
- Added support for V450 object types with num_points > 32767 and for
pen width in points.
This also resulted in changes to the ITABFeaturePen methods, mainly the
Get/SetPenStyle() method has been removed since this style value was
actually a part of the point width value.
Finally, the 'style' parameter was also removed in the
mitab_c_set_pen() C API method.
- Support for Version 450 objects forced creation of version 500 .MAP files
with 1024 bytes header (.MAP version 400 were produced before).
- MIF format now reads and writes bounds in coordsys (used to ignore them)
Version 0.2 - (1999-12-20)
- Added TABView class to support views on pairs of .TAB files (read-only)
- Currently supports only 2 tables with a many-to-1 relation through
an integer field.
- Added GetFeatureCountByType() method. Current implementation does
not work (returns all zeros) for MIF files
- Added static ImapInfoFile::SmartOpen() to automatically detect file type,
open a new file for read and return a new object of the appropriate
type (TABFile/TABView/MIFFile) to handle it.
- Changed TABFile::Open(), MIFFile::Open() to use a bTestOpenNoError flag
- OGRMIDDataSource/OGRMIDDriver were removed. Now all file types
handled by MITAB go through the OGRTABDataSource/OGRTABDriver interface
- Fixed problem reading/writing dates (bytes were reversed)
Also, Dates are now returned as "YYYYMMDD", and accepted as one
of "YYYY/MM/DD", "DD/MM/YYYY", or "YYYYMMDD"
- Fixed TABFile::GetBounds() that could sometimes return Min values > Max
- Rounded rectangles with radius bigger than MBR: we used to return a
corrected radius value, but it's now changed to return the real radius
value (even if it's too big) since this is what MapInfo appears to do
when exporting from TAB to MIF
- Fixed some problems that had appeared following a change in OGR's
addGeometry()... use the new addGeometryDirectly() + more error checking.
- TABRegions geometry now returned as OGRMultiPolygon instead of OGRPolygon
with multiple rings. This change had to be done because OGRPolygons
MUST have only one outer ring with a set of inner rings, and this
cannot be guaranteed to be the case with a MapInfo file.
Also added TABRegion::GetNumRings() and TABRegion::GetRing() to
make it simpler to manipulate the complex geometry as if it was a
simple collection of rings which is actually what we have in the
- Fixed some problems with MIF generation of Float fields and PLINE MULTIPLE
- Run a bunch of read/write tests for both .TAB and .MIF through Purify...
fixed all memory leaks found.
Version 0.1 - (1999-12-04)
- First official pre-release version
- Still lacks good API docs.
$Id: mitab_history.txt,v 1.1 2003/06/11 21:08:56 fwarnock Exp $