ThinkGeo.com    |     Documentation    |     Premium Support

MsSql2008FeatureLayer and OGC methods?

Hi,



I just tried to build some logic, where I split a server table with multiple topologies (points + lines + polygons) into three seperate layers, displaying these as layers in a LayerOverlay.



To do this, I add a where clause, selecting only the relevant geometry types for each layer. I use the OGC method STGeometryTYpe() for this, i.e.:




        
  1. (layer).WhereClause = "where " + geoColnam + “.STGeometryType() In (‘Point’)”

  2.     
  3. (layer).WhereClause = "where " + geoColnam + “.STGeometryType() In (‘LineString’,‘MultiLineString’)”

  4.     
  5. (layer).WhereClause = "where " + geoColnam + “.STGeometryType() In (‘Polygon’,‘MultiPolygon’,‘GeometryCollection’)” 


I get an error saying that the method “STGeometryType” isn’t found, even though a query with the exact same clause in Management Studio et.al. works perfectly.



Are there limitations to what kind of SQL one can use in the MsSql2008FeatureLayer where clauses ??



Cheers

Lars

Hi Lars, 
  
 I view the code about WhereClause for MsSql2008FeatureLayer, it looks this part only did some validation and then directly append this part to SqlStatement and build SqlCommand based on that. 
  
 So I think that’s because SqlCommand(System.Data.SqlClient) class don’t support OGC method. 
  
 Then I did some research on how to make SqlCommand support OGC method but unlucky I haven’t found useful information. If you have any more information about this problem please let us know, we will keep enhancement MsSql2008FeatureLayer. 
  
 Regards, 
  
 Don

Hi Don,



I’m sorry, but I’ll have to disagree with you on that assumption.



I created a small test script that just returned the number of individual topologies (points vs lines vs polygons) in a single MS/SQL-2008 table.



And it works very nicely, so the OGC methods are indeed available thru the SqlCommand interface:


Dim cmd As New SqlCommand("", conn)

With
 cmd
    .CommandText = “select count(*) from vand where SP_GEOMETRY.STGeometryType() In (‘Point’)”
    lblCountPoints.Text = .ExecuteScalar().ToString
End With
With cmd
    .CommandText = “select count(*) from vand where SP_GEOMETRY.STGeometryType() In (‘LineString’,‘MultiLineString’)”
    lblCountLines.Text = .ExecuteScalar().ToString
End With
With cmd
    .CommandText = “select count(*) from vand where SP_GEOMETRY.STGeometryType() In (‘Polygon’,‘MultiPolygon’,‘GeometryCollection’)”
    lblCountPolygons.Text = .ExecuteScalar().ToString
End With

The problem seems to be a bit more complex than you assume. You’ll need to dig a little deeper, I think.



Cheers

Lars




Hi Lars,



I am sorry I just read the code for MsSql2008FeatureLayer yesterday but I haven’t created environment to reproduce that.



Today I takes some hours to create a database then tested based that, it looks everything works well in my machine.



Please see the attached screen captures.



If my test way is not correct please let me know, a simple test sample which can reproduce your problem is helpful.



Regards,



Don

12235.zip (195 KB)

Hi Don,



Got back to this problem, and it’s unfortunately not solved.



Yes, (Layer).QueryTools.GetAllFeatures() seem to work, but the below command still crashes:



            (Layer).FeatureSource.GetFeaturesInsideBoundingBox(mapExtent, ReturningColumnsType.NoColumns).Count()



Am I doing something illegal here ?



Please advise.



Cheers.


Hi again Don,



Here’s a simplified version of my code:


SyncLock lyr 'exclusive access                                                                                           
    If Not lyr.IsOpen Then lyr.Open()                                                                                    
                                                                                                                          
    Dim n = lyr.FeatureSource.GetFeaturesInsideBoundingBox(mapExtent, ReturningColumnsType.NoColumns).Count              
    If n > 0 Then                                                                                                       
        lyr.Draw(myGdiPlusGeoCanvas, New Collection(Of SimpleCandidate)())                                               
    End If                                                                                                              
                                                                                                                          
    lyr.Close()                                                                                                          
End SyncLock 'lyr                                                                                                        

The same code works nicely on layers (lyr) without a defined WhereClause.



I’m wondering why the error message has STGeometryType in all uppercase, knowing that .Net is case sensitive: 

Could not find method ‘STGEOMETRYTYPE’ for type ‘Microsoft.SqlServer.Types.SqlGeometry’ in assembly 'Microsoft.SqlServer.Types’



Could that be the source of the problem ?


Hi Lars, 
  
 Thanks for your update, we have reproduced that, but it looks is not a simple problem. 
  
 Any update we will let you know. 
  
 Regards, 
  
 Don

Hi Lars,



We fixed a bug in map suite core, but as the code is frozen for map suite 9.0 release, I attached the dll from singlepoint, would you please try it?



Any question please let us know.

Thanks,

Troy