ThinkGeo.com    |     Blog    |     Wiki    |     Support

Reprojecting raster layer

I am having the strangest issue when attempting to reproject a raster image layer. Everything seems to work fine when the code is run locally, but when it’s put into production I get a rather cryptic error that points far into the bowels of MapSuite.Core:



System.ArgumentNullException: Value cannot be null.

Parameter name: ptr

   at System.Runtime.InteropServices.Marshal.GetDelegateForFunctionPointer(IntPtr ptr, Type t)

   at ohM=.jCQ=.jyQ=()

   at ohM=.jCQ=.kCQ=(Bitmap kSQ=, RectangleShape kiQ=, String kyQ=, String lCQ=)

   at ThinkGeo.MapSuite.Core.Proj4Projection.ConvertToExternalProjectionCore(GeoImage image, RectangleShape imageExtent)

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

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

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

   at ThinkGeo.MapSuite.Core.MapEngine.Lx0=(Layer MB0=, Object MR0=)

   at ThinkGeo.MapSuite.Core.MapEngine.Fh0=(IEnumerable`1 Kh0=, Bitmap Kx0=, GeographyUnit LB0=, Boolean LR0=)

   at ThinkGeo.MapSuite.Core.MapEngine.DrawStaticLayers(Bitmap gdiPlusBitmap, GeographyUnit mapUnit)



About the only thing out of the ordinary that I’m doing is using StreamLoading to grab my files instead of direct file path. Again, this works fine on my own machine, so I’m not sure why it would be any different on the production server. If I don’t try to re-project the file, everything works fine as well. Does the conversion to a projection possibly write to a temporary file? The identity the program is being run as is the only thing I could think of that would be different between the environments. I’m hoping someone’s seen SOMETHING like this before, because it would take far too long to put together a simplified example of what I’m doing, I’m afraid. 

-Dustin



Well, it looks like I  wasn’t properly watching my exceptions here. The problem is also happening on my machine when attempting to call MapEngine.DrawStaticLayers(). CPU usage is absolutely pegged.  This only happens when a raster layer has been projected (going from standard projection to EPSG:3857 for what it matters). Shapefile layers projected act perfectly fine.

Hi Dustin, 
  
 We’ve upgraded the raster file rendering system, can you please get the latest 7.0.104.0 and also install the “Map Suite Unmanaged Dependencies” which in the dll package and have a try? If you still have problem, could you please send us the raster file and the sample code you are using? 
  
 Thanks 
  
 Summer

Still no dice, but I’m having trouble reproducing it in a concise way. I’ll try to get something together over the weekend; maybe I’ll figure out the problem in the process.  
 -Dustin

Hi Dustin,  



If there is any trouble to reproduce it or still didn’t figure out the problem, would you please replace the codes in HowDoI sample=>Statellite Image=>LoadAnEcwImage.cs with the attached codes? The attached code works fine in our end. If the attached code can reproduce the issue, then we can narrow down issue and we can guess it is because of some unmanaged dlls are missing or can’t be found somehow. 



Besides, could you please let us know the details of your machine environment? Or does the issue persists no matter the target platform is x86 or x64? 



We still expect you can send us the raster file and the sample code you are using if the problem persists. 



Thanks, 

Johnny

post11531.txt (1.19 KB)

I apologize that this is way later than expected, but I was temporarily moved to another project.  
  
 In attempting to recreate the issue, I discovered that placing the code that was causing my issue in another project was unable to re-create the issue. As such, I’m just going to go ahead an put it in another project and go from there. I’m thinking it might be something .NET related, as the initial project was 4.0 and the new project was 4.5, but who knows. 
  
 Related to this, however, on the current published version of the program (a WMS implementation) it sporadically starts throwing errors: ‘The projection is not open.  Please open it before calling this method.’ when attempting to call DrawStaticLayers on a MapEngine (OpenAllLayers is called just before it). Recycling the application pool seems to resolve the issue for a while, which absolutely baffles me. The project is currently targeting .NET 4.0 and 7.0.0.1 of Map Suite. Since I’m already working on this code, I’d like to make sure it doesn’t keep happening. I was under the impression that ‘OpenAllLayers’ also opened the associated projections. Should I be looping through and opening the layer projections manually, or what is the best way to avoid the error? I guess I’ll handle it both ways, but I guess some clarification on best practices would be nice. Thanks again for your help.  
 -Dustin

Hi Dustin, 
  
 Thanks for your update. Sorry we still haven’t reproduced this issue. 
  
 But we will keep focus on it and fix it when we found where is the problem. 
  
 “OpenAllLayers” should open everything include associated projections, you mentioned recycle application pool resolve the issue, does that means somewhere in your code close the projection? So maybe you can try to trace your projection open status for locate this issue. 
   
 For now, you can loop through and open all the project manually for make sure everything is opened. 
  
 Any question please let me know. 
  
 Regards, 
  
 Don

Hi Don, 
 The layers aren’t closed until after the draw. The code is just Open, Draw, Close with nothing in between. It just seems strange that it eventually stops working, and then continues to not work every call after it. If it were not working from the get-go, I could understand, but having it work for an indeterminate amount of time before breaking is impossible to pinpoint. I’ll go ahead and check the projections are open, it’s not any more work, really. I don’t really need a resolution, I think, just wanted y’all to be aware in case the issue crops up for someone else. Code below, as a sanity check. 
 -Dustin 
  
   try
            {
                MapEngine.OpenAllLayers();
                MapEngine.DrawStaticLayers(resultBitmap, MapRequest.GeographyUnit);
            }
            catch(Exception ex){
               //log
            }
            finally
            {
                MapEngine.CloseAllLayers();
            }


Hi Dustin, 
  
 Thanks for your share. It should be helpful if any other guy met same problem after deploy. 
  
 For now we don’t have more ideas about this problem, but we will let you know if we get any progress about it in future. 
  
 Regards, 
  
 Don