ThinkGeo.com    |     Documentation    |     Premium Support

The format of the well known binary is incorrect error

I am hoping you can shed some light on this error message I got.  It happens when I am trying to to use ShapeFileFeatureLayer.BuildIndexFile() on my shapefile.  I am not sure what it could be.  I ran it through ArcMap’s Check & Repair Geometry a few times, and it did not find issues but also cannot draw the shapefile properly.  So, something went wrong somewhere with it.  I wanted to try to narrow down the possibilities.



The one thing I can think of that may cause an issue with it was I deleted a feature from the shapefile.  When I deleted, I did this:


parentShapefile.ReadWriteMode = ShapeFileReadWriteMode.ReadWrite
parentShapefile.Open()
parentShapefile.FeatureSource.Open()
parentShapefile.FeatureSource.BeginTransaction()
parentShapefile.FeatureSource.DeleteFeature(selectedFeature.Id)
parentShapefile.FeatureSource.CommitTransaction()
parentShapefile.FeatureSource.Close()
ShapeFileFeatureSource.BuildIndexFile(parentShapefile.ShapePathFileName)



Since that is the one thing I can think of that may cause the issue, I wanted to confirm I had the appropriate process down for removing features from a shapefile.  I have the shapefile attached, and I am using version 8.0.



I have seen some other people mention this issue and one proposed solution back in I believe the 6.0 era was to override those methods that get the features (GetAllFeatures, GetFeaturesByID, etc…) and prior to returning the features, validate and repair each feature.  Is that the better option or is there also a way to repair shapefiles if they need it?





Here is the stack trace for my error:



at ThinkGeo.MapSuite.Core.BaseShape.CreateShapeFromWellKnownData(Byte[] wellKnownBinary)
 at ThinkGeo.MapSuite.Core.ShapeFileFeatureSource.BuildIndexFile(String shapePathFilename, String indexPathFilename, Projection projection, String columnName, String regularExpression, BuildIndexMode buildIndexMode, Encoding encoding)
 at ThinkGeo.MapSuite.Core.ShapeFileFeatureSource.BuildIndexFile(String shapePathFilename, String indexPathFilename, Projection projection, String columnName, String regularExpression, BuildIndexMode buildIndexMode)
 at ThinkGeo.MapSuite.Core.ShapeFileFeatureSource.BuildIndexFile(String shapePathFilename, BuildIndexMode buildIndexMode)





layer1.zip (2.93 KB)

Hi Brandon, 
  
 Thanks for your detail information. 
  
 The problem is when I used your code to delete any feature from “1” to “8” of layer1, the code won’t throw exception when build index. 
  
 I am not sure whether I misunderstand your question. 
  
 My test environment is windows7 x64 with .net 4.0, ThinkGeo 8.0.91.0 dlls. 
  
 Please let me know if I missed key. 
  
 Regards, 
  
 Don 


Hi Don…   
  
 For some reason, when I am using my ThinkGeo based application, it would throw an exception.  When I load the file into ArcMap, ArcMap aborts the drawing. 
  
 I ran the shapefile through Andrew William’s ShapeChecker to compare the header, shx and dbf information for the shapefile.  It found an error in reading Shape 33 in the shp file.  It didn’t give me much more information other than to say it was probably truncated abnormally. 
  
 It seems like that when using the code to delete a feature, the shapefile records were corrupted.  So, what I am looking for is the proper way to use ThinkGeo software to delete features from shapefiles without corrupting them. 
  


Hi Brandon,  
  
 Do you meant we can reproduced the issue: Get exception when we render a shape file via MapSuite WPF edition, the file have been deleted some feature before also by our product. 
  
 Because it looks ShapeChecker you mentioned cannot be found and download now(geocities is closed and Andrew William put his utility there), and I haven’t a installed ArcMap for test today. 
  
 So if we can reproduced that by our product, I think that’s should be very helpful. 
  
 Do you think we can reproduce the exception by your test data layer1.shp? 
  
 Regards, 
  
 Don

