ThinkGeo.com    |     Documentation    |     Premium Support

I have 2 ECW files of 200 mb each and not able to perform zoom in or out

I am not able to do any operations when i use multiple ECW files for projection EPSG:32756. I get an exception- exception of type ‘System.Reflection.TargetInvocationException’ occurred in mscorlib.dll

I have used the same code to display shp and jpeg files which works absolutely fine

Hi Herle, 
  
 I am sorry but your exception message is generally, so we cannot give further suggestion about it, maybe you can try to reinstall our product for make sure all dlls hadn’t missed. 
  
 If you want to get more assistant, please sent your test sample and your data to us, you can contact your sales for get FTP account if the file is big. 
  
 Regards, 
  
 Don 
  


Hi Don, 

I also keep getting “A first chance exception of type ‘System.AccessViolationException’ occurred in MapSuiteECWX86.dll” most of the times and also similar kind of exceptions with other mapsuite dll



Here is the sample WMS code



using ThinkGeo.MapSuite.Core;

using ThinkGeo.MapSuite.WmsServerEdition;



namespace HelloWmsPlugin

{

    public class Countries02Plugin : WmsLayerPlugin

    {

        //Add map file path correctly

        const string worldLayerFilePath1 = @“C:\Maps\ecwMaps\c24349001b_issue4.ecw”;

        EcwRasterLayer worldLayer;

     

        const string worldLayerFilePath2 = @“C:\Maps\ecwMaps\c24349001a_issue4.ecw”;

        EcwRasterLayer worldLayers;



              protected override RectangleShape GetBoundingBoxCore(string crs)

        {

                     return extent;

        }

        public Countries02Plugin()

        {

            worldLayer = new EcwRasterLayer(worldLayerFilePath1);

            checkExtent(worldLayer);

            worldLayers = new EcwRasterLayer(worldLayerFilePath2);

            checkExtent(worldLayers);

        }



        private void checkExtent(EcwRasterLayer worldLayer)

        {

            if (worldLayer.HasBoundingBox)

            {

                worldLayer.Open();

                Proj4Projection projection = new Proj4Projection(4326, 32756);

                projection.Open();

                extent = projection.ConvertToInternalProjection(worldLayer.GetBoundingBox());

                projection.Close();

                worldLayer.Close();



            }

        }



        protected override MapConfiguration GetMapConfigurationCore(string style, string crs)

        {

            // NOTE: Please make sure you are using the absolute file path name, also you can use the relative file path name, 

            // but please remeber the path is relative to the built .dll of the plugin 





            BackgroundLayer backgroundLayer = new BackgroundLayer(new GeoSolidBrush(GeoColor.GeographicColors.ShallowOcean));

            //worldLayer.ZoomLevelSet.ZoomLevel01.DefaultAreaStyle = AreaStyles.Country1;

            //worldLayer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20;

            MapConfiguration mapConfiguration = new MapConfiguration();



            mapConfiguration.Layers.Add(“BackgroundLayer”, backgroundLayer);

            mapConfiguration.Layers.Add(“WorldLayer”, worldLayers);

            mapConfiguration.Layers.Add(“WorldLayers”, worldLayers);



            mapConfiguration.TileCache = new FileBitmapTileCache(@"C:\Maps\ecwMaps");

            mapConfiguration.TileCache.CacheId = “cache”;   



            return mapConfiguration;

        }



        protected override string GetNameCore()

        {

            return “MyMap”;

        }



        protected override System.Collections.ObjectModel.Collection<string> GetProjectionsCore()

        {

            return new System.Collections.ObjectModel.Collection<string> { “EPSG:32756” };



        }



        public RectangleShape extent { get; set; }

    }

}



</string></string>

Hi Herle,  
  
 Thanks for your code, from the exception information it looks it’s an ECW issue but not for your code. 
  
 For ECW issue, we need your data to reproduce that, only code is not helpful. 
  
 Regards, 
  
 Don

Hi Don, 

