ThinkGeo.com    |     Documentation    |     Premium Support

Holes in polygon shapefile are being treated as inner rings and not outer rings

I have a shapefile that was being rendered incorrectly in my applicaiton using MapSuite 6.0.0.0.  It has two holes in one polygon, but they are being filled in with the area style, even though they should be holes.  I've attached a picture from MapSuiteExplorer showing how they are filled and another from Arc GIS 10 that shows them being correctly rendered.  I've also attached the shapefile that is exhibiting the problem.


Thanks


Brian





008_007_006_005_004_003_002_001_Test.zip (2.39 KB)

Hello Brian, 
  
 Thanks for your data, I believe this is a shape file format compatible problem, we will dig in and confirm if it’s a bug. 
  
 I will post here to let you know once we have the result. 
  
 Regards, 
  
 Gary

I think Gary is correct…the orientation of interior holes is different between (I think both) SQL geometry and geography and shapefiles. 
  
 The page below discusses the issue.  I think it’s just a difference between shapefiles and more current standards (I’m not implying that there is a shapefile standard!) upon which SQL Server’s geometry and geography types are based. 
  
 alastaira.wordpress.com/2012/01/27/ring-orientation-bigger-than-a-hemisphere-polygons-and-the-reorientobject-method-in-sql-server-2012/ 
  
 Allen

Hi guys,


I tested this file and found there are 3 records in it and the first record is incorrect. It is a MultipolygonShape and it has 3 polygons, but 2 small polygons intersect the bit polygon and we regard the 3 polygons as seperate polygons, so it would not be rendered correctly. If you want to make the feature valid, you can use the following method:




            ShapeFileFeatureLayer layer = new ShapeFileFeatureLayer(@"008_007_006_005_004_003_002_001_Test\Test.shp", ShapeFileReadWriteMode.ReadWrite);
            layer.Open();
            MultipolygonShape invalidShape = layer.QueryTools.GetAllFeatures(ReturningColumnsType.NoColumns)[0].GetShape() as MultipolygonShape;
            layer.Close();
            Feature invalidFeature = invalidShape.GetFeature();
            Feature validatedFeature = invalidFeature.MakeValid();
            validatedFeature.Id = invalidShape.Id;
            layer.Open();
            layer.EditTools.BeginTransaction();
            layer.EditTools.Delete(invalidShape.Id);
            layer.EditTools.Add(validatedFeature);
            layer.EditTools.CommitTransaction();
            layer.Close();

and the it could be rendered correctly.



Regards,


Edgar



Thanks Edgar, 
  
 I’ll see if I can adapt that solution to my project.  I’m using a custom layer to convert an internal layer structure that uses WKB for read only access.  We only use MapSuite for map layout.  ESRI always seems to have tricks up its sleve to auto detect and correct errors in ShapeFiles, surprisingly editing in Arc View and re-saving didn’t cause the ShapeFile to be corrected, which is a normal trick we use. 
  
 Brian

Edgar,


I can't find a MakeValid method on Feature in MapSuite 6 or in the API documentation.  Do I need a specific build to have that method?


Thanks


Brian



 Hello Brian,


 
 MakeValid it's a new feature, so you need upgrade to 6.0.65.0 or higher to use it.
 
 You can visit and check gis.thinkgeo.com/Support/Dis...fault.aspx, there are some new features we just release.
 
 Regards,
 
 Gary

I’m getting a “The evaluation edition has not been installed.” error when running with the latest development build.  Do I need to install an eval version? I have my licensed v6 installed 
  
 Thanks

Hello Brian, 
  
 No you can just use the full dlls not eval dlls, please download the dlls from helpdesk.thinkgeo.com—>My Product Downloads, not Evaluation Daily Builds. 
  
 Let us know if  you still meet problems. 
  
 Regards, 
  
 Gary

Thanks, I completely missed that section in the customer portal.

Thanks Guys, I got that working and it fixed my problem with the hole. 



But have you made some changes to the legend drawing also? The size of the legend images increased and the positions changed.



Hello Brian, 
  
 Yes, we changed LegendItem some styles, but recently we only fixed a text style bug on this, so what’ the previous version you are using before upgrade this time? 
  
 Regards, 
  
 Gary