Don… Sorry for the delay.



The error should be able to be reproduced on your end.  Whenever I try to use either the FeatureSource or EditTools to delete a feature, I get that error when I try to rebuild the index file on my next load.



Rebuilding…  


ShapeFileFeatureLayer.BuildIndexFile(shapelayer.ShapePathFileName, BuildIndexMode.Rebuild)

Whenever I try to delete a feature, I have tried two ways.  First using the FeatureSource option…




currentLayer.Open()
currentLayer.FeatureSource.Open()
currentLayer.FeatureSource.BeginTransaction()
'I already grabbed the feature from the currentLayer.FeatureSource by searching for a feature with unique identifier
currentLayer.FeatureSource.DeleteFeature(featureToBeDeleted.Id)
currentLayer.FeatureSource.CommitTransaction()
currentLayer.FeatureSource.Close()
currentLayer.Close()

I have also tried using the EditTools option to do the same thing…




currentLayer.Open()
currentLayer.EditTools.BeginTransaction()
currentLayer.EditTools.Delete(featureToBeDeleted.Id)
currentLayer.EditTools.CommitTransaction()
currentLayer.Close()

Either time I use one of those methods, I get the “The format of the well known binary is incorrect” error.



Also, I then try to open the shapefile in ArcMap 9.3.1-10.2.2 and the shapefile will not draw.



The two examples above show me passing in the feature’s ID into the Delete method, but I have also tried it using the feature itself as the parameter.



Is there something wrong with the above code or some other thing I am missing to make this work?  Is there a bug that was introduced into the 8.0 version?  I had used the FeatureSource Delete option previously in the 7.0 builds, but not extensively enough to see if this issue was present there or not.

Hi Brandon, 
  
 It’s proved to be a bug which has been fixed in the lasted version 8.0.116.0 (Development branch), please get it and have another try. 
  
 Thanks, 
 Johnny

I am revisiting this now.  I have version 8.0.143.0, and it seems like the bug is still in there.  We have been doing some testing, and we found that those records in the DBF that have the delete flag are the problem records.  Just for comparison sake, I took a clean shapefile and deleted some features using ArcMap 10.2, and those deleted records were removed from the DBF, not flagged. 
  
 Was the bug related to flagged a shapefile’s DBF or was it related to something else?  It looks like Arcmap doesn’t work well with delete flags.  We still need to use ArcMap in our processes so if the fix is going to leave the flag in there, we will have to pursue other options to ‘delete’ features.

Hi Brandon,



We can recreate your issue with ArcMap but the deleted shapes can shows in Global mapper 15.0, Esri ArcGIS Explorer and Map Window 4.8.8. we are following a specification to delete a feature by modify its flag and we still don’t know why ArcMap can’t recognize this flag.

There is a link about how to delete a feature which is what we do in map suite.

 

Note   The
data in the data file starts at the position indicated in bytes 8 to 9 of the
header record. Data records begin with a delete flag byte. If this byte is an
ASCII space (0x20), the record is not deleted. If the first byte is an asterisk
(0x2A), the record is deleted. The data from the fields named in the field
subrecords follows the delete flag.

 msdn.microsoft.com/en-us/lib…s.71).aspx



I think we will keep researching on this and hope we can get more details on it.

Thanks,

Troy



Do you know if the delete flag is removed when the shapefile is rebuilt using the ShapefileFeatureSource.Rebuild method?  It might be a bit taxing on larger shapefiles to call Rebuild after every ‘delete’, but it still would be something that would allow us to use ArcMap/qGIS for post processing.

Hi Brandon,



No, the flag won’t be removed even we rebuild shape index file, the rebuild only build its index file but the original shape file wouldn’t be modified. I didn’t know why the ArcMap can’t open the deleted shape files but a workaround here is we may recreate a new shape files and then add all the features into this new shape file. But this workaround has a bad performance and I guess it is not fit for you.



Another thing is I tested QGIS 2.4.0, but it still can display the shape files which I deleted some features in it already. would you please verify this?

Thanks,

Troy