We already have a product which is running with the older version of thinkgeo (but its Silverlight edition, not wms edition) and there we have absolutely no problem in rendering huge ECW files.  

Now we are trying out WMS version and client as Openlayers3 and could see this issue in the WMS edition of thingeo 9



Please can you share us a sample wms edtion code for ecw files having custom epsg. (apart from 4326)



thank you

Hi Herle, 
  
 I don’t think your code have big problem, our samples are more complex than your requirement, so you can compare the code and learn how to write the plugin from them. You can download related samples from both Product Center and our wiki: wiki.thinkgeo.com/wiki/map_suite_wms_server_edition_all_samples 
  
 I think you are using the latest 9.0 for ECW, so please did a quickly test first to see whether your ecw file still be render well in the new version, you can test the code as below in our other product, which can show the result quickly. If the ecw file don’t render well, that maybe because your dlls in system folder need to get update. 
  
 As below is simple test code for that: 
  
  Map1.MapUnit = GeographyUnit.Meter;

            string worldLayerFilePath1 = @"…test.ecw";
            EcwRasterLayer worldLayer;
            worldLayer = new EcwRasterLayer(worldLayerFilePath1);

            Map1.CurrentExtent = worldLayer.GetBoundingBox();
            LayerOverlay overlay = new LayerOverlay();
            overlay.Layers.Add(worldLayer);

            Map1.Overlays.Add(overlay);

            Map1.Refresh();
 
  
 Regards, 
  
 Don

Hi Don,

I also checked with jp2 files. “A first chance exception of type ‘System.AccessViolationException’ occurred in MapSuiteMrSIDX86.dll” exception comes in the WMS editionFile size is around 150MB


Hi Herle, 



I am sorry we don’t have big ecw file for test, but today I tested a big jp2 file with about 1gb.



As below is the test result:










As below is my test code:



private void DisplayMap_Load(object sender, EventArgs e)


       
{


           
winformsMap1.MapUnit = GeographyUnit.DecimalDegree;


 


           
string
worldLayerFilePath1 = @“C:\Test\Data\World250m4326.jp2”;


 


           
string
worldFilePath = @“C:\Test\Data\World250m4326.j2w”;


 


           
Jpeg2000RasterLayer worldLayer;


           
worldLayer = new Jpeg2000RasterLayer(worldLayerFilePath1,
worldFilePath);           


            worldLayer.Open();


 


           
winformsMap1.CurrentExtent = worldLayer.GetBoundingBox();


           
LayerOverlay overlay = new LayerOverlay();


           
overlay.Layers.Add(worldLayer);


 


           
winformsMap1.Overlays.Add(overlay);


 


           
winformsMap1.Refresh();


       
}




So I think that should caused by the environment.



Please try to download our UnmanageDependecies package and install it ap.thinkgeo.com:5001/fbsharing/djvrXmgN



Regards,



Don






Hi Don, 
Which client was used here ? We use WMS edition and have openLayers3 as well as thinkgeo Silverlight client. Could not work with both. 



needed few clarifications. Is there any change required for using ecw and jp2 file? or will it be exactly same as jpg and shp files? Our sample code works with jpg and shp files. The code which i had posted before was used. When I switch the file, i used to just change the format say Jpeg2000RasterLayer for jp2,  EcwRasterLayer for ecw files, GdiPlusRasterLayer for jpg and ShapeFileFeatureLayer for shp files and update the epsg values as per the file I have. It worked for shp and jpg. So wanted to know if there is any additional thing added for ecw / jp2 files.

I am beginner in this technology.



 

I have attached the small files which I have tested 



Thanks for your support

Hi Herle,



Our render logic is in MapSuiteCore, so any product should can reproduce it.



I am using Dekstop edition for simple, and it looks your jp2 file works well.



You can also try my code in Desktop edition and see whether it met the same problem there.



BTW, have you tried to download the UnmanageDependecies package I provided and install it?







Regards,



Don

