ThinkGeo.com    |     Documentation    |     Premium Support

WorldMap Kit BoundingBox Errors

From working extensively with the latest release of the WorldMap Kit, I have found that the BoundingBox entries are not correct in about 5% of the files.  Could you guys please fix this in the next release?


This is a problem when you do a .Intersects(CurrentExtent), expecting it to tell you the shapefile is not in the view you are looking at.  For example, you could Virginia, and a Kentucky shapefile will be considered to intersect.  Specifically, an example error is in USA/LPT/KYLpt30.



Brian, 
  
 Thanks for your post and sorry for the dealy. 
  
 I think this problem should be fixed in the latest release of WorldMapKit(2009),this problem did exists in world map kit 2006, can you let me know which version of WorldMapKit are you using now? 
  
 Any more questions just feel free to let me know. 
  
 Thanks. 
  
 Yale 


Hello everyone,


I'm new to WorldMapKit. I'm just wondering how's the boundingbox file been generated. How can I add my own layers to WorldMapKit using the SDK? Anyone can provide me a sample? Thanks.


 



Hi Jiong,


Build boundingBox file is easy, it only contains a layer name as key and the boundingBox of the layer as value, you can look at below sample code :


            foreach (WorldMapKitShapeFileFeatureLayer layer in staticLayers)
            {
                RectangleShape boundingBox = layer.GetBoundingBox();
                boundingBox.Id = layer.Name;
                rtreeSpatialIndex.Add(boundingBox);
            }

            foreach (WorldMapKitShapeFileFeatureLayer layer in dynamicLayers)
            {
                RectangleShape boundingBox = layer.GetBoundingBox();
                boundingBox.Id = layer.Name;
                rtreeSpatialIndex.Add(boundingBox);
            }

Thanks


James



Thanks James.  
 Looks like it’s quite straitforward, but I’ve encountered a problem: the code “layer.GetBoundingBox()” always throw an “Null Object reference” exception. The MapSuite I’m using is WPF desktop (V4.5).

Jiong, 
  
 Could you provide the complete stack-trace for the exception? That will help us to find the exactly reason caused this problem. 
  
 Thanks 
 James

James, 
 Below is the exception details: 
 Message = "Object reference not set to an instance of an object." 
 Source = "MapSuiteCore" 
 TargetSite = {ThinkGeo.MapSuite.Core.RectangleShape GetBoundingBoxCore()} 
 StackTrace = "   at ThinkGeo.MapSuite.Core.ShapeFileFeatureSource.GetBoundingBoxCore()\r\n   at ThinkGeo.MapSuite.Core.FeatureSource.GetBoundingBox()\r\n   at ThinkGeo.MapSuite.Core.FeatureLayer.GetBoundingBoxCore()\r\n   at ThinkGeo.MapSuite.Core.Layer.GetBoundingBox()… 
  
 Beside this exception, the code: rtreeSpatialIndex.Add(boundingBox) got the following exception: 
 Message = "Error on delete point." 
 StackTrace = "   at ThinkGeo.MapSuite.Core.RtreeSpatialIndex.InsertRectangle(Double upperLeftX, Double upperLeftY, Double lowerRightX, Double lowerRightY, String rectangleId)\r\n   at ThinkGeo.MapSuite.Core.RtreeSpatialIndex.InsertRectangle(RectangleShape rectangle, Str… 
  


Jiong, 
  
 From the stack-trace, I found the reason is that you need to call Open method before call InsertRectangle for RtreeSpatialIndex. And if second issue fixed, the first issue will be fixed as well. 
  
 We will enhance the exception description to let it more clear. 
  
 Thanks 
 James

Hi James, 
 Yes, I did "Open()". The code is actually looked like: 
 
foreach (WorldMapKitShapeFileFeatureLayer layer in staticLayers)
            {
                layer.Open();
                RectangleShape boundingBox = layer.GetBoundingBox();
                boundingBox.Id = layer.Name;
                rtreeSpatialIndex.Add(boundingBox);
            }



Just realized that I should "Open()" the Rtree, so I added: 
  
 rtreeSpatialIndex.Open();  (before "foreach…" statement) 
  
 but this time I got another exception: (instead of "Error on delete point." exception) 
 Message = "Object reference not set to an instance of an object." 
 StackTrace = "   at ThinkGeo.MapSuite.Core.xa65d8a7495fb9e05.WriteId(String id)\r\n   at ThinkGeo.MapSuite.Core.RtreeSpatialIndex.InsertRectangle(Double upperLeftX, Double upperLeftY, Double lowerRightX, Double lowerRightY, String rectangleId)\r\n   at ThinkGeo.MapSuite… 


Jiong, 
  
 I found xa65d8a7495fb9e05.WriteId(String id) method at our source code, xa65d8a7495fb9e05 couldn’t be null, because it will new to a instance object at constructor of RtreeSpatialIndex, could you provide a sample code that i can reproduce this problem at my local machine? 
  
 Thanks 
 James

James, 
  
 The code is almost there (from yours and added Open()). i.e. 
 
            rtreeSpatialIndex = new RtreeSpatialIndex(Path.Combine(dataFolder, "LayersBoundingBoxes.idx"), RtreeSpatialIndexReadWriteMode.ReadWrite);
            rtreeSpatialIndex.Open();
            foreach (WorldMapKitShapeFileFeatureLayer layer in staticLayers)
            {
                try
                {
                    layer.Open();
                    RectangleShape boundingBox = layer.GetBoundingBox();
                    boundingBox.Id = layer.Name;
                    rtreeSpatialIndex.Add(boundingBox);
                }
                catch (Exception ex)
                {
                }
            }
 


