ThinkGeo.com    |     Documentation    |     Premium Support

GetBoundingBox

 I can't tell exactly since which version it is happening but a GetBoundingBox() on an sql2008 layer overlay fails with this error:



Expiration du Timeout. Le délai d'attente s'est écoulé avant la fin de l'opération ou le serveur ne répond pas.


.Net SqlClient Data Provider


Void OnError(System.Data.SqlClient.SqlException, Boolean)


System.Collections.ListDictionaryInternal


 


And the same application was working great with older versions...


 


Did you heard of other problems with GetBoundingBox ?


 


Thanks




Gautier, 
  
 Thank you for your post. 
  
 Could you remember which version is the your old version? And which version is you use now? 
  
 You can get the version by right click the dll and see the property. 
  
 Regards, 
  
 Gary

Now I use 5.0.75 



Old version I think is 4.5.xx ?



Gautier, 
  
 Thank you for your feedback, we didn’t change the method GetBoundingBox between 4.5 to 5.0. 
  
 Could you please provide a sample that we can review the code and find out what’s the problem? 
  
 Regards, 
  
 Gary

 I made a simple test case to reproduce the problem but I didn't manage to post it here because it makes 2.5 M so it's too big !


Anyway the code simply looks like this: 



                MsSql2008FeatureLayer sql2008FeatureLayer = new MsSql2008FeatureLayer();
                sql2008FeatureLayer.ConnectionString = sql2008Layer.Properties.Settings.Default.connString;
                sql2008FeatureLayer.Name = "MsSql2008FeatureLayer";
                sql2008FeatureLayer.TableName = "features";
                sql2008FeatureLayer.FeatureIdColumn = "featureID";
                sql2008FeatureLayer.CustomGeometryColumnName = "featureShape";
                sql2008FeatureLayer.ZoomLevelSet.ZoomLevel01.DefaultAreaStyle = AreaStyles.County1;
                sql2008FeatureLayer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20;

                Proj4Projection proj4 = new Proj4Projection();
                proj4.InternalProjectionParametersString = Proj4Projection.GetEpsgParametersString(4326);  // Epsg4326
                proj4.ExternalProjectionParametersString = Proj4Projection.GetGoogleMapParametersString(); // SphericalMercator
                sql2008FeatureLayer.FeatureSource.Projection = proj4;

                LayerOverlay sql2008LayerOverlay = new LayerOverlay("sql2008LayerOverlay");
                sql2008LayerOverlay.Name = "sql2008LayerOverlay";
                sql2008LayerOverlay.IsBaseOverlay = false;
                sql2008LayerOverlay.Opacity = 0.5F;
                sql2008LayerOverlay.Layers.Add(sql2008FeatureLayer);
                Map1.CustomOverlays.Add(sql2008LayerOverlay);

                RectangleShape boundingBox = new RectangleShape(393552.406996615, 6340655.66426205, 516969.043014608, 6247854.21039292);
                try
                {
                    RectangleShape RS = sql2008LayerOverlay.GetBoundingBox();
                    boundingBox = RS;
                }
                catch (Exception err)
                {
                    Console.Write(err.Message + "\r\n\r\n" + err.Source + "\r\n\r\n" + err.TargetSite + "\r\n\r\n" + err.InnerException + "\r\n\r\n" + err.Data);
                }
                Map1.CurrentExtent = boundingBox;



I put the sql2008LayerOverlay.GetBoundingBox(); in a try / catch statement because it produces the error. 
 It’s a timeout error so it takes a lot of time to display the map ! 
  
 Thank you.

Gautier, 
  
 Thank you for your feedback, if it caused by timeout, we have some way to resolve it: 
 1. increase the timeout time, but you need wait longer. 
 2. decrease the timeout time, catch the exception faster. 
 3. improve the performance of SQL search, like using index. 
  
 Regards, 
  
 Gary