We need only the WMS server edition. Can you please try with WMS edition and check it? and client we are using is Openlayers3. It fails when any operation on the maps are done like zoom. (thinkgeo 9, .NetFrameWork 4.5) 
  
 ap.thinkgeo.com:5001/fbsharing/djvrXmgN seems to be not up. please can you provide any other link if available ? 


Hi Herle, 
  
 I think I found your issue here. 
  
 Why your map don’t shows that should because your j2w file contains the extent under 4326, but you put the projection under 32756. 
  
 In my simple sample you can see, if you don’t use proj4 to reprojection, everything shows correct. 
  
 But if you try to convert that you can get the result as below: 
  
             RectangleShape rect = worldLayer.GetBoundingBox(); // rect is {77.6846446036893,12.9265661686138,77.6910534228614,12.9233766005357}

            ManagedProj4Projection proj4 = new ManagedProj4Projection();
            proj4.InternalProjectionParametersString = ManagedProj4Projection.GetDecimalDegreesParametersString();
            proj4.ExternalProjectionParametersString = ManagedProj4Projection.GetEpsgParametersString(32756);
            proj4.Open();

            RectangleShape rect1 = proj4.ConvertToExternalProjection(rect); // rect1 is {-5E-06,5E-06,5E-06,-5E-06}
            RectangleShape rect2 = proj4.ConvertToInternalProjection(rect); // rect2 is {152.999995,-89.999995,153.000005,-90.000005} 
 
  
 If I tried to reprojection it, any try won’t get the map. 
  
 So I think your image should under 4326 and the map unit should be decimal degree. 
  
 BTW, please let me know what’s the ap.thinkgeo.com:5001/fbsharing/djvrXmgN file, our share link is temp link and will expired in some days. 
  
 Regards, 
  
 Don

Hi Herle,  
  
 If you still get the exception, please try to download my file and install it. Today I test the link, it looks ap.thinkgeo.com:5001/fbsharing/djvrXmgN still can be visit, I am sorry we don’t allowed to use any other share utility, so if possible, please try some other ways to download it, for example you can try to use VPN. 
  
 BTW, I think I found another issue in your code.  
  
 I did some test today, and found it’s only shows correct in 4326. Your j2w file should contains the extent which under 4326, but not for 32756.  
  
 As below is my test code, you can put it into DynamicallyDrawOnMapsWmsLayerPlugin in our samples: 
  
 


using System;
using System.Collections.ObjectModel;
using System.Drawing;
using System.IO;
using ThinkGeo.MapSuite.Core;
using ThinkGeo.MapSuite.WmsServerEdition;

namespace WmsPlugins
{
    public class DynamicallyDrawOnMapsWmsLayerPlugin : WmsLayerPlugin
    {
        // This method is only called once per style and crs.  In it you should create your
        // layers and add them to the MapConfiguration.  If you want to use tile caching you
        // can also specif that in the MapConfiguration under the TileCache property.
        // If you have setup multiple styles or projections this method will get called for
        // each unique combination
        protected override MapConfiguration GetMapConfigurationCore(string style, string crs)
        {
            string worldLayerFilePath1 = @“D:\temp\data\HTSL_1.jp2”;

            string worldFilePath = @“D:\temp\data\HTSL_1.j2w”;

            Jpeg2000RasterLayer worldLayer;
            worldLayer = new Jpeg2000RasterLayer(worldLayerFilePath1, worldFilePath);
            worldLayer.Open();

            //extent = worldLayer.GetBoundingBox();

            //BackgroundLayer backgroundLayer = new BackgroundLayer(new GeoSolidBrush(GeoColor.GeographicColors.ShallowOcean));

            MapConfiguration mapConfiguration = new MapConfiguration();

            //mapConfiguration.Layers.Add(“BackgroundLayer”, backgroundLayer);
            mapConfiguration.Layers.Add(“WorldLayer”, worldLayer);

            //mapConfiguration.TileCache = new FileBitmapTileCache(@"C:\Maps\ecwMaps&quot;);
            //mapConfiguration.TileCache.CacheId = “cache”;

            return mapConfiguration;
        }