Jiong,


Thanks for your post and feedbacks.
That is wired as I can see it should work as expected. Could you debug all the boundingBox and show them out? Following is the code you can reference:
 

rtreeSpatialIndex = new RtreeSpatialIndex(Path.Combine(dataFolder, "LayersBoundingBoxes.idx"), RtreeSpatialIndexReadWriteMode.ReadWrite);
rtreeSpatialIndex.Open();
foreach (WorldMapKitShapeFileFeatureLayer layer in staticLayers)
{
     try
     {
         layer.Open();
         RectangleShape boundingBox = layer.GetBoundingBox();
         boundingBox.Id = layer.Name;
         string wkt = boundingBox.ToString();
  System.Diagnostics.Debug.WriteLine(wkt);
         rtreeSpatialIndex.Add(boundingBox);
     }
     catch (Exception ex)
     {
     }
 }

 

Besides, the other thing is can you show us the code to create the Rtree files? Now it is only the one to open it.

Any more questions or concerns please do not hesitate to let me know.
 
Thanks.
 
Yale

Yale, 
 I used your code and also included a debug output for stacktrace. I copied some of the debug output lines below: (all the rest are similar): 
  
 
-180.000920081838,90.0001911803346,180.000019306236,-90.0000214543017
A first chance exception of type ‘System.NullReferenceException’ occurred in MapSuiteCore.dll
Object reference not set to an instance of an object.   at ThinkGeo.MapSuite.Core.xa65d8a7495fb9e05.WriteId(String id)
   at ThinkGeo.MapSuite.Core.RtreeSpatialIndex.InsertRectangle(Double upperLeftX, Double upperLeftY, Double lowerRightX, Double lowerRightY, String rectangleId)
   at ThinkGeo.MapSuite.Core.RtreeSpatialIndex.InsertRectangle(RectangleShape rectangle, String rectangleId)
   at ThinkGeo.MapSuite.Core.RtreeSpatialIndex.AddCore(Feature feature)
   at ThinkGeo.MapSuite.Core.SpatialIndex.Add(BaseShape baseShape)
   at CSWpfDesktopEditionSample.WorldMapKitRenderLayer.RebuildBondingBox() in C:\PROJECTS\WorldMapKitDemo\CSWpfDesktopEditionSample\WorldMapKitRenderLayer.cs:line 3377
-180,90,180,-85.582763671875
A first chance exception of type ‘System.NullReferenceException’ occurred in MapSuiteCore.dll
Object reference not set to an instance of an object.   at ThinkGeo.MapSuite.Core.xa65d8a7495fb9e05.WriteId(String id)
   at ThinkGeo.MapSuite.Core.RtreeSpatialIndex.InsertRectangle(Double upperLeftX, Double upperLeftY, Double lowerRightX, Double lowerRightY, String rectangleId)
   at ThinkGeo.MapSuite.Core.RtreeSpatialIndex.InsertRectangle(RectangleShape rectangle, String rectangleId)
   at ThinkGeo.MapSuite.Core.RtreeSpatialIndex.AddCore(Feature feature)
   at ThinkGeo.MapSuite.Core.SpatialIndex.Add(BaseShape baseShape)
   at CSWpfDesktopEditionSample.WorldMapKitRenderLayer.RebuildBondingBox() in C:\PROJECTS\WorldMapKitDemo\CSWpfDesktopEditionSample\WorldMapKitRenderLayer.cs:line 3377
 
  
 Regarding the code to create the Rtree files, this is actually my original question. When I tried the code suggested by James, I found the exceptions. Hope you could help on this. Thanks.

Jiong, 
  
 I am very sure what your problem right now, the idx and ids file is not exist, you need to call our static API to create them at first, CreateRectangleSpatialIndex or CreatePointSpatialIndex RtreeSpatialIndex. it will create both .idx file .ids file And then add record in it. 
  
 Thanks 
 James 


James, 
 Thanks for your advise. Yes, after adding CreateRectangleSpatialIndex(), no NullReferenceException at at ThinkGeo.MapSuite.Core.xa65d8a7495fb9e05.WriteId(String id). During my testing/debug run, sometimes I still got “Error on delete point” exceptions, but no always. I also found that some of the layers if I open it as WorldMapKitShapeFileFeatureLayer, I got the Null reference exception when GetBoundingBox(); but if I open it as ShapeFileFeatureLayer, then it’s ok. Anyway, now I can rebuild the bounding box index file. 
  


Jiong, 
  
 Thanks for your feedback. 
  
 I am not sure if all your problems has been resolved for building the indexes, if not, please provide the shape file for us, we can try to do some tests for you. If you want, please send your shape files to our support (support@thinkgeo.com) and asked to forward to Yale or James. 
  
 Any more questions or concerns please do not hesitate to let me know. 
  
 Thanks. 
  
 Yale 


Yale, 
 Thanks for your help. Now I can rebuild the bounding box index (all the shape files are from world map kit data and I added some testing shape files of my own). What I’ve mentioned in my last post is something I don’t understand (i.e. GetBoundingBox() for WorldMapKitShapeFileFeatureLayer still got exception, while for ShapeFileFeatureLayer is OK). So finally I use  ShapeFileFeatureLayer and solved the problem. 
 Thanks again.

Hi Jiong, 
  
 Great, just feel free to let us know if you have more queries. 
  
 Thanks, 
 Howard