ThinkGeo.com    |     Documentation    |     Premium Support

Repairing Shapefiles

I am looking for some type of process to repair shapefiles with the .NET tools.  I know there is the MakeValid method for a Feature, but I was wondering if there is something else written in the tools to account for shape count / record count differences or anything else as a whole on repairing corrupt shapefiles.



I have a shapefile in my system that apparently got corrupted somewhere.  Whenever I go to call a…


myCurrentLayer.FeatureSource.GetFeaturesByColumnValue(“mycolumn”“myvalue”, ReturningColumnTypes.AllColumns)

The MapSuiteCore.dll throws a NullReferenceException.  I am wondering if there is a way that I can check a shapefile as a whole to make sure it is a valid shapefile.  I haven’t tried it, but I would guess that since it throws a NullReferenceException on that method, that I wouldn’t be able to get individual features to check the .isValid property of them.  I am running version 8.0.0.0 of the MapSuiteCore and WpfDesktopEdition.



I know there was a bug with Deleting features that was fixed in a later version of the Development branch (assuming it is in the Production branch by now), but is there possibly one in the creation of a shapefile feature too that corrupted my shapefile while it was being used?



My main concern is fixing corrupt shapefiles, and I would be happy if there is some way to check the shapefile components to make sure they were valid.

Hi Brandon, 
  
 I am sorry we don’t have a utility for repair whole corrupt shapefiles. 
  
 You mentioned you cannot call GetFeaturesByColumnValue API for your corrupt shapefile because it will throw exception. I want to make sure have you tried to GetAllFeatures with AllColumns and NoColumns? Because the GetFeaturesByColumnValue is a little special API, if we can get all features, I think we can loop them and do anything we want. 
  
 Regards, 
  
 Don

I am able to grab all the features at once.  I tried grabbing the features for this particular shapefile, iterating through them, and calling  MakeValie()  on each.  After the MakeValie() , I then called  FeatureSource.UpdateFeature() with the feature and committed my transaction . 
  
 After doing that, I tried the same call and still got a NullReferenceException error from the MapSuiteCore.DLL.  Is there a better way to fix features, or something that I am not doing correctly?

Hi Brandon, 
  
 Because we cannot make sure which part of your original file is broken, I think update feature maybe cannot solve problem. 
  
 So have you tried to get all features from original file and just create a new shapefile with the features? 
  
 Regards, 
  
 Don

I haven’t tried creating a new shapefile yet.  I would prefer that to be a last option.  I got another shapefile from my field crew, and it is also having problems.



I have run it through the Check Geometry and Repair Geometry tools within ArcMap, and it did not find any problems with the shapefile.



Would you be able to run it through your end to see if we can narrow down where the problem is?  The query I am running to get the NullReferenceException is:




 myShapefileLayer.FeatureSource.GetFeaturesByColumnValue(“Up_Result”“0”, ReturningColumnsType.AllColumns)

I don’t entirely see where the problem may be.  I would assume since the shapefile was created and edited in software constructed with the .NET tools, it shouldn’t have these types of problems.



I attached a sample shapefile.  Please let me know if you experience similar problems.

002_001_Layer1.zip (105 KB)

Hi Brandon,



Sorry I still haven’t reproduced that in my end.



As below is the simple test code and screen capture for the result.


 ShapeFileFeatureLayer myShapefileLayer = new ShapeFileFeatureLayer(@“D:\tmp4\002_001_Layer1\Layer1.shp”);
            myShapefileLayer.Open();
            Collection<Feature> features = myShapefileLayer.FeatureSource.GetFeaturesByColumnValue(“Up_Result”, “0”, ReturningColumnsType.AllColumns);







Please let me know if I miss any important information.



Regards,



Don