ThinkGeo.com    |     Documentation    |     Premium Support

MultiGeorasterLayer - Performance

Hallo,


recently I have downloaded MapSuite Desktop 4.5 Eval-Edition. I try to load some raster-files following your "MultiGeorasterLayer" sample. After a while the images are displayed, but the performance seems very slow. A few years ago I have developed an application based on ESRI-MapObjects. Compared with my new MapSuite Test-Application, the old App ist very faster. Using the "DrawingTime"-Property the new App needs about 90 sec. to display the same Datas and the ESRI's app needs max. 5 sec. I'm using the same values for Lower- and UpperScales in both apps.


Are there any things I can to to increase the performance? Datas: 53 tiff-files with tfw - every imgage file is about 1 MByte


Torsten



Torsten,


Thanks for your post,


I found out where is your problem, when you load the tiff files, you should use the following code to instead of the GdiPlusRasterLayer object:


 



GeoTiffRasterLayer geoRasterLayer = new GeoTiffRasterLayer(yourFile);
geoRasterLayer.LibraryType = GeoTiffLibraryType.UnmanagedLibTiff;

The reason is that the GeoTiffRasterLayer is the professional class to deal with the tiff files, the GdiPlusRasterLayer is just the general class to deal with all images, but it is not the special one for tiff files. Please use this object to try again for your own tiff files,


Thanks,


Scott,



Hello Scott.


thank you for your fast reply. Unfortunatly I got some runtime errors, when I use your suggestion. I got the same errors, when I use my images in your HowDo-Sample "Satelite Image -> LoadAGeoTiffImage".Depending on the Imagesfiles I got "OutOfMemory-Exception" or the following Errormessage "The value -6 is not correct for alpha. Alpha must greater or equal 0 and lower or equal 255." (my translation for the german errormessage).



All the Images are displayed in ESRI's - World (ArcView, ArcMap, and MapObjects). Any other suggestions?


Tanks Torsten


Stacktrace for the "Aplha-error"


   bei System.Drawing.Color.CheckByte(Int32 value, String name)

   bei System.Drawing.Color.FromArgb(Int32 alpha, Int32 red, Int32 green, Int32 blue)

   bei ThinkGeo.MapSuite.Core.ManagedGeoTiffRasterSource.x6af5a581ecd2e3e4(Int32 x2434aab1f3e81535, Int32 xd5d735eaa7ef859e, Int32 xf0ca5ed7845b9192, Int32 xf806d545410d90c1, Int32 xdb846c58acdf5e40, Int32 xdf58594ba412eecf)

   bei ThinkGeo.MapSuite.Core.ManagedGeoTiffRasterSource.x4a80972f7129d9ec(Int32 x2434aab1f3e81535, Int32 xd5d735eaa7ef859e, Int32 xf0ca5ed7845b9192, Int32 xf806d545410d90c1, Int32 xdb846c58acdf5e40, Int32 xdf58594ba412eecf)

   bei ThinkGeo.MapSuite.Core.ManagedGeoTiffRasterSource.GetImageCore(RectangleShape worldExtent, Int32 canvasWidth, Int32 canvasHeight)

   bei ThinkGeo.MapSuite.Core.RasterSource.GetImage(RectangleShape worldExtent, Int32 canvasWidth, Int32 canvasHeight)

   bei ThinkGeo.MapSuite.Core.GeoTiffRasterSource.GetImageCore(RectangleShape worldExtent, Int32 canvasWidth, Int32 canvasHeight)

   bei ThinkGeo.MapSuite.Core.RasterSource.GetImage(RectangleShape worldExtent, Int32 canvasWidth, Int32 canvasHeight)

   bei ThinkGeo.MapSuite.Core.RasterLayer.DrawCore(GeoCanvas canvas, Collection`1 labelsInAllLayers)

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

   bei ThinkGeo.MapSuite.DesktopEdition.LayerOverlay.DrawCore(GeoCanvas canvas)

   bei ThinkGeo.MapSuite.DesktopEdition.Overlay.MainDraw(GeoCanvas canvas)

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

   bei ThinkGeo.MapSuite.DesktopEdition.WinformsMap.x03e3d48bcfe7bb6c(IEnumerable`1 xa6f0db4f183189f1)

   bei ThinkGeo.MapSuite.DesktopEdition.WinformsMap.xff5b27c00f9678c2(RectangleShape x178b193eec228e6e)

   bei ThinkGeo.MapSuite.DesktopEdition.WinformsMap.xe3cee4adb9c72451()

   bei ThinkGeo.MapSuite.DesktopEdition.WinformsMap.x9ac8c50f434f4b39(Int32 xb565f4681f05557a)

   bei ThinkGeo.MapSuite.DesktopEdition.WinformsMap.xc8fbf8304fe7558e(InteractionArguments x195facd4ef5d753d)

   bei ThinkGeo.MapSuite.DesktopEdition.WinformsMap.xfeca3317d3c75bbb(Object xd9272088e65bd176, x6a8380ab1a7ebb4c xc2fd4c0ed406cdb7)

   bei ThinkGeo.MapSuite.DesktopEdition.x5cd462d41be2f68a.OnMouseEvent(x6a8380ab1a7ebb4c e)

   bei ThinkGeo.MapSuite.DesktopEdition.x5cd462d41be2f68a.AnalyseMouseWheel(Double screenX, Double screenY, Double worldX, Double worldY, Int32 delta)

   bei ThinkGeo.MapSuite.DesktopEdition.WinformsMap.xb0cb8571d4771126(Object xd9272088e65bd176, MouseEventArgs xc2fd4c0ed406cdb7)

   bei System.Windows.Forms.Control.OnMouseWheel(MouseEventArgs e)

   bei System.Windows.Forms.Control.WmMouseWheel(Message& m)

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

   bei System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)

   bei System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)

   bei System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)

   bei System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)

   bei System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(IntPtr dwComponentID, Int32 reason, Int32 pvLoopData)

   bei System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)

   bei System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)

   bei System.Windows.Forms.Application.Run(Form mainForm)

   bei CSharpWinformsSamples.Program.Main() in C:\Program Files (x86)\ThinkGeo\Map Suite Desktop Evaluation Edition 4.5\Samples\CSharp Winforms\Program.cs:Zeile 17.

   bei System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)

   bei System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)

   bei Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()

   bei System.Threading.ThreadHelper.ThreadStart_Context(Object state)

   bei System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx)

   bei System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)

   bei System.Threading.ThreadHelper.ThreadStart() 



