ThinkGeo.com    |     Documentation    |     Premium Support

Spatial index

 Hi, 


I have questions about the spatial index with the MssqlFeaturelayer.


Question 1 : 


I defined a spatial index in the database (sql server 2008). This spatial index is it used by the MssqlFeatureLayer automatically ?


Or I have to precise the spatial index ?


 


Thanks a lot.


 


Regards.


Steph.


 


 



Hi Steph,


You have a couple of options:



        
  1. Use the MsSql2008FeatureLayer.BuildIndex function to build the index.

  2.     
  3. Execute the following SQL-Statement: CREATE SPATIAL INDEX SIndx_SpatialTable_geometry_col1 ON SpatialTable(geometry_col) WITH (BOUNDING_BOX = (minX,minY,maxX,maxY) ); 

        You can visit this web site: msdn.microsoft.com/en-us/library/bb934196.aspx for details. 

        The spatial index will be used automatically by the MsSql2008FeatureLayer.


Source: gis.thinkgeo.com/Support/Dis...fault.aspx



Hi , 



I have a table that contains “communes” (as states for America) for 2 different countries (France and England). 
So the spatial index is different depending on the country. 
I can create two spatial indexes in BDD but what is the spatial index will be taken into account by the MssqSqlFeatureLayer layer? 
I 've not found a property that defines how to choose spatial index. 



Is there another way to say that if our application is UK configuration then the index is the spatial index UK, otherwise French spatial index? 
thank you  ?




Regards.



Steph.

Hi Steph, 
  
 1. If you create two spatial indexes in BDD, the MsSql2008FeatureLayer will take the first one. 
  
 2. We don’t have API about spatial index in MsSql2008FeatureLayer, so you cannot control the spatial index in your application by the MsSql2008FeatureLayer. 
  
 I think maybe we can implement that by write sub class inherited from MsSql2008FeatureLayer and MsSql2008FeatureSource, but it’s will be very hard. 
  
 Regards, 
  
 Don 


Hi, 



Thanks for your help.

I have a question about your answer If you create two spatial indexes in BDD, the MsSql2008FeatureLayer will take the first one…



About "the first one", does it mean 

 1) the first index spatial create ?

 2) the first index spatial by alphabetical order ?

 3) …



If I disable one of the two, is the MssqlFeaturelayer will take into account the spatial index enabled? 



Thanks.

Regards.

Steph.

Hi Steph,


I did a test and the first one means the first one which created at the first.


For the other question, we have
checked our Mssql2008FeatureLayer, and seems there is a bug that we don’t check if
the spatial index is enabled, but now we have added the filter for it. If we disable
one of two, Then the Mssql2008FeatureLayer will take into the other enable one. 

In order to apply the fix, Please get the latest version(8.0.7.0 or 8.0.0.7, which might still be built, please waiting for some hours) to have a
try.


Thanks,

Troy



Hi, 



I still have some questions about spatial indexes.



1) So now if we disable a spatial index, the MssqlFeatureLayer will take the enable one ?



2)


We have a table called table1 (database is sql server 2008 express) which has 2 geometry columns (called geometry1 and geometry2)
Currently, there is only one spatial index based on the Geometry 1 (index key column = geometry1)
There is not an index spatial with index key column = Geometry 2.



In our application , there are 2 mssqlfeaturelayers based on table 1 : 
a) MssqlFeatureLayer1 = layer based on Geometry 1 (ie CustomGeometryColumnName  = Geometry 1 and so, there is an spatial index base on these column)
b) MssqlFeatureLayer2 = layer based on Geometry 2 (ie CustomGeometryColumnName  = Geometry 2 and no spatial index on these column)



Is the mssqlFeatureLayer2 layer uses a spatial index even if Geometry2 is not an index key column for the spatial index ? or not, there is no spatial index used for this layer?
In other words, is it when we define the  CustomGeometryColumnName  that the layer knows what spatial index used?



I hope my explanation is clear enough, if this is not the case, tell me.



Thanks



Regards.

Steph.




Hi Steph,



Your explanation is very clear.

1), yes, we fixed this bug before and it will take the first enable one.

2), In this case, mssqlfeaturelayer2 would not use the special index 2 which built for geometry2 by automatically. This is because we don’t know what’s the mapping between the index name and the geometry name. But there is a workaround I think: We can register the ExecutingSqlStatement event and modify the special index name based the layer name before execute the query on the sql server side. Some codes would be like the below:


  sql2008Layer.Open();
    ((MsSql2008FeatureSource)sql2008Layer.FeatureSource).ExecutingSqlStatement += LoadMsSql2008FeatureLayer_ExecutingSqlStatement;
 
 void LoadMsSql2008FeatureLayer_ExecutingSqlStatement(object sender, ExecutingSqlStatementMsSql2008FeatureSourceEventArgs e)
{
    string statement = e.SqlStatement;
    if (statement.IndexOf(" with(index(") > 0)
    {
        // replace the index name
    }
    e.SqlStatement = statement;
}

Here is a statement template: SELECT [geom].STAsBinary() as [geom],[ID] FROM cntry02 with(index(SPATIAL_cntry02)) WHERE (geometry::STGeomFromWKB(@Geometry,4326).STIntersects(geom)=1);



Btw, please make sure the special index 2 is enable or the index won’t take effect.

Any questions, please feel free to let us know.

Thanks,

Troy

Hi Troy,  
  
 Thanks. 
  
 Just one last question, in relation to my problem this means that the layer MssqlFeatureLayer2 uses the spatial index 1 by default ? 
 Thanks. 
 Regards. 
 Steph.

Hi Steph,



Yes, The MssqlFeatureLayer2 still will take the index 1 if it is the first enable one. Maybe this is an potential issue but we can get around it by removing it in ExecutingSqlStatement events.



Hope it helps.

Troy


 Thanks. 
 Regards. 
 Steph.

Welcome, Steph, any questions please feel free to let us know. 
  
 Regards, 
 Johnny