ThinkGeo.com    |     Documentation    |     Premium Support

GetBoundingBox on a SQL layer

Our application allows the user to add SQL layers to the map, and one of the things we do is to get the bounding box (using GetBoundingBox() on the MSSQL2008FeatureLayer class) and this seems to work well, but for layers with large numbers of features the call to GetBoundingBox() seems to be very slow.  For example we have a Public Land Survey layer with over 200,000 features and the call to GetBoundingBox() takes upwards of 20 seconds to execute.  Does this function not use the spatial index.  I was wondering if the extent of the layer couild not be gotten directly from the sys tables.


 


Thanks,



Jamie, 
  
 I’ll let ThinkGeo answer if the index is used for this.  I don’t know if this has been improved in version 6 (we are just switching from 4.5 to 6) but I know some related functionality (I think it’s GetFeaturesNearestTo) have been documented to be rather slow.  We have some utilities that query SQL directly to get a bounding box and since SQL Server 2008 has no aggregate function to do this, it’s slow too because the query is something like “SELECT MAX(Xmax)…” which obviously has to scan every record.  SQL Server 2012 has aggregates where you can do something like STEnvelope(*) --might have that syntax wrong but you should get the idea–and get the result of the entire table, and I think I’ve tried this and found it to be fast, but I don’t know if MapSuite 6 works with 2012 (we will probably try this some day) and besides SQL Server 2012 is only supported on Vista and beyond which is an issue because XP is still so much in use by our customers.  If you’re not doing anything really odd when building the spatial index I’d guess you might be able to query a system table and get the bounding box used there, if that helps at all… 
  
 Allen

sys.spatial_index_tessellations has the bounding box coordinates if you want to try that.  I realize this might not help…we massage the bounding box to get a target cell size, so it no longer represents the actual bounding box of the data.  This view uses object_id so you’ll have to probably do some other querying to get the ID for the index. 
  
 Allen