ThinkGeo.com    |     Documentation    |     Premium Support

Cannot load MapInfo file

 I am trying to load a small sample MapInfo file.


When I try and run this:



   TabFeatureLayer.BuildIndexFile(fileName, BuildIndexMode.DoNotRebuild);


I get the following error:
 
  Open failed, the reason is these tab files are not supported by Mitab.
 
I have attached the files. They open correctly in MapInfo ProViewer.
 
Any ideas?
 
Cheers
 
Steve
 



TAB_TEST.zip (3.46 KB)

Hi Steve, 
  
 The fileName must ends with .tab, e.g.  TabFeatureLayer.BuildIndexFile("STrees_Small_Sample.tab"); 
 You might made it to .map right? 
  
 Hope it helps, 
  
 Edgar

Hi Edgar 
  
 File name ends in .tab. Other tab files OK load but this one seems to be a problem.  
  
 The customer says they exported from MapInfo the same way as the other layer that works. Both layers look OK when shown using MapInfo ProViewer. Seems to be something about this file (and others) that MiTab does not like. 
  
 Cheers 
  
 Steve

Hi Steve,
 
This tab file seems to be under a projection, and the unit is meter, I tried this code to display it but it may not be correct. Do you have any ways to get the actual projection info?
 

            winformsMap1.MapUnit = GeographyUnit.DecimalDegree;
            winformsMap1.BackgroundOverlay.BackgroundBrush = new GeoSolidBrush(GeoColor.GeographicColors.ShallowOcean);

            TabFeatureLayer layer = new TabFeatureLayer(@"TAB_TEST\STrees_Small_Sample.tab");
            layer.ZoomLevelSet.ZoomLevel01.DefaultPointStyle = PointStyles.Capital1;
            layer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20;

            ManagedProj4Projection prj = new ManagedProj4Projection();
            prj.InternalProjectionParametersString = ManagedProj4Projection.GetGoogleMapParametersString();
            prj.ExternalProjectionParametersString = ManagedProj4Projection.GetEpsgParametersString(4326);
            layer.FeatureSource.Projection = prj;

            LayerOverlay overlay = new LayerOverlay();
            overlay.Layers.Add(layer);
            winformsMap1.Overlays.Add(overlay);

            layer.Open();
            winformsMap1.CurrentExtent = layer.GetBoundingBox();

            winformsMap1.Refresh();

 
Thanks,
 
Edgar

 Hi Edgar


I'm not sure what you mean by under a projection. I have not encountered this before.


I have attached a tab file that I can load fine. Please can you look to see if this one in under a projection. If not this could be the difference between tab files that work and those that don't.


How would I ask my customer to remove the projection?




Cheers


Steve



Assets.zip (73.8 KB)

 Hi Edgar


Not sure if I correctly zipped the last example.


Have attached another valid tab file set.


Cheers


Steve



TreeMaintAreas.zip (14.2 KB)

Steve, have you missed the tab file? I can’t find it in the zip file, please confirm that. 
 And the projection is the file’s unit belong to, e.g. a file’s projection is Google’s projection, then the coordinates is under Meter unit, not decimal degree, if we want to display this file under decimal degree, we need to set the projection property of the featureSource to tell the program to convert the coordinates from meter to decimal degree. please refer to the code in my previous reply. 
  
 Thanks, 
  
 Edgar

Hi Edgar 
  
 Yes I believe that I missed files out of Assets.zip. I uploaded TreeMaintAreas.zip which should have correct files. 
  
 My customer says that the projection is: 
  
 All our data is in the MGA, Map Grid of Australia Projection,  UTM Zone 55 with Datum GDA 94,  it matches EPSG code 28355 
  
 Cheers 
  
 Steve

Sorry Steve, I can’t see the new zip file, can you re-upload it? 
  
 Thanks, 
  
 Edgar

 Hi Edgar


Have re-attached to this mesage.


Cheers


Steve



001_TreeMaintAreas.zip (14.2 KB)

Thank you for your files Steve, if all the files’ projection code is 28355 from your customers, then you should do something to use the projection or not, here are two scenarios:
 
1. Display the map under DecimalDegree, use this code 

            winformsMap1.MapUnit = GeographyUnit.DecimalDegree;
            winformsMap1.BackgroundOverlay.BackgroundBrush = new GeoSolidBrush(GeoColor.GeographicColors.ShallowOcean);

            TabFeatureLayer layer = new TabFeatureLayer(“TreeMaintenanceAreas.tab”);
            layer.ZoomLevelSet.ZoomLevel01.DefaultAreaStyle = AreaStyles.Country1;
            layer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20;

            ManagedProj4Projection prj = new ManagedProj4Projection();
            prj.InternalProjectionParametersString = ManagedProj4Projection.GetEpsgParametersString(28355);
            prj.ExternalProjectionParametersString = ManagedProj4Projection.GetEpsgParametersString(4326);
            layer.FeatureSource.Projection = prj;

            LayerOverlay overlay = new LayerOverlay();
            overlay.Layers.Add(layer);
            winformsMap1.Overlays.Add(overlay);

            layer.Open();
            winformsMap1.CurrentExtent = layer.GetBoundingBox();

            winformsMap1.Refresh();

 
