ThinkGeo.com    |     Documentation    |     Premium Support

GetBoundingBox with WMSRasterLayer

Hi,


I have an application that allows saving of the map state (all layers, symbols, etc.) using serialization. Everything is working just fine. However, when I deserialize a WMSRasterLayer the GetBoundingBox method no longer works. It fails with the following:


System.NullReferenceException was unhandled

  Message=Object reference not set to an instance of an object.

  Source=MapSuiteCore

  StackTrace:

       at ThinkGeo.MapSuite.Core.WmsRasterSource.GetBoundingBoxCore()

       at ThinkGeo.MapSuite.Core.RasterSource.GetBoundingBox()

       at ThinkGeo.MapSuite.Core.RasterLayer.GetBoundingBoxCore()

       at ThinkGeo.MapSuite.Core.Layer.GetBoundingBox()

       at MapUtilities.frmLayerProperties.mPopulateLayerExtent() in C:\Silvics\VS 2010 Projects\GeoFrame\MapUtilities\Forms\frmLayerProperties.vb:line 668

       at MapUtilities.frmLayerProperties.frmLayerProperties_Load(Object sender, EventArgs e) in C:\Silvics\VS 2010 Projects\GeoFrame\MapUtilities\Forms\frmLayerProperties.vb:line 95

       at System.EventHandler.Invoke(Object sender, EventArgs e)

       at System.Windows.Forms.Form.OnLoad(EventArgs e)

       at System.Windows.Forms.Form.OnCreateControl()

       at System.Windows.Forms.Control.CreateControl(Boolean fIgnoreVisible)

       at System.Windows.Forms.Control.CreateControl()

       at System.Windows.Forms.Control.WmShowWindow(Message& m)

       at System.Windows.Forms.Control.WndProc(Message& m)

       at System.Windows.Forms.ScrollableControl.WndProc(Message& m)

       at System.Windows.Forms.Form.WmShowWindow(Message& m)

       at System.Windows.Forms.Form.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.SafeNativeMethods.ShowWindow(HandleRef hWnd, Int32 nCmdShow)

       at System.Windows.Forms.Control.SetVisibleCore(Boolean value)

       at System.Windows.Forms.Form.SetVisibleCore(Boolean value)

       at System.Windows.Forms.Control.set_Visible(Boolean value)

       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.RunDialog(Form form)

       at System.Windows.Forms.Form.ShowDialog(IWin32Window owner)

       at System.Windows.Forms.Form.ShowDialog()

       at MapUtilities.LayerUtils.SetLayerProperties(SilvicsTOCNode oNode, CustomWinformsMap oMap, Boolean& bTOCUpdateNeeded) in C:\Silvics\VS 2010 Projects\GeoFrame\MapUtilities\Classes\LayerUtils.vb:line 697

       at GeoFrame.frmMain.mHandleFrameworkToolClick(ToolBase oTool) in C:\Silvics\VS 2010 Projects\GeoFrame\GeoFrame\Forms\frmMain.vb:line 853

       at GeoFrame.frmMain.ToolbarsMgr_ToolClick(Object sender, ToolClickEventArgs e) in C:\Silvics\VS 2010 Projects\GeoFrame\GeoFrame\Forms\frmMain.vb:line 731

       at Infragistics.Win.UltraWinToolbars.UltraToolbarsManager.OnToolClick(ToolClickEventArgs e)

       at Infragistics.Win.UltraWinToolbars.UltraToolbarsManager.FireEvent(ToolbarEventIds id, EventArgs e)

       at Infragistics.Win.UltraWinToolbars.ToolBase.OnToolClick()

       at Infragistics.Win.UltraWinToolbars.ToolMenuItem.OnClick()

       at Infragistics.Win.UltraWinToolbars.PopupMenuItemUIElement.DoClickProcessing(MouseEventArgs e)

       at Infragistics.Win.UltraWinToolbars.PopupMenuItemUIElement.OnMouseUp(MouseEventArgs e)

       at Infragistics.Win.TextUIElementBase.OnMouseUp(MouseEventArgs e)

       at Infragistics.Win.ControlUIElementBase.ProcessMouseUpHelper(Object sender, MouseEventArgs e)

       at Infragistics.Win.ControlUIElementBase.ProcessMouseUp(Object sender, MouseEventArgs e)

       at Infragistics.Win.Utilities.ProcessEvent(Control control, ProcessEvent eventToProcess, EventArgs e)

       at Infragistics.Win.UltraWinToolbars.PopupControlBase.OnMouseUp(MouseEventArgs e)

       at System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)

       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(ApplicationContext context)

       at Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.OnRun()

       at Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.DoApplicationModel()

       at Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.Run(String[] commandLine)

       at GeoFrame.My.MyApplication.Main(String[] Args) in 17d14f5c-a337-4978-8281-53493378c1071.vb:line 81

       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: 