        // This method gets called on every amp request sent to the server.  In the parameters we pass the
        // map request which includes the bounding box, image size etc.  We also pass you the map configuration
        // which includes all the static layers.  In this method you can make any data changes or do anything
        // dynamic you want
        protected override Bitmap GetMapCore(GetMapRequest getMapRequest, MapConfiguration mapConfiguration, System.Web.HttpContext context)
        {
            // Call the base and render the map image so we can draw on top of it below
            Bitmap bitmap = base.GetMapCore(getMapRequest, mapConfiguration, context);

            // Create a canvas so we can draw on the image
            GdiPlusGeoCanvas canvas = new GdiPlusGeoCanvas();
            canvas.BeginDrawing(bitmap, getMapRequest.BoundingBox, this.GetGeographyUnit(getMapRequest.Crs));
            
            // Draw the text “Watermark” on the image and end drawing
            PointShape centerPoint = getMapRequest.BoundingBox.GetCenterPoint();            
            canvas.DrawTextWithWorldCoordinate(“Watermark”, new GeoFont(“Arial”, 11, DrawingFontStyles.Bold), new GeoSolidBrush(new GeoColor(100, GeoColor.StandardColors.Red)), centerPoint.X, centerPoint.Y, DrawingLevel.LevelOne);            
            canvas.EndDrawing();

            // Return the bitmap we have drawn the watermark on
            return bitmap;
        }

        // In this method you need to return the name of the Layer that WMS will expose.
        // You will use this name on the client to specify the layer you want to consume
        protected override string GetNameCore()
        {
            return “Dynamically Draw On Maps”;
        }

        // In this method you need to return the projections that are supported by your data.
        // It is your responsability to project the data in the MapConfiguration for each projection
        // type you specify here.
        protected override Collection<string> GetProjectionsCore()
        {
            return new Collection<string> { “EPSG:4326” };
        }

        // In this method you need to return the bounding box of the layer.
        protected override RectangleShape GetBoundingBoxCore(string crs)
        {
            return new RectangleShape(77.6846446036893, 12.9265661686138, 77.6910534228614, 12.9233766005357);
        }
    }
}



 
  
  
  
 Regards,  
  
 Don



Hi Don, 

Thanks a lot for the code. yes the fie i had sent you was of 4326 and i was aware of that.  

i could find the root cause and needed your help to know more on it. 



I had used constructor  



public Countries02Plugin() 





worldLayer = new Jpeg2000RasterLayer(worldLayerFilePath1, wLpath); 

worldLayer.Open(); 



extent = worldLayer.GetBoundingBox(); 

worldLayer.Close(); 



and this was causing the issue. if we remove the constructor , as you have implemented, it will take time to load but then never crashes.  

Going forward we may have to use constructor. So can i get any suggestion on this?



And also, if i have a file with different EPSG like 32756, how can i make out the bounding box values.