2. Display the map under Meter, use this code.

            winformsMap1.MapUnit = GeographyUnit.Meter;
            winformsMap1.BackgroundOverlay.BackgroundBrush = new GeoSolidBrush(GeoColor.GeographicColors.ShallowOcean);

            TabFeatureLayer layer = new TabFeatureLayer(“TreeMaintenanceAreas.tab”);
            layer.ZoomLevelSet.ZoomLevel01.DefaultAreaStyle = AreaStyles.Country1;
            layer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20;

            LayerOverlay overlay = new LayerOverlay();
            overlay.Layers.Add(layer);
            winformsMap1.Overlays.Add(overlay);

            layer.Open();
            winformsMap1.CurrentExtent = layer.GetBoundingBox();

            winformsMap1.Refresh();

 
Hope it helps,
 
Edgar

Hi Edgar 
  
 Thanks for the code. 
  
 What I’m wondering is why the last tab files I sent you loads fine without any projection info but the first example (TAB_TEST) does not load. They are both from the same company. 
  
 Also what is the projection code 4326 you loaded? 
  
 Cheers 
  
 Steve

Well, there might be some reasons, the first file is point type so maybe you forgot to set the point style? And the CurrentExtent might be set in a wrong way.  
  
 The 4326 is the standard projection is decimal degree which contains (-180, 90, 180, -90). Normally we display the map in that projection. 
  
 Regards, 
  
 Edgar 


Hi Edgar 
  
 I’m not trying to display the file on a map. I’m trying to build the index using the following command: 
  
  TabFeatureLayer.BuildIndexFile(fileName, BuildIndexMode.DoNotRebuild); 
  
 This fails on the TAB_TEST file but works on the TreeMaint one. This is what I’m trying to figure out. 
  
 Cheers 
  
 Steve

What version are you using? I can get it built in 6.0.157.0. Could you please get and have a try? 
  
 Regards, 
 Edgar

Hi Edgar 
  
 Downloaded and tried 157. Still same issue. 1 line of code:             
  
 TabFeatureLayer.BuildIndexFile(fileName, BuildIndexMode.DoNotRebuild); 
  
 Cheers 
  
 Steve 
  
  


Hi Steve, 
  
 I wrote a sample which uses the 6.0.157.0 and 6.0.0.157  dlls and works fine, and you’ll receive it in your email box later, please get it and have a try. 
  
 Regards, 
  
 Edgar

 Hi Edgar


The sample you sent worked fine on the small file, but I have others it will not run on. I have attached one. Tried against v6.0.157. Same error - 


Open failed, the reason is these tab files are not supported by Mitab.


 


Another small quirk I spotted - when you run this:



 TabFeatureLayer.BuildRecordIdColumn(filename, "RecID", BuildRecordIdMode.Rebuild);


it adds an extra line:


    RecID Char (7) ;


to the end of the tab file even if there is already one there. Each time you run it adds another.


Cheers


Steve



010_009_008_007_006_005_004_003_002_001_TEST.zip (13.2 KB)

Hi Edgar 
  
 It looks like if you just run 
  
             TabFeatureLayer.BuildIndexFile(@“C:\TEST\STrees_25072012.TAB”, BuildIndexMode.DoNotRebuild); 
  
 it works OK 
  
  
 If you run : 
  
             TabFeatureLayer.BuildRecordIdColumn(@“C:\TEST\STrees_25072012.TAB”, “RecID”, BuildRecordIdMode.Rebuild); 
             TabFeatureLayer.BuildIndexFile(@“C:\TEST\STrees_25072012.TAB”, BuildIndexMode.DoNotRebuild); 
  
 It fails on the BuildIndexFile. 
  
 So its not the BuildIndexFile, it’s something the BuildRecordIdColumn does. 
  
 Cheers 
  
 Steve 
  


Hi Edgar 
  
 I know what is causing the problem! 
  
 Below is a tab file. Note the metadata at the end. If you run BuildRecordId against it it adds the RecID line after the metadata. This caused the BuildIndex to fail. 
  
 I get round this by stripping out the metadata before I run BuildRecordIdColumn.  
  
 If you ensure you add the RecID column before the metadata all should be OK. 
  
 !table 
 !version 300 
 !charset WindowsLatin1 
  
 Definition Table 
   Type NATIVE Charset "WindowsLatin1" 
   Fields 33 
     CompKey Char (20) ; 
     AssetGroup Char (20) ; 
     AssetType Char (20) Index 1 ; 
     AssetCode Char (20) ; 
     AssetDescrip Char (50) ; 
     AssetStatus Char (20) ; 
     AssetParent Integer Index 2 ; 
     Owner Char (50) Index 3 ; 
     Maintainer Char (50) Index 4 ; 
     CreationDate Date ; 
     ExpireDate Date ; 
     PropertyID Integer ; 
     Address Char (80) ; 
     LocationDescriptor Char (80) ; 
     ZoneID Integer ; 
     MelwayRef Char (15) ; 
     LocationStatus Char (15) ; 
     Comment Char (254) ; 
     SiteID Integer ; 
     TreeID Integer ; 
     Status Char (50) ; 
     Genus Char (64) ; 
     Species Char (64) ; 
     TreeRisk Char (16) ; 
     Age Char (64) ; 
     Health Char (64) ; 
     Disease Char (50) ; 
     Height Char (50) ; 
     DBH Char (50) ; 
     InBulk Char (10) ; 
     RdsegID Char (10) ; 
     DateDataCapt Date ; 
     SignificantTree Logical ; 
 begin_metadata 
 "\IsReadOnly" = "FALSE" 
 "\MapInfo" = "" 
 "\MapInfo\TableID" = "ac17db58-1cda-422e-87a2-e7907e5e0d9f" 
 end_metadata 
  
 Cheers 
  
 Steve