I have no problem with GetBoundingBox after adding the layer to the map, only after it has been deserialized. The layer displays fine following deserialization.


Any ideas?


Thanks,


Steve


 



Steve, 
  
 Can you proved a simple sample to us so that we can re-create your problem exactly, from the stack track information we cannot find out the exact problem in our core code, it just listed a little information for our code below: 
  
 at ThinkGeo.MapSuite.Core.WmsRasterSource.GetBoundingBoxCore() 
 at ThinkGeo.MapSuite.Core.RasterSource.GetBoundingBox() 
 at ThinkGeo.MapSuite.Core.RasterLayer.GetBoundingBoxCore() 
 at ThinkGeo.MapSuite.Core.Layer.GetBoundingBox() 
  
 So we just know the problem is from the GetBoundingBoxCore method in the WmsRasterSoure class, we need to find out the problem from two ways: 
  
 1, Core code, if the problem is from the core code we need a sample to re-create it, as so far I cannot re-produce your problem exactly, 
 2, Your shape file, we have to determin your shape file is correct, 
  
 Thanks, 
  
 Scott, 


Scott,


Thanks for the reply. I have uploaded a sample project that should make it easy for you to reproduce the issue. I am using the full version of MS Desktop, 4.5.60.0. When you run the project, you should first click the step 1 button which will load a WMS layer. Then hit button number 2 which serializes the layer. Then hit button 3 to close the layer. Button 4 deserializes and loads the WMS layer. Then you can hit button 5 which calls GetBoundingBox (unsuccessfully) on the WMS layer.


Thanks,


Steve



SerializeWMSLayer.zip (60.7 KB)

Steven,


Thanks for your post and questions, your sample is critical helpful to identify the problem.
 
I think this should be a bug for the WmsRasterSource, I will report to our development team to get it fixed as soon as possible. For now, following workaround should work for your, sorry for the inconvenience for now.
 

Dim oWMSLayer As WmsRasterLayer
 
'***** Open a file stream to use for deserialization
oFormatter = New BinaryFormatter()
oStream = New FileStream(sFileName, FileMode.Open, FileAccess.Read, FileShare.Read)
 
oObjLayer = oFormatter.Deserialize(oStream)
oWMSLayer = CType(oObjLayer, WmsRasterLayer)
 
Dim newWmsDeserializedLayer As WmsRasterLayer = New WmsRasterLayer(oWMSLayer.Uri, oWMSLayer.Proxy)
newWmsDeserializedLayer.Open()
 
Dim oLayerOverLay As LayerOverlay = CType(WinformsMap1.Overlays(0), LayerOverlay)
 
oLayerOverLay.Layers.Add(oWMSLayer.Name, newWmsDeserializedLayer)

 
Any more questions please feel free to let me know.
 
Thanks.
 
Yale

Yale, 



Thanks for acknowledging the bug and thanks for the workaround, it works fine!


NOTE: You must also remember to add the layers to the new WMS layer, something like this:



For Each s As String In oWMSLayer.ActiveLayerNames
   newWmsDeserializedLayer.ActiveLayerNames.Add(s)
Next s

Thanks again!

 Steve


 



Steve, 
  
 We have fixed this bug in the core code, please get the latest version from the DailyBuild of development branch, also we used your sample application to test the correction, your problem has been resolved correctly, 
  
 Thanks, 
  
 Scott,

Thanks very much, works great! 
  
 Steve

Steve, 
  
 Thanks for letting us know your status. 
  
 Thanks. 
  
 Yale