ThinkGeo.com    |     Documentation    |     Premium Support

mapEngine.Draw throws NullReferenceException

I am generating a bitmap  with a number of map layers and my feature layers.


However, many of the map layers throw a NullReferenceException.  I can call the method with each layer one at the time to isolate which ones fail - they all have the same boundingBox parameter (assigned to mapEngine.CurrentExtent).  The .Draw function throws an exception for some map layers when they are the only thing being passed in (i.e., no user defined feature layers).  The layers that are failing may not have any features within the bounding box.


The stack trace is:


Source[2] - MapSuiteCore

Stack Trace[2] -    at ThinkGeo.MapSuite.Core.RtreeSpatialIndex.GetRoot()

   at ThinkGeo.MapSuite.Core.RtreeSpatialIndex.GetRecordIndexesInsideRectangle(Double upperLeftX, Double upperLeftY, Double lowerRightX, Double lowerRightY)

   at ThinkGeo.MapSuite.Core.RtreeSpatialIndex.GetRecordIndexesInsideRectangle(RectangleShape rectangle)

   at ThinkGeo.MapSuite.Core.MultipleShapeFileFeatureSource.GetFeaturesInsideBoundingBoxCore(RectangleShape boundingBox, IEnumerable`1 returningColumnNames)

   at ThinkGeo.MapSuite.Core.FeatureSource.GetFeaturesForDrawing(RectangleShape boundingBox, Double screenWidth, Double screenHeight, IEnumerable`1 returningColumnNames)

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

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

   at ThinkGeo.MapSuite.Core.MapEngine.x2a77eb6032362d14(Layer xa1d467ddfe47b178, Object x65e9a9c6c5e41d97)

   at ThinkGeo.MapSuite.Core.MapEngine.x68ddaa28fe467d0a(IEnumerable`1 xbc8a920bd17eefdf, Bitmap xe10299f210688dae, GeographyUnit x23bf990a35721448, Boolean xa872403da055b02a)

   at ThinkGeo.MapSuite.Core.MapEngine.Draw(IEnumerable`1 layers, Bitmap gdiPlusBitmap, GeographyUnit mapUnit)

   at GetMapImageFromLayers(RectangleShape boundingBox, Double width, Double sizeRatio, Collection`1 layers) 


 


 



Scott, 
  
 According to the stack trace, I think the problem is from the index data when drawing the shape file, so I have two suggestions to you: 
  
 1, Please re-build the index data files for each layer and try again, 
 2, If you still encounter the problem please send your shape files to us, if your shape files are too large to attach to this forum, please send them to support@thinkgeo.com so that we can track your problem properly and found out where is the exact problem. 
  
 Thanks, 
  
 Scott, 
  
  


Is there an easy way to rebuild the index, or do I need to write a program that walks the whole Map Suite World Map Kit 4.5 directory and rebuilds them with the  
 ShapeFileFeatureSource.BuildIndexFile("ShapeFile path name", BuildIndexMode.Rebuild);  
 method?

Scott, 
  
 Thanks for your post and questions. 
  
 One easier way to build index for particular shape files is using the MapSuite Explorer: 
 1)Delete the old index files(idx and ids). 
 2)Drag and drop the target shape file into the MapSuite Explorer and click Yes in the bump up dialog to build index. 
  
 Any more questions please feel free to let me know. 
  
 Thanks. 
  
 Yale 


Thanks. 
  
 The code is 
  MultipleShapeFileFeatureLayer layer = new MultipleShapeFileFeatureLayer( path + "\USA\tlka\??lkaA10.shp", path + "\USA\tlka\lkaA10.midx");
layer.Name = "State Highways";
layer.DrawingQuality = this.drawingQuality;
layer.ZoomLevelSet.ZoomLevel16.DefaultLineStyle = LineStyles.CreateSimpleLineStyle(GeoColor.FromArgb(256, 216, 171, 33), 10, GeoColor.StandardColors.DarkGray, 13, true);
layer.ZoomLevelSet.ZoomLevel16.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20;
 
  
 So I think that I actually need to build a multiple shape file index, which does not currently exist.

Scott,


Thanks for your feedback and information.
 
Then you probably need to build it using the code, please try the following code after deleting the target midx file.
 

MultipleShapeFileFeatureLayer.BuildIndex(path + "\\USA\tlka\\??lkaA10.shp", path + "\\USA\\tlka\\lkaA10.midx");

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

Thanks. 
  
 I have added the following code and changed all new layer assignments to point to it: 
         private static MultipleShapeFileFeatureLayer GetMultipleFileFeatureLayer(string filePattern, string indexPattern, bool useIndexFile)
        {
            Microsoft.Practices.EnterpriseLibrary.Logging.Tracer tracer = new Microsoft.Practices.EnterpriseLibrary.Logging.Tracer(“Profile”);

            using (tracer)
            {
                MultipleShapeFileFeatureLayer layer = null;

                if (useIndexFile)
                {
                    if (!System.IO.File.Exists(indexPattern))
                    {
                        MultipleShapeFileFeatureLayer.BuildIndex(filePattern, indexPattern);
                    }

                    layer = new MultipleShapeFileFeatureLayer(filePattern, indexPattern);
                }
                else
                {
                    layer = new MultipleShapeFileFeatureLayer(filePattern);
                }

                return layer;
            }
        }
 
 
  
 The call to BuildIndex returns immediately, does not throw an exception, and no file is created. 
  
 The application behavior is the same - no maps at high zoom levels. 
  
 I tried it without using the indexes and I get maps (i.e., no black background) but the roads still aren’t shown. 
  
 Note that the shape files aren’t actually in “\USA\tlka\??lkaA10.shp”, they are in “\USA\??\??lkaA10.shp” as they were installed by the world map kit.

 Scott,


 
I tested your code and the midx file can be created properly and the layers can be displayed on the map.  Here is my test code below:
 


winformsMap1.MapUnit = GeographyUnit.DecimalDegree;
            winformsMap1.BackgroundOverlay.BackgroundBrush = new GeoSolidBrush(GeoColor.GeographicColors.ShallowOcean);

            MultipleShapeFileFeatureLayer.BuildIndex(@"C:\ThinkGeo_ChenZhiyong\Development\DesktopEdition\HowDoISamples\SampleData\TLKA\??lkaA10.shp", @"C:\ThinkGeo_ChenZhiyong\Development\DesktopEdition\HowDoISamples\SampleData\TLKA\test.midx");

            MultipleShapeFileFeatureLayer layer = new MultipleShapeFileFeatureLayer(@"C:\ThinkGeo_ChenZhiyong\Development\DesktopEdition\HowDoISamples\SampleData\TLKA\??lkaA10.shp", @"C:\ThinkGeo_ChenZhiyong\Development\DesktopEdition\HowDoISamples\SampleData\TLKA\test.midx");
            layer.ZoomLevelSet.ZoomLevel01.DefaultLineStyle = LineStyles.LocalRoad1;
            layer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20;

            LayerOverlay statesOverlay = new LayerOverlay();
            statesOverlay.Layers.Add(layer);
            winformsMap1.Overlays.Add("StatesOverlay", statesOverlay);
            winformsMap1.CurrentExtent = new RectangleShape(-126.4, 48.8, -67.0, 19.0);

            winformsMap1.Refresh();
  You just need to change the file parttern and index file pattern to yours, then the code can work properly. If you still have the problems in your application can you send us a simple sample so that we can reproduce your problem exactly and help you to resolve it.


Thanks,


Scott,



So you are saying that I need to build the index every time that I load the layer?  That doesn’t seem reasonable. 
  
 Where are your shapefiles?  Are they in TLKA\AL, TLKA\AK, TLKA\AZ, … the way that they are in the World Map Kit or did you move them all to TLKA?

 Scott,


 
You don't need to build the index files every time when you load the layer, you just need to build it one time, so you can use the following code to avoid the re-build operation:
 


MultipleShapeFileFeatureLayer.BuildIndex(@"C:\ThinkGeo_ChenZhiyong\Development\DesktopEdition\HowDoISamples\SampleData\TLKA\??lkaA10.shp", @"C:\ThinkGeo_ChenZhiyong\Development\DesktopEdition\HowDoISamples\SampleData\TLKA\test.midx", BuildIndexMode.DoNotRebuild);
  Also my file path is .......\TLKA\CAlkaA10.shp, but it is just a test on my side, why you are always focus on the file path? It is not important for your issue, you can build the midx index file for each state separately. 


Thanks,


Scott,



Hi Scott, 
  
  If you have file indexes for every shape file (idx) then .BuildIndex(Filename, BuildIndexMode.DoNotRebuild) call is not needed as the index is automatically loaded, right?

You don’t need to build the index files every time when you load the layer, you just need to build it one time,  
 Then why did you suggest that I did? 
  
 Also my file path is …\TLKA\CAlkaA10.shp, but it is just a test on my side, why you are always focus on the file path? It is not important for your issue, you can build the midx index file for each state separately.  
  
 Because i am not convinced that ThinkGeo code with ThinkGeo patterns will work with ThinkGeo shapefiles in the ThinkGeo directory structure.  I started out believing that was true but each of your posts makes me question that more and more.  Please tell me one way or the other. 
  
 Can the MultipleFileFeatureLayer find state files in the directory structure that the World Map Kit installs with?   
 Or do I need to install the World Map Kit and then move the files around on disk (e.g., to match your disk structure) to make it work? 
 Or do I need to manually program the system to determine which state files are relevant for the current bounds and specify those directories?

 Scott,


 
So let us make it more clear, I think you just want to build the index file for each shape file and just build it once. Please use the easiest way to do that, here is the code below:
 


  string[] directories = System.IO.Directory.GetDirectories(@"C:\\Program Files\WorldMapKit\USA\TLKA");
            foreach (string directory in directories)
            {
                string[] files = System.IO.Directory.GetFiles(directory);
                foreach (string file in files)
                {
                    ShapeFileFeatureLayer.BuildIndexFile(file, BuildIndexMode.DoNotRebuild);
                }            
            }
  I set the WorldMapKit folder path to the same as the installation path in the sample above, so you can use the code above directly in your sample to build the index file for each tlkA street file if it dose not exist for each state of USA. I think it is easy to use than the BuildIndexFile method of MultipleShapeFileFeatureLayer.  If you still have any more questions please let us know again,


Thanks,


Scott,



I tried the code, changing the call to 


string[] files = System.IO.Directory.GetFiles(directory, "*.shp");

so that it would not throw an exception on the first call to BuildIndexFile with a filename that is not a shape file.


The code does not appear to do anything - it does not throw an exception and no index files are created.



 Hi Scott,



 


I reproduced your problem by trying to load the shapefiles like this:


var layer = GetMultipleFileFeatureLayer(@"C:\WorldMapKit4.5.120\Geodetic\USA\*lkaA10.shp", 


@"C:\Users\cuipengfei\Desktop\SampleTG\1.midx", true);


The GetMultipleFileFeatureLayer method is the one that you posted earlier.


Then I tried to draw this layer, and I got a NullReferenceException. 


Then I check the output folder, there is no index file generated.


 


Is what I just described similar to the problem you encountered?


If so, I guess I know the reason why this is happening. 


It’s probably because when we use the file name pattern to search for files,


we just search the top level of the root folder while what we should have done is to search all the subdirectories.


I will inform the dev team about this issue, and I will let you know when this is fixed.


 


Regards,


Tsui



Hi Scott, 
  
 We are preparing for the major release in May; it’s very possible that we won’t have time to fix this issue until May 15th, at least. 
 We are sorry for the inconvenience. 
  
 Regards, 
 Tsui

Thanks. 
  
 That looks like my issue (or one that is very closely related).

Hi Scott, 
  
 I created an issue in our issue tracking system; the id is MS3-6751. 
 If you ever want to check on the status of this issue, you can just mention the issue id to our support team. 
  
 Regards, 
 Tsui

Has this been resolved in 5.0.0.55? In the latest 5.0 daily build?


Thanks.



Scott, 
  
 Thanks for your post, I checked the status of issue, it have fixed, so you can get newest version and have a try, I’m sorry we didn’t notice you in time. 
  
 Regards, 
  
 Gary