ThinkGeo.com    |     Documentation    |     Premium Support

HueFamilyAreaStyle bug?

Hey,


I noticed one weird clitch with HueFamilyAreaStyle using Desktop v5.5


If my layer had only polygon geometries, then hue was just fine.


But after I added new geometries to database, using TrackMode.Freehand, it messed things up.


All geometries are showing up just fine until you start zooming in. Actually zooming also works, but when you get close enough, you receive following exception:


System.ArgumentException was unhandled
Message=The feature is invalid in in this style.
Parameter name: features
  Source=MapSuiteCore
  ParamName=features
  StackTrace:
       at ThinkGeo.MapSuite.Core.HueFamilyAreaStyle.DrawCore(IEnumerable`1 features, GeoCanvas canvas, Collection`1 labelsInThisLayer, Collection`1 labelsInAllLayers)
       at ThinkGeo.MapSuite.Core.Style.Draw(IEnumerable`1 features, GeoCanvas canvas, Collection`1 labelsInThisLayer, Collection`1 labelsInAllLayers)
       at ThinkGeo.MapSuite.Core.ZoomLevel.DrawCore(GeoCanvas canvas, IEnumerable`1 features, Collection`1 currentLayerLabels, Collection`1 allLayerLabels)
       at ThinkGeo.MapSuite.Core.ZoomLevel.Draw(GeoCanvas canvas, IEnumerable`1 features, Collection`1 currentLayerLabels, Collection`1 allLayerLabels)
       at ThinkGeo.MapSuite.Core.FeatureLayer.DrawCore(GeoCanvas canvas, Collection`1 labelsInAllLayers)
       at ThinkGeo.MapSuite.Core.Layer.Draw(GeoCanvas canvas, Collection`1 labelsInAllLayers)
       at ThinkGeo.MapSuite.DesktopEdition.LayerOverlay.DrawCore(GeoCanvas canvas)
       at ThinkGeo.MapSuite.DesktopEdition.Overlay.kBQ=(GeoCanvas kRQ=)
       at ThinkGeo.MapSuite.DesktopEdition.Overlay.Draw(GeoCanvas canvas)
       at ThinkGeo.MapSuite.DesktopEdition.WinformsMap.0xM=(IEnumerable`1 rhc=)
       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.ERQ=(InteractionArguments 2xc=)
       at ThinkGeo.MapSuite.DesktopEdition.WinformsMap.8xM=(Object xRc=, 4xU= xhc=)
       at QRQ=.5xQ=.OnMouseEvent(4xU= e)
       at QRQ=.5xQ=.DxU=(Double EBU=, Double ERU=, Double EhU=, Double ExU=, Int32 FBU=)
       at ThinkGeo.MapSuite.DesktopEdition.WinformsMap.2Bc=(Object 2Rc=, MouseEventArgs 2hc=)
       at System.Windows.Forms.Control.OnMouseWheel(MouseEventArgs e)
       at System.Windows.Forms.Control.WmMouseWheel(Message& m)
       at System.Windows.Forms.Control.WndProc(Message& m)
       at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
       at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
       at System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
       at System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)
       at System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(IntPtr dwComponentID, Int32 reason, Int32 pvLoopData)
       at System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
       at System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
       at System.Windows.Forms.Application.Run(Form mainForm)
       at Savcor.Platform.GIS.Tests.Program.Main() in C:\Users\mikko.viitala\Documents\Visual Studio 2010\Projects\Platform\Savcor Technology Platform\Development\Savcor.Platform.GIS.Tests\Program.cs:line 29
       at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
       at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
       at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
       at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
       at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx)
       at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
       at System.Threading.ThreadHelper.ThreadStart()
  InnerException: 

 



 This happens if you specify a AreaStyle and LineStyle e.g.:


 
AreaStyles.CreateHueFamilyAreaStyle(GeoColor.SimpleColors.Green, GeoColor.GeographicColors.Swamp, 255) and 
LineStyles.ContestedBorder2
 
 
If you change AreaStyle to something simpler, then everything is working like a charm.
Also, if you remove either of the styles altogether, and having no DeafultStyle set, everything works.
 
 
Here's screenshot of my little experiments :)
If I keep zooming in, I just chrashes. All styles are same on all zoomlevels.
 

 

 



Ok,


This same bug can be recreated even easier.


 
If you have a layer loaded from Sql Server, having only one row and it's geometry is point, then Mapsuite crashes.
In screenshot below, that "point" is loaded from different table than polygon geometries. It's looking just fine and AreaStyle is set as:
AreaStyles.CreateSimpleAreaStyle(GeoColor.SimpleColors.Green, GeoColor.GeographicColors.Swamp)
 
Of course there is no areas in this table/layer, but if I just change the AreaStyle to:
AreaStyles.CreateHueFamilyAreaStyle(GeoColor.SimpleColors.Green, GeoColor.GeographicColors.Swamp, 255)
 
and run the application again, it crashes on the same exception I posted earlier.
 

 
 
Sql Server table:
 

 

 



Hello Mikko


Thanks for your information, yes the reason is feature only contains one pointshape that does not pass the style validate then throw the exception. As you know, the HueFamilyAreaStyle only make sense when the shape as area.



// check whether feature is area type.
            foreach (Feature feature in features)
            {
                WellKnownType wellKnownType = feature.GetWellKnownType();
                if (wellKnownType == WellKnownType.Polygon || wellKnownType == WellKnownType.Multipolygon)
                {
                    break;
                }
                else
                {
                    throw new ArgumentException(ExceptionDescription.FeatureIsInvalidInThisStyle, "features");
                }
            }

After some discuss, we think we will remove the throw part, just ignore the style apply if the feature is not suitable the style, but before change, you need determine the shape type can do some logic control by yourself, sorry for inconvenience.


Regards,


Gary



Hey, 
  
 Thanks for your reply and the code sample. I can move on with this. 
 In my situation, I’m creating kind of a “map annotation” functionality, where user can draw any kind of geometry and add label to it. All these annotations go to one single table, regardless of the geometry type. So, eventually, I would need hue style for areas, even if I do not have them now. Still, if there is a polygon in that table among other geometries, the exception is thrown as you know.

Hello Mikko, 
  
 You are welcome, please feel free to let us know your questions. 
  
 Regards, 
  
 Gary