ThinkGeo.com    |     Documentation    |     Premium Support

MsSql2008FeatureLayer not showing anything

Hello, I'm need some help regarding of my problem about using MsSql2008FeatureLayer.


I'm using SQL Server 2008 R2 Express with Visual Studio 2010 and MapSuite Desktop 6.0 Trial. I have converted example Countries02.shp using Shape2Sql program from (sharpgis.net/page/sql-server-2008-spatial-tools.aspx). The file is successfully converted into my database: SpatialDatabase, table name: Countries02.


Then I tried to load and view it with MsSql2008FeatureLayer. Since I've been using ShapeFileFeatureLayer with Countries02.shp without any problem, I assume the process would be the same for the MsSql2008FeatureLayer. First there was an error saying that some of the records need to be valid first. I've run into some sites state that I need to run a spesific SQL query to make the invalid records into valid records. I was using sql query


update Countries02 set geom = geom.MakeValid() where geom.STIsValid() = 0


the result there were 3 row(s) are affected.


After that I tried to show them with Sql Spatial Query Visualizer (included from the link above) and it shows correctly. But then when I load with MsSql2008FeatureLayer, the layer won't appear. There are no error with program, but the layer just doesn't appear at all. I've tried to change inside the MsSql2008FeatureLayer constructor the RecID (original from the shp file) with ID (generated new with Shape2Sql) but it doesn't work either.


Here's my code


 



string connectString = @"Data Source=<my_pc_database>;Initial Catalog=SpatialDatabase;Integrated Security=True;User ID=<my_id>;Password=<my_password>";
winformsMap1.BackgroundOverlay.BackgroundBrush = new GeoSolidBrush(GeoColor.GeographicColors.ShallowOcean);
MsSql2008FeatureLayer worldShapeLayer = new MsSql2008FeatureLayer(connectString, "Countries02", "RecID");
winformsMap1.MapUnit = GeographyUnit.DecimalDegree;
worldShapeLayer.ZoomLevelSet.ZoomLevel01.DefaultAreaStyle = AreaStyles.County1;
worldShapeLayer.ZoomLevelSet.ZoomLevel01.DefaultLineStyle = LineStyles.StateBorder1;
worldShapeLayer.ZoomLevelSet.ZoomLevel01.DefaultPointStyle = PointStyles.City1;
worldShapeLayer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20;
staticOverlay = new LayerOverlay();
staticOverlay.Layers.Add("WorldShapeLayer", worldShapeLayer);
winformsMap1.CurrentExtent = this.GetFullExtent(staticOverlay.Layers);
winformsMap1.Overlays.Add("WorldOverlay", staticOverlay);
winformsMap1.Refresh();

The function GetFullExtent() is taken from another example from this forum, but I think that's not the problem since it worked perfectly with ShapeFileFeatureLayer. Are there anything wrong with my code or something did I miss to add? Thank you for your attention.



We have always had to specify the SRID when creating a SQL Server layer…there is another constructor that you can use for that, something like 
  
 …new MsSql2008FeatureLayer(connectionString, “Countries02”, “RecID”, 4126) 
  
 I don’t know what the SRID defaults to with the other constructor, but I don’t think it ever matches our data. If you debug there are records in the layer, etc, but nothing shows.   
  
 You can get the query of the SRID via a query, like “Select geom.STSrid from table”.  Our data is in SRID 3395, for example. 
  
 I haven’t used Shape2Sql in a long time so I’m not quite sure if it actually applies an SRID to the SQL data or not (there might be a slot for you to type it in) and if we were ever able to get its output to work in MapSuite.  If it’s not in the SQL data, I think you can do “update geom.STSrid = ####” to set the SRID.  We also store our data as geometry, not geography, in SQL; I don’t remember if Shape2Sql lets you select that.  We eventually wrote our own converter program using MapSuite. 
  
 Allen 
  
 Allen

Thanks for the reply and sharing your experience. Actually Shape2Sql is able to convert shp either into a geometry or geography. I used geometry though, and since the program doesn’t require the SRID to be filled, I just let it unchecked (and perhaps causing will be filled with empty data?). 
  
 If you were right, then I need to set the correct SRID for the Countries02.shp. But what is the correct SRID for the file? There is no PRJ file supplied by the example. Is there anyway to determine the correct SRID without using the PRJ file (social.msdn.microsoft.com/Forums/en-US/sqlspatial/thread/5ce69ee5-91e9-46b1-bdb0-8f3032b0e296/)? I just want to check whether MsSql2008FeatureLayer is really able to show a layer from database instead from a shp file.

HI Allen, thanks a lot for sharing your experience here.


Ariestya, just like what Allen has mentioned, the null map is caused by SRID, you can get the correct map after set SRID=0. Actually, it is defined no SRID when SRID=0, and the default SRID of MsSql2008FeatureLayer is 4326. I try using the Shape2Sql (which version is build3759) you mentioned to transform the Countries02.shp, if I set the SRID=4326 like below screenshot then do the make valid using your query string, I can get the correct map with default SRID in MsSql2008FeatureLayer, please have a try:



Regards,


Johnny




Thanks for the explanation. Now it shows the map correctly. Perhaps on the next build code example, please kindly to add an SRID on the constructor so we will assume most of the maps do need an SRID to be passed on the constructor so it can be shown on the layer. I really appreciate for the help. Thank you.

Hi Ariestya, 
  
 Thanks for your suggestion, I have made it into our worklist and check it in near future, if you have any more question, please feel free to let us know.  
  
 Best Regards 
  
 Johnny