ThinkGeo.com    |     Documentation    |     Premium Support

MsSql2008FeatureLayer taking to long for first draw

Hi,



We,re using ThinkGeo 7.0.0.0 WebEdition for ASP .NET. We’ve configured a map with MsSql2008FeatureLayer that is using a table directly from SQL Server 2008 database. That table as a geography column which is used by ThinkGeo to load the respective geometries and draw those on the requested images. It seems like ThinkGeo is sending a query to the database to get the minimum bounding box (MBB)  of all features on that table for the first requested image. We’ve a massive amount of registers on that table. Because of that, the query is taking a massive amount of time to complete. The executed query is:



DECLARE @polygon01 geometry;
SELECT TOP 1 @polygon01 = geometry::STGeomFromWKB(geom.STAsBinary(),4326) FROM [table_name] 

WHERE geom IS NOT NULL;


SELECT @polygon01 = @polygon01.STUnion(geometry::STGeomFromWKB(geom.STAsBinary(),4326).STEnvelope()).STEnvelope() FROM  [table_name]

WHERE geom IS NOT NULL;


SELECT @polygon01.STAsText();



We’ve tried to implement custom classes inheriting from MsSql2008FeatureLayer and MsSql2008FeatureSource and override method  protected override RectangleShape GetBoundingBoxCore() of MsSql2008FeatureSource to return explicitly our MBB but it raises the following exception after the GetBoundingBoxCore method is called:



The connection was not closed. The connection’s current state is open.



Our implementation of the method is:



 protected override RectangleShape GetBoundingBoxCore()
{
return new RectangleShape(“POLYGON ((-28.770416259765625 32.634817123413086, -6.26287317276001 32.634817123413086, -6.26287317276001 42.129704475402832, -28.770416259765625 42.129704475402832, -28.770416259765625 32.634817123413086))”);
}



Is there anything we can do to avoid getting MBB directly from database? 



Best regards,

BdaF


Hi, 
  
 One more thing. This problem doesn’t happen on ThinkGeo Web Edition version 5.5.0.0. We are evaluation the transition to new versions of ThinkGeo and this is the kind of performance problems that cannot happen. Can you give a solution to this issue? 
  
 Best Regards, 
 BdaF

Hi Bruno,



Just as you mentioned, the GetBoundingBox is called several times, I guess you get a good way to improve the performance, but the problem is unable to be reproduced on our end, we tried 3 versions of the 7.0.*.*. Here as following is the one we tried:




public class MySqlFeatureLayer : MsSql2008FeatureLayer
{
   public MySqlFeatureLayer(string connectionString, string tableName, string idColumn)
        base(connectionString, tableName, idColumn)
    
     
    }
 
    protected override RectangleShape GetBoundingBoxCore()
    {
        return new RectangleShape("POLYGON ((-28.770416259765625 32.634817123413086, -6.26287317276001 32.634817123413086, -6.26287317276001 42.129704475402832, -28.770416259765625 42.129704475402832, -28.770416259765625 32.634817123413086))");
    }
}





Would you please give a demo project to us?



Thanks,

Johnny