Hi Gary,


DesktopEdition.dll V5.5.0.91.


I'm doing a lot of automated layout and scaling the pxiel count of the map before getting an image to embed in an Active Reports layout.  I sure I can adjust it, it just caught me by surprise, because the style thumbnails size changed and the text sizes and their positions.


I'm also getting a strange error after rolling my code back to 5.5.0.91 after I found the legend issue and didn't have time to deal with it at the moment.  I think its probably a version mismatch someplace, I have a number of projects used together that reference MapSuite.  This happens when refreshing a map with a legend adonrner, no problems if there is no legend.  I'm going to keep looking for an issue, but just incase you have seen this before.


Thanks


Brian


 


System.ArgumentException occurred

  HResult=-2147024809

  Message=Parameter is not valid.

  Source=System.Drawing

  StackTrace:

       at System.Drawing.Bitmap..ctor(Stream stream)

       at ThinkGeo.MapSuite.Core.GdiPlusGeoCanvas.BeginDrawingCore(Object nativeImage, RectangleShape worldExtent, GeographyUnit drawingMapUnit)

       at ThinkGeo.MapSuite.Core.GeoCanvas.BeginDrawing(Object nativeImage, RectangleShape worldExtent, GeographyUnit drawingMapUnit)

       at ThinkGeo.MapSuite.Core.LegendAdornmentLayer.DrawCore(GeoCanvas canvas, Collection`1 labelsInAllLayers)

       at ThinkGeo.MapSuite.Core.Layer.Draw(GeoCanvas canvas, Collection`1 labelsInAllLayers)

       at ThinkGeo.MapSuite.DesktopEdition.AdornmentOverlay.DrawCore(GeoCanvas canvas)

       at ThinkGeo.MapSuite.DesktopEdition.Overlay.kBQ=(GeoCanvas kRQ=)

       at ThinkGeo.MapSuite.DesktopEdition.Overlay.Draw(GeoCanvas canvas)

       at ThinkGeo.MapSuite.DesktopEdition.WinformsMap.4hM=(Graphics txc=, RectangleShape uBc=, Overlay uRc=)

       at ThinkGeo.MapSuite.DesktopEdition.WinformsMap.0RM=(RectangleShape rRc=)

       at ThinkGeo.MapSuite.DesktopEdition.WinformsMap.HBQ=()

       at ThinkGeo.MapSuite.DesktopEdition.WinformsMap.GBQ=(Int32 4Bc=)

       at ThinkGeo.MapSuite.DesktopEdition.WinformsMap.Refresh()

       at Tcc.Gis.ThinkGeoSupport.ThinkGeoMapManager.Refresh() in e:\TFSSource\TCC\GIS-Arc 10\Tcc.Gis.ThinkGeoSupport\ThinkGeoMapManager.cs:line 138

  InnerException: 

 



I don't think its a version issue.  I verified the same version was referenced everywhere and also tried the 6.0.0.0 build of 6.0 with the same result.  I looked up what could cause that exception in bitmap ctor and its either null stream or to large of png file.  Both seem to be within MapSuite code.  I wonder if its a .net 4.5 issue, I just tried some previously compiled code on my machine (Win 7 with 4.5) and it has the same issue.  But it appears to work correctly on some XP machines with only 4.0 on it.  I was not having this issue with 6.0.117.0 that I was using when testing the shape correction.


I've attached a text file with the full error, stack trace and loaded assemblies.



Full_Error.txt (25.7 KB)

6.0.127.0 appears to be working correctly.  So there might be an issue running MapSuite 5.5 and 6.0 on machines with .net 4.5.

Hello Brian, 
  
 Thanks for your further information, from 5.5 to 6.0, we have upgraded the way to draw with GdiPlusGeoCanvas, and because of this, there is a known issue that legenditem does not obey it’s text style, today we have fixed this in the 6.0.127.0, so looks like it resolve your problem together. 
  
 And for your another question about .Net Framework 4.5, we upgrade the framework from 3.5 to 4.0 just recently, so I don’t think it’s the problem of .Net 4.5 
  
 Let us know your queries. 
  
 Regards, 
  
 Gary