ThinkGeo.com    |     Documentation    |     Premium Support

Unhandled Exception after loading ECW image

Hi,

I am loading few layers on the map like shape files and image files. Once I add an ECW file, and it loads it, the application hangs. When I try to debug, it throws an error. The error does not occur within the function. It happens after loading the file.

I am attaching the screenshots. 

What could be the possible reason? Could it be because I am changing the projection? This is the code I am using:


public void LoadECWImage(string strFilename)
        {
            try
            {
               
                EcwRasterLayer ecwImageLayer = new EcwRasterLayer(strFilename);
                ecwImageLayer.UpperThreshold = double.MaxValue;
                ecwImageLayer.LowerThreshold = 0;
               // ecwImageLayer.Transparency = 30;
                ecwImageLayer.ImageSource.Projection = proj4;
 
                LayerOverlay EcwOverlay = new LayerOverlay();
 
 
                if (strOverlayTimeConstant == “True”)
                {
                    EcwOverlay.Layers.Add(“EcwLayer” + strdateTimeNow, ecwImageLayer);
                    wpfMap1.Overlays.Add(“EcwOverlay” + strdateTimeNow, EcwOverlay);
                    wpfMap1.Overlays[wpfMap1.Overlays.Count - 1].Name = “EcwOverlay” + strdateTimeNow;
                }
                else
                {
                    //strdateTimeNow = DateTime.Now.ToString().Replace(’/’, ‘_’).Replace(’:’, ‘_’);
                    strdateTimeNow = DateTime.Now.ToString(“ddMMyyyyhhmmssffff”);
                    EcwOverlay.Layers.Add(“EcwLayer” + strdateTimeNow, ecwImageLayer);
                    wpfMap1.Overlays.Add(“EcwOverlay” + strdateTimeNow, EcwOverlay);
                    wpfMap1.Overlays[wpfMap1.Overlays.Count - 1].Name = “EcwOverlay” + strdateTimeNow;
                }
 
                if (strOverlayTimeConstant == “False”)
                {
                    wpfMap1.Refresh();
                }
 
                int intOverlayIndex = wpfMap1.Overlays.IndexOf(EcwOverlay);
                dtOverlayList.Rows.Add(“EcwOverlay” + strdateTimeNow, intOverlayIndex);
 
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString());
            }
 
        }





Thanks,

Jacob

Error_Stack_Trace.txt (3.14 KB)

Hi Aji, 
  
 Thanks for your code snippet.  
  
 We add this snippet to our project and add some other shapefile layers, but we still cannot reproduce the exception you mentioned.  
  
 Then we found that if the ECW file path is incorrect, an exception will be thrown out, and the stack trace of exception looks very similar with yours. So please double-check the “strFilename” with correct value and try that again. 
  
 If the issue still persist, would you mind to provide us a demo for reproduce it? 
  
 Thanks, 
  
 Kevin

Hi,



What I noticed is that if there are ECW files alone, then there are no issues. When I load a MrSID file and ECW file together, it gives the exception.



I strongly feel it has something to do with the projection also because when I remove the ECW and MrSID Layer.ImageSource.Projection = proj4 assignment, it does not throw an error, but displays in wrong projection. I need to show them using Proj4Projection.



Below is the code for loading ECW and MrSID files. Please note that only if both are loaded, the error is thrown. ECW files alone or MrSID files alone does not throw any error even with Proj4Projection.




public void LoadECWImage(string strFilename)
        {
            try
            {
                  EcwRasterLayer ecwImageLayer = new EcwRasterLayer(strFilename);
                //ecwImageLayer.UpperThreshold = double.MaxValue;
                //ecwImageLayer.LowerThreshold = 0;
                //// ecwImageLayer.Transparency = 30;
                ecwImageLayer.ImageSource.Projection = proj4;
                LayerOverlay EcwOverlay = new LayerOverlay();
 
                if (strOverlayTimeConstant == “True”)
                {
                    EcwOverlay.Layers.Add(“EcwLayer” + strdateTimeNow, ecwImageLayer);
                    wpfMap1.Overlays.Add(“EcwOverlay” + strdateTimeNow, EcwOverlay);
                    wpfMap1.Overlays[wpfMap1.Overlays.Count - 1].Name = “EcwOverlay” + strdateTimeNow;
                }
                else
                {
                    //strdateTimeNow = DateTime.Now.ToString().Replace(’/’, ‘_’).Replace(’:’, ‘_’);
 
                    uniqueNumOverlay = uniqueNumOverlay + 1;
 
                    strdateTimeNow = DateTime.Now.ToString(“ddMMyyyyhhmmssffff”) + uniqueNumOverlay.ToString();
 
                    EcwOverlay.Layers.Add(“EcwLayer” + strdateTimeNow, ecwImageLayer);
                    wpfMap1.Overlays.Add(“EcwOverlay” + strdateTimeNow, EcwOverlay);
                    wpfMap1.Overlays[wpfMap1.Overlays.Count - 1].Name = “EcwOverlay” + strdateTimeNow;
                }
 
                if (strOverlayTimeConstant == “False”)
                {
                     wpfMap1.Refresh();
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString());
            }
      }
 
 