This is the code that we’ve developed:

 [Serializable]
    public class CustomMsSql2008FeatureLayer : MsSql2008FeatureLayer
    {
 
        public CustomMsSql2008FeatureLayer() : this(string.Empty, string.Empty, string.Empty, 4326) { }
        public CustomMsSql2008FeatureLayer(string connectionString, string tableName, string featureIdColumn) : this(connectionString, tableName, featureIdColumn, 4326/*, DatabaseConnectionMode.Default*/) { }       
        public CustomMsSql2008FeatureLayer(string connectionString, string tableName, string featureIdColumn, int srid)
        {
            base.FeatureSource = new CustomMsSql2008FeatureSource(connectionString, tableName, featureIdColumn, srid);
 
        }
 
    }
 
    [Serializable]
    public class CustomMsSql2008FeatureSource : MsSql2008FeatureSource
    {
       
        public CustomMsSql2008FeatureSource()
            : base()
        {
        }
        public CustomMsSql2008FeatureSource(string connectionString, string tableName, string featureIdColumn)
            : base(connectionString, tableName, featureIdColumn, 4326)
        {
        }
        public CustomMsSql2008FeatureSource(string connectionString, string tableName, string featureIdColumn, int srid)
            : base(connectionString, tableName, featureIdColumn, srid)
        {
        }       
 
        protected override RectangleShape GetBoundingBoxCore()
        {
            return new RectangleShape(“POLYGON ((-28.770416259765625 32.634817123413086, -6.26287317276001 32.634817123413086, -6.26287317276001 42.129704475402832, -28.770416259765625 42.129704475402832, -28.770416259765625 32.634817123413086))”);
            
        }
 
    }



 CustomMsSql2008FeatureLayer featureLayer1 = new CustomMsSql2008FeatureLayer(
                    “<connection_string>”,
                    “”,
                    “<id_column>”,
                    4326);
 
                featureLayer1.CustomGeometryColumnName = “<column_name>”;
                featureLayer1.ZoomLevelSet.ZoomLevel01.DefaultPointStyle = PointStyles.City1;
                featureLayer1.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20;
                featureLayer1.ZoomLevelSet.ZoomLevel01.Scale = 50000;
              
 
                proj4Projection = new Proj4Projection();
                proj4Projection.InternalProjectionParametersString = Proj4Projection.GetEpsgParametersString(4326);
                proj4Projection.ExternalProjectionParametersString = Proj4Projection.GetEpsgParametersString(4326);
 
                featureLayer1.FeatureSource.Projection = proj4Projection;
                featureLayer1.DrawingMarginPercentage = 30;

Then we add it to a LayerOverlay.

It raises errors whenever the image is requested.

The version that we use is ThingeoGeo Web Edition Full 7.0.0.0.

Best Regards,
BdaF


Hi Bruno,



We are still unable to reproduce the problem, here attached is the sample we used for test, please download it at ap.thinkgeo.com:5001/fbsharing/AzWazAIn and check if it works fine on your end.



Thanks,

Johnny

Hi Johnny,



Well, we tried to figure out the reason of the problem and we found that using tables with geometry columns the error does not occurs but if you’re using a geography column then the error is raised. You don’t need any data on the tables. We’ve created the following tables and tested it:



CREATE TABLE tg_test(
id bigint IDENTITY(1, 1) PRIMARY KEY,
geom geography NOT NULL);



CREATE TABLE tg_test1(
id bigint IDENTITY(1, 1) PRIMARY KEY,
geom geometry NOT NULL);



If you use the table tg_test them you will receive the error reported initially. The strange thing here is why does it happen only with geography columns!? It is supposed to calculate the bounding box only for geography columns? That doesn’t make sense!? 



We cannot change the column from geography to geometry because it’s semantically different.



Hope you can reproduce the problem with this answer. It is critical to allow the redefinition of the method GetBoundingBox() without having the major performance issue reported.



Regards,

BdaF







One more thing, this problem exists too on the 8.0.0.0 version of ThinkGeo Web Edition.



Best Regards,

BdaF

Hi Bruno,



Thanks for your information, I guess we have recreated the problem on our end, we are still in progress now, any updates I will paste here.



Thanks,

Johnny

Hi Bruno,




It’s proved to be a bug which has been fixed in the latest version 8.0.304.0 or later, please get it and have a try.




Thanks,


Johnny

Hi,



We’ve downloaded the version 8.0.304.0 and there seems to be some kind of problem. On version 8.0.303.0 there were some properties that vanished from this latest version!? 



The properties that I’m talking about are the ones mentioned on   issue thinkgeo.com/forums/Ma…fault.aspx (property setters SpatialIndexName and SpatialDataType)!?



Is that normal? On a previous fix there was a class that disappeared too (YahooLayer)!?



Can you check that?



Regards,

BdaF

Hi BdaF,



In fact the SpatialIndexName and SpatialDataType is the properties of MsSql2008FeatureSource class, and you can also directly set SpatialIndexName from MsSql2008FeatureLayer.





I double check the code change history of the two classes, it looks we don’t changed their API for long time. But you mentioned you can use them in the other topic, so could you please let me know what’s the detail dll version which contains the two APIs in MsSql2008FeatureLayer, so I can find the version and double check it.



BTW, I am sorry for Yahoo layer, that’s because Yahoo have stopped provide map tile service, so we had to remove that.



Regards,



Don

Hi Don,



With version 8.0.306.0 the problem is gone.



Thanks,

BdaF

Hi BdaF, 
  
 Thanks for let us know that. 
  
 Regards, 
  
 Don