Torsten,


Thanks for your post and questions.
 
Please set the tile cache system for the target overlay which contains the MultiGeoRasterLayer, it definitely will make the performance better once it is cached.
 

MultiGeoRasterLayer multiGeoRasterLayer = new MultiGeoRasterLayer(@"..\..\Data\referenceFile.txt");
 
LayerOverlay staticOverlay = new LayerOverlay();
staticOverlay.Layers.Add("mulitLayer", multiGeoRasterLayer);
staticOverlay.TileCache = new FileBitmapTileCache(@"..\..\CacheFolder", string.Empty);

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

Hallo Yale,

thank you for your answer. Of course, using TileCache is very usefull and helps a lot. But the drawingtime for uncached maps is not acceptable. I have to develop an application that have to use a lot of tiff-files as background. There is no way to convert them in a different format (like ecw.). When I use GeoTiffRasterLayer the drawingtime is ok, but after zooming "OutOfMemoryExceptions" occurs. These exceptions are not arise when I use GdiPlus-Layers instead. But the drawingtime for uncached Overlays is very bad. In the next two weeks we have to decide for buying MapSuite-DesktopEdition, so please understand may question if there are any plans in your team to revise these behavior.


Regards Torsten



Torsten,


Thanks for your post and question.
 
We implemented the GeoTiffRaster using the GeoLib library, we will take some investigations into the reason about the “OutOfMemoryExceptions”, for now, I guess we cannot do much about it, it would be great to see if it can be fixed in the upgraded version of GeoLib library.
 
About the performance of GdiPlusRasterlayer when loading Tiff image, I will report it to our development team, I am afraid we do not have sufficient time to get it investigated recently as we are busy preparing the public release. After this, hope we can get it enhanced somehow.
 
Any more questions please feel free to let me know.
 
Thanks.
 
Yale

Hallo Yale,

Thanks for your answer. In addition to my reported problems there is a little new one. I got following error if I try to add a single image (as GeoTiffLayer) "The value -52 is invalid for alpha. alpha must being more largely as or equivalent 0 and smaller than or alike 255." Maybe it helps, if I send you the file? If so, how can I do that? The 'problem-files' have filesizes between 1,4 to 2,7 MByte.


Torsten



Torsten,


Thanks for your post and sharing.
 
Please send the file to our support and ask to forward to James and Yale for this post, you can email to support@thinkgeo.com if you want.
 
Any more questions please feel free to let me know.
 
Thanks.
 
Yale

Hi Torsten,


Thanks for your source files and detailed description in your email. I have checked the source files, here are the results:


1. 4029NO_ein.tif  (Error: index out of range-exception)


I can re-produce this issue, but if we use UnmanagedLibTiff to load it, this issue will disappear.


GeoTiffRasterLayer layer = new GeoTiffRasterLayer(@"4029NO_ein.tif", @"4029NO_ein.tfw");
layer.LibraryType = GeoTiffLibraryType.UnmanagedLibTiff;
layer.UpperThreshold = double.MaxValue;
layer.LowerThreshold = 0;


2. gru200.tif (Error: out of memory-exception) and 1O.tif (Error:The value -52 is invalid for alpha. alpha must being more largely as or equivalent 0 and smaller than or alike 255)


I can't re-produce these issues by using the following code; you can use my code snippet to have another try.


GeoTiffRasterLayer layer = new GeoTiffRasterLayer(@"gru200.tif", @"gru200.tfw");
layer.UpperThreshold = double.MaxValue;
layer.LowerThreshold = 0;


Besides, GeoTiffRasterLayer loads *tif into memory once only and never release it until the application is terminated, so it's faster but waste memory. Unlike GeoTiffRasterLayer, GdiPlusRasterLayer dynamically loads *tif into memory and release it after the loading is ended, when you pan/zoom the map, GdiPlusRasterLayer will load/release *.tif multiple times so the speed is pretty slow but it saves memory. So we should balance the memory and speed while using GeoTiffRasterLayer/GdiPlusRasterLayer.


Regards,


Ivan