public void LoadMrSidImage(string strFilename)
        {
            try
            {
                MrSidRasterLayer sidImageLayer = new MrSidRasterLayer(strFilename);
                //sidImageLayer.UpperThreshold = double.MaxValue;
                //sidImageLayer.LowerThreshold = 0;
                //// sidImageLayer.Transparency = 80;
               sidImageLayer.ImageSource.Projection = proj4;
 
                LayerOverlay SidOverlay = new LayerOverlay();
 
                if (strOverlayTimeConstant == “True”)
                {
                    SidOverlay.Layers.Add(“SidLayer” + strdateTimeNow, sidImageLayer);
                    wpfMap1.Overlays.Add(“SidOverlay” + strdateTimeNow, SidOverlay);
                    wpfMap1.Overlays[wpfMap1.Overlays.Count - 1].Name = “SidOverlay” + strdateTimeNow;
                }
                else
                {
                    //strdateTimeNow = DateTime.Now.ToString().Replace(’/’, ‘_’).Replace(’:’, ‘_’);
                    uniqueNumOverlay = uniqueNumOverlay + 1;
                    strdateTimeNow = DateTime.Now.ToString(“ddMMyyyyhhmmssffff”) + uniqueNumOverlay.ToString();
                    SidOverlay.Layers.Add(“SidLayer” + strdateTimeNow, sidImageLayer);
                    wpfMap1.Overlays.Add(“SidOverlay” + strdateTimeNow, SidOverlay);
                    wpfMap1.Overlays[wpfMap1.Overlays.Count - 1].Name = “SidOverlay” + strdateTimeNow;
                }
                if (strOverlayTimeConstant == “False”)
                {
                         wpfMap1.Refresh();
                  }
                }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString());
            }
        }

I have attached the ecw and sid file with this mail.  World_-_Copy.ecw.txt (rename to World_-_Copy.ecw) and World_-_Copy.sid.txt  (rename to World_-_Copy.sid) 

Thanks,

Jacob

World_-Copy.ecw.txt (184 KB)
World-_Copy.sid.txt (73.2 KB)

Hi Jacob, 
  
 Thanks for your detail code and data, I have some question for you. 
  
 I tested by you code, but it looks the ecw and mrsid files don’t have projection information embedded in it, so I don’t know how to assign projection for them. Without a correct extent, I also cannot see ecw shape or mrsid shape by default. 
  
 I found a possible problem, if your mrsid and ecw file don’t have the same original projection, I think you cannot assign the same proj4 to them, because the InternalProjectionParametersString should be different. 
  
 If that’s not the problem, could you please help me to modify the simple test code as below for reproduce that? 
  
 Regards, 
  
 Don 
  
  
  
  
  

using System;
using System.Windows;
using System.Windows.Controls;
using ThinkGeo.MapSuite.Core;
using ThinkGeo.MapSuite.WpfDesktopEdition;

namespace CSHowDoISamples
{
    public partial class DisplayASimpleMap : UserControl
    {
        public DisplayASimpleMap()
        {
            InitializeComponent();
        }

        private void WpfMap_Loaded(object sender, RoutedEventArgs e)
        {
            LoadECWImage(@“D:\World_-_Copy.ecw”);
            LoadMrSidImage(@“D:\World_-_Copy.sid”);

            //proj4.InternalProjectionParametersString = ;
            //proj4.ExternalProjectionParametersString = ;

            Map1.MapUnit = GeographyUnit.Meter;
            Map1.CurrentExtent = new RectangleShape(-200000, 200000, 200000, -200000);

            Map1.Refresh();
        }

        private Proj4Projection proj4 = new Proj4Projection();

        public void LoadECWImage(string strFilename)
        {
            try
            {
                EcwRasterLayer ecwImageLayer = new EcwRasterLayer(strFilename);
                ecwImageLayer.Open();
                //ecwImageLayer.ImageSource.Projection = proj4;
                LayerOverlay EcwOverlay = new LayerOverlay();

                //string text = ecwImageLayer.ImageSource.GetProjectionText();

                EcwOverlay.Layers.Add(“EcwLayer”, ecwImageLayer);
                Map1.Overlays.Add(“EcwOverlay”, EcwOverlay);

                //Map1.CurrentExtent = ecwImageLayer.GetBoundingBox();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString());
            }
        }

        public void LoadMrSidImage(string strFilename)
        {
            try
            {
                MrSidRasterLayer sidImageLayer = new MrSidRasterLayer(strFilename);
                sidImageLayer.Open();
                //sidImageLayer.ImageSource.Projection = proj4;

                //string text = sidImageLayer.ImageSource.GetProjectionText();

                LayerOverlay SidOverlay = new LayerOverlay();

                SidOverlay.Layers.Add(“SidLayer”, sidImageLayer);
                Map1.Overlays.Add(“SidOverlay”, SidOverlay);

                Map1.CurrentExtent = sidImageLayer.GetBoundingBox();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString());
            }
        }
    }
}


Hi Don, 
  
 The ECW and SID images had the same projection. 
  
 I was comparing the code that you sent and mine… I just noticed that I had omitted the ecwImageLayer.Open(); and sidImageLayer.Open(); statements. Once I added those it is working perfect. 
  
 Thank you for the support. 
  
 Jacob

Hi Jacob, 
  
 I am glad to hear you find the reason and solved that. 
  
 Any question please let us know. 
  
 Regards, 
  
 Don