Guys, 
  
  Are you sure maybe an index didn’t get dropped or something?  Is the table spatially indexed?  I think there is a way to see what SQL is being executed.  You need to look at the event called ExecutingSqlStatement on the Sql2008 FeatureSource which you can get to via the Sql2008FeatureLayer.FeatureSource property.  You will need to cast FeatureSource to Sql2008featureSource.  Then you can execute the GetBoundingBox and see exactly what SQL is being executed.  I guess you could also always do a sql trace as well.  This way you can see if there is an optimization you can do on your side or if you notice any fish sql from us. My guess is that it is a big table and maybe the index is not right or that the get bounding box is not an index friendly kind if spatial function and that it just takes time for large tables.  It may also be that our implementation isn’t great but I would need to look. 
  
 David

In my simple test case my database is so small: 1 table with 3 columns and 1 record !! no index !


I think there really is a probleme with GetBoundingBox !! The same app was working great before and now with only changing the MapSuite version the GetBoundingBox fails, I think you really should take a look at it !


I managed to get the request that fails and I'm putting it below.


I'm also providing here some screenshot if it can help you or if you can see I'm making something wrong:


 


My database:



 



 


The request that will never end (even after 16 minutes !):



 





DECLARE @polygon01 geometry;


DECLARE @polygon02 geometry;


DECLARE mycursor cursor for select featureShape from features;


open mycursor;


while(@polygon01 is null)fetch mycursor into @polygon01;


while(@polygon02 is null)fetch mycursor into @polygon02;


if (@polygon02 Is not NULL) begin set @polygon01 = @polygon01.STUnion(@polygon02.STEnvelope()).STEnvelope();


fetch mycursor into @polygon02;


while @@FETCH_STATUS = 0 begin if(@polygon02 is not null)set @polygon01 = @polygon01.STUnion(@polygon02.STEnvelope()).STEnvelope();


fetch mycursor into @polygon02;


end;


end;


SELECT @polygon01.STAsBinary();


CLOSE myCursor;


DEALLOCATE myCursor;



 




Thank you.


 



Any news on this problem please ?

Gautier, 
  
 Sorry for let you waiting, I’m working on this and will let you know the result as soon as possible. 
  
 Regards, 
  
 Gary

Gautier, 
  
 Sorry for let you waiting so long. I checked the getBoundingBox method over and over again, I can’t find out which part will cause this problem and also I try to create the table as you shows, but I can’t recreate the problem. 
  
 Could you please provide a sample and detach your test database? That will help us to find out the root cause faster. 
  
 Regards, 
  
 Gary

How can I send you a simple test case which is about 2,5M ?

Gautier,  
  
 Thanks for your help, you can send to support@thinkgeo.com and tell them forward to me. 
  
 Regards, 
  
 Gary

 Gautier,


Sorry for the inconvenience, I checked your sample project and test the MsSql2008FeatureLayer according to your database, there was a timeout exception occurred when executing the GetBoundingBox function. Also I checked some other features in the SQL SERVER2008, it worked fine. So I guessed maybe the problem is from the feature where in your database. There is a workaround for your issue, please get the attached C# file what I modified that can fix the current issue correctly.


Please use the attached C# file to try again if there are any new problems please let me know,


Thanks,


Scott,



Default.aspx.cs.zip (1.89 KB)

OK thank you, this workaround avoid the timeout problem. 
  
 Isn’t it time consuming to open the featuresource and loop through all features rather than making sql2008LayerOverlay.GetBoundingBox() ? 
  
 Thank you.

Gautier, 
  
 I think the reason is from the feature, we ever tested many features in the SQL SERVER2008 database and we didn’t encounter any timeout issues, for your case, in the database there is only one feature and when executing the GetBoundingBox method it always causes the timeout exception. Maybe the feature is not a standard feature, also when you executing the stored procedure, it would cost 16 seconds to get the bounding box. So it is not a bug for our product, maybe it is a GIS query issue of Sql Server2008. Please just use the workaround for your project. 
  
 Thanks, 
  
 Scott,