ThinkGeo.com    |     Documentation    |     Premium Support

KeyNotFoundException being thrown by WPF Map control

Here's the stack trace from the exception.  This exception happened immediately after zooming out with the mouse wheel.  Any ideas?


   at ThinkGeo.MapSuite.WpfDesktopEdition.Tile.DrawException(GeoCanvas geoCanvas, Exception exception)


   at ThinkGeo.MapSuite.WpfDesktopEdition.Tile.Draw(GeoCanvas geoCanvas)
   at ThinkGeo.MapSuite.WpfDesktopEdition.LayerOverlay.DrawTileCore(Tile tile, RectangleShape targetExtent)
   at ThinkGeo.MapSuite.WpfDesktopEdition.TileOverlay.DrawTile(Tile tile, RectangleShape targetExtent)
   at ThinkGeo.MapSuite.WpfDesktopEdition.TileOverlay.xd5e1aa787b47f5d9(RectangleShape x224aab0b7185a66c)
   at ThinkGeo.MapSuite.WpfDesktopEdition.TileOverlay.DrawCore(RectangleShape targetExtent, OverlayRefreshType overlayRefreshType)
   at ThinkGeo.MapSuite.WpfDesktopEdition.LayerOverlay.DrawCore(RectangleShape targetExtent, OverlayRefreshType refreshType)
   at ThinkGeo.MapSuite.WpfDesktopEdition.Overlay.Draw(RectangleShape targetExtent, OverlayRefreshType refreshType)
   at ThinkGeo.MapSuite.WpfDesktopEdition.WpfMap.xdffbdec6f15e90de(Overlay xa02b1470fea9c9a6, RectangleShape x224aab0b7185a66c, OverlayRefreshType xea455b1d2fcd13a5)
   at ThinkGeo.MapSuite.WpfDesktopEdition.WpfMap.x67118a339906032f(IEnumerable`1 x9ffed0592b3382fa, RectangleShape x224aab0b7185a66c, OverlayRefreshType x2f080d7afcb67ec7)
   at ThinkGeo.MapSuite.WpfDesktopEdition.WpfMap.x67118a339906032f(RectangleShape x224aab0b7185a66c, OverlayRefreshType x2f080d7afcb67ec7)
   at ThinkGeo.MapSuite.WpfDesktopEdition.WpfMap.DrawCore(RectangleShape targetExtent, OverlayRefreshType overlayRefreshType)
   at ThinkGeo.MapSuite.WpfDesktopEdition.WpfMap.Draw(RectangleShape targetExtent, OverlayRefreshType refreshType)
   at ThinkGeo.MapSuite.WpfDesktopEdition.WpfMap.x51d3a13ecd447601(RectangleShape x224aab0b7185a66c)
   at ThinkGeo.MapSuite.WpfDesktopEdition.WpfMap.Refresh()
   at ThinkGeo.MapSuite.WpfDesktopEdition.WpfMap.x39726b531ccf738b(Object xe0292b9ed559da7d, EventArgs xfbf34718e704c6bc)
   at System.Windows.Media.Animation.Clock.RaiseAccumulatedEvents()
   at System.Windows.Media.Animation.TimeManager.RaiseEnqueuedEvents()
   at System.Windows.Media.Animation.TimeManager.Tick()
   at System.Windows.Media.MediaContext.RenderMessageHandlerCore(Object resizedCompositionTarget)
   at System.Windows.Media.MediaContext.AnimatedRenderMessageHandler(Object resizedCompositionTarget)
   at System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs)
   at MS.Internal.Threading.ExceptionFilterHelper.TryCatchWhen(Object source, Delegate method, Object args, Int32 numArgs, Delegate catchHandler)
   at System.Windows.Threading.Dispatcher.WrappedInvoke(Delegate callback, Object args, Int32 numArgs, Delegate catchHandler)
   at System.Windows.Threading.DispatcherOperation.InvokeImpl()
   at System.Threading.ExecutionContext.runTryCode(Object userData)
   at System.Runtime.CompilerServices.RuntimeHelpers.ExecuteCodeWithGuaranteedCleanup(TryCode code, CleanupCode backoutCode, Object userData)
   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.Windows.Threading.DispatcherOperation.Invoke()
   at System.Windows.Threading.Dispatcher.ProcessQueue()
   at System.Windows.Threading.Dispatcher.WndProcHook(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
   at MS.Win32.HwndWrapper.WndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
   at MS.Win32.HwndSubclass.DispatcherCallbackOperation(Object o)
   at System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs)
   at MS.Internal.Threading.ExceptionFilterHelper.TryCatchWhen(Object source, Delegate method, Object args, Int32 numArgs, Delegate catchHandler)
   at System.Windows.Threading.Dispatcher.WrappedInvoke(Delegate callback, Object args, Int32 numArgs, Delegate catchHandler)
   at System.Windows.Threading.Dispatcher.InvokeImpl(DispatcherPriority priority, TimeSpan timeout, Delegate method, Object args, Int32 numArgs)
   at MS.Win32.HwndSubclass.SubclassWndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam)
   at MS.Win32.UnsafeNativeMethods.DispatchMessage(MSG& msg)
   at System.Windows.Threading.Dispatcher.PushFrameImpl(DispatcherFrame frame)
   at System.Windows.Application.RunInternal(Window window)
   at System.Windows.Application.Run()
   at ESMEWorkBench.App.Main() in C:\Projects\ESME Deliverables\ESME WorkBench\obj\Debug\App.g.cs:line 0
   at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
   at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
   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()

David, 
  
 According to the stack track I really cannot find out the problem properly, can you send your whole solution to us so that we can track it exactly? 
  
 Also I want to know what’s the version number of WPF desktop edition did you use? You can get the latest version to try first, 
  
 Thanks, 
  
 Scott,

The solution is really, really large.  I’m using the release build 4.5.0.0 of the control.  I’ll try it against the latest development build and let you know if it still happens. 
  
 Thanks.

 Well, something different is happening with the development build 4.5.184.0


I'm now getting a System.FormatException thrown.  The exception message is "Input string was not in a correct format."


Suggestions appreciated.  I suspect it has something to do with a raster (jpg) being shown on the map, because the crash happens when the application is attempting to display a raster layer.  Is there an example of how to display a raster layer in WPF?  Perhaps the way I was doing it isn't quite right.



   at ThinkGeo.MapSuite.WpfDesktopEdition.Tile.DrawException(GeoCanvas geoCanvas, Exception exception)


   at ThinkGeo.MapSuite.WpfDesktopEdition.Tile.Draw(GeoCanvas geoCanvas)


   at ThinkGeo.MapSuite.WpfDesktopEdition.LayerOverlay.DrawTileCore(Tile tile, RectangleShape targetExtent)


   at ThinkGeo.MapSuite.WpfDesktopEdition.TileOverlay.DrawTile(Tile tile, RectangleShape targetExtent)


   at ThinkGeo.MapSuite.WpfDesktopEdition.TileOverlay.vhQ=(RectangleShape vxQ=)


   at ThinkGeo.MapSuite.WpfDesktopEdition.TileOverlay.DrawCore(RectangleShape targetExtent, OverlayRefreshType overlayRefreshType)


   at ThinkGeo.MapSuite.WpfDesktopEdition.LayerOverlay.DrawCore(RectangleShape targetExtent, OverlayRefreshType refreshType)


   at ThinkGeo.MapSuite.WpfDesktopEdition.Overlay.Draw(RectangleShape targetExtent, OverlayRefreshType refreshType)


   at ThinkGeo.MapSuite.WpfDesktopEdition.WpfMap.WhU=(Overlay XRU=, RectangleShape XhU=, OverlayRefreshType XxU=)


   at ThinkGeo.MapSuite.WpfDesktopEdition.WpfMap.Refresh(Overlay redrawOverlay)


   at ESMEWorkBench.ViewModels.Map.MapViewModel.set_Experiment(Experiment value) in C:\Projects\ESME Deliverables\ESME WorkBench\ViewModels\Map\MapViewModel.cs:line 196




 OK I got it working again, so never mind.


It appears that this example is no longer valid under the current build.  Instead, I write out a world file to the same directory as my raster file, named appropriately (.bmp for the raster, and .bpw for the world file, in this case).  Then I just do this:



_layer = new GdiPlusRasterLayer(_rasterFilename, new RectangleShape(west, north, east, south))
                         {
                             UpperThreshold = double.MaxValue,
                             LowerThreshold = 0,
                             IsGrayscale = false
                         };

I left out the StreamLoading stuff from the above-linked example completely.


This is, in my not-very-humble opinion, an egregious kludge.  Please tell me if there's a more elegant way!  Ideally I would like to be able to load the BMP from a memory stream with just the north, south, east and west coordinates and not have to provide a world file.  If that's not possible, then I'd like to be able to load the world file from a memory stream also.  This was working in the 4.5.0.0 build.  Why isn't it now?



David, 
  
 I just tested it, it worked fine, maybe I misunderstood anything what you said, can you give us your whole code snippet for this issue? Also if it is possible attach the image files to us, 
  
 Thanks, 
  
 Scott,

The example I posted does work, I am not disputing that.  My complaint is basically that it seems I have no choice but to write the BMP file and the BPW files out to disk instead of being able to provide them to the library routines via an object in memory.

 Hi David,



If you want to load a bmp file without the world file, you can do it like this:


wpfMap1.MapUnit = GeographyUnit.DecimalDegree;


 


            WorldMapKitWmsWpfOverlay worldMapKitOverlay = new WorldMapKitWmsWpfOverlay();


            wpfMap1.Overlays.Add(worldMapKitOverlay);


 


            GdiPlusRasterLayer bmpLayer = new GdiPlusRasterLayer(@"C:\Users\cuipengfei\Desktop\temp\Unknown.bmp",


                                                                 new RectangleShape(-10, 10, 10, -10));


 


            LayerOverlay layerOverlay = new LayerOverlay();


            layerOverlay.Layers.Add("WorldLayer", bmpLayer);


 


            wpfMap1.Overlays.Add(layerOverlay);


 


            wpfMap1.CurrentExtent = new RectangleShape(-133.2515625, 89.2484375, 126.9046875, -88.290625);


            wpfMap1.Refresh();


 


The bmp file named “Unknown” has no world file associated with it, and this sample code worked like this:



We can see that the image is displayed at the west coast of Africa, which is where [10, 10, 10, -10] is supposed to be located.


 


And I will inform the dev team of the streaming issue.


 


Regards,


Tsui



Hi David, 
  
 About creating a layer by using a stream, I created an issue in our issue tracker system for that; the id of that issue is MS3-6750. 
  
 If you want to check on the status of that issue in the feature, you can just mention MS3-6750 to our support team, they’ll understand what that means. 
  
 But I would not expect that issue to be fixed very soon, because we are preparing for a major release in this month. 
 Please let us know if you have any other questions. 
  
 Regards, 
 Tsui

Guys, 
  
 I think this issue has already been fixed in latest public release 5.0, please get the new version dll and try it again. 
  
 Thanks, 
 James