Hi Herle, 
  
 Have you installed the package and whether it still throw same exception now? 
  
 I modified my code to create a constructor but it still works well: 
  
   public class DynamicallyDrawOnMapsWmsLayerPlugin : WmsLayerPlugin
    {
        Jpeg2000RasterLayer worldLayer;

        public DynamicallyDrawOnMapsWmsLayerPlugin()
        {
            string worldLayerFilePath1 = @"D:\temp\data\HTSL_1.jp2";

            string worldFilePath = @"D:\temp\data\HTSL_1.j2w";

            worldLayer = new Jpeg2000RasterLayer(worldLayerFilePath1, worldFilePath);
            worldLayer.Open();

            worldLayer.Close();
        }

        protected override MapConfiguration GetMapConfigurationCore(string style, string crs)
        {
            MapConfiguration mapConfiguration = new MapConfiguration();

            mapConfiguration.Layers.Add("WorldLayer", worldLayer);

            return mapConfiguration;
        }

        protected override Bitmap GetMapCore(GetMapRequest getMapRequest, MapConfiguration mapConfiguration, System.Web.HttpContext context)
        {
            // Call the base and render the map image so we can draw on top of it below
            Bitmap bitmap = base.GetMapCore(getMapRequest, mapConfiguration, context);

            // Create a canvas so we can draw on the image
            GdiPlusGeoCanvas canvas = new GdiPlusGeoCanvas();
            canvas.BeginDrawing(bitmap, getMapRequest.BoundingBox, this.GetGeographyUnit(getMapRequest.Crs));

            // Draw the text "Watermark" on the image and end drawing
            PointShape centerPoint = getMapRequest.BoundingBox.GetCenterPoint();
            canvas.DrawTextWithWorldCoordinate("Watermark", new GeoFont("Arial", 11, DrawingFontStyles.Bold), new GeoSolidBrush(new GeoColor(100, GeoColor.StandardColors.Red)), centerPoint.X, centerPoint.Y, DrawingLevel.LevelOne);
            canvas.EndDrawing();

            // Return the bitmap we have drawn the watermark on
            return bitmap;
        }

        protected override string GetNameCore()
        {
            return "Dynamically Draw On Maps";
        }

        protected override Collection<string> GetProjectionsCore()
        {
            return new Collection<string> { "EPSG:4326" };
        }

        protected override RectangleShape GetBoundingBoxCore(string crs)
        {
            return new RectangleShape(77.6846446036893, 12.9265661686138, 77.6910534228614, 12.9233766005357);
        }
 
  
  
 Please try the code or modify my code so I can reproduce your issue. 
  
 Regards, 
  
 Don

Hi Don, thank you for the code. but the problem we were having is during fetching the bounding box. I cant hard code the bounding box like this- return new RectangleShape(77.6846446036893, 12.9265661686138, 77.6910534228614, 12.9233766005357); 



I need extents to be fetched when the map and epsg is given. When I tried extent = worldLayer.GetBoundingBox();, I used to get the issues i used to mention before. i cannot do any operations such as pan or zoom. get bounding box will pass the values but I faced the issues. so i want to use both constructors and hardcoding the extents. Any solution for this?  Thanks for the support

Hi Herle, 
  
 I still hadn’t met the issue. 
  
 I did small change for my previous code: 
  
 
 public DynamicallyDrawOnMapsWmsLayerPlugin()
        {
            string worldLayerFilePath1 = @“D:\temp\data\HTSL_1.jp2”;

            string worldFilePath = @“D:\temp\data\HTSL_1.j2w”;

            worldLayer = new Jpeg2000RasterLayer(worldLayerFilePath1, worldFilePath);
            worldLayer.Open();

            rect = worldLayer.GetBoundingBox();

            worldLayer.Close();
        }

 RectangleShape rect = null;

        protected override RectangleShape GetBoundingBoxCore(string crs)
        {
            if (rect == null)
            {
                return new RectangleShape(77.6846446036893, 12.9265661686138, 77.6910534228614, 12.9233766005357);
            }
            else
            {
                return rect;
            }
        }

 
 
  
 It didn’t met any problem. 
  
 So do you think this still be an environment issue? 
  
 Regards, 
  
 Don

Hi Don, i have tried the following way you said… I still got the exceptions which i used to get before. I really have no idea why worldLayer.GetBoundingBox();  giving  trouble to do any operations on the map in my prototype. if i do not use this, there is absolutely no problem. 



If I try to zoom or pan , the exception occurs and crashes. i have attached the code, exception and the  browser screenshot( after the app crashed on a single zoom operation) 

mapload.png (5.46 KB)
code.png (46 KB)
003_exception.png (15.5 KB)

Hi Herle,  
  
 From your mapload.png image, I cannot see clearly about what’s the red watermark on tiles, but I think maybe you are using eval edition and it had expired? 
  
 Have you double check that? 
  
 Regards, 
  
 Don