ThinkGeo.com    |     Documentation    |     Premium Support

SQL runtime queries on SQL Server 2008 Spatial data

Hello,


As part of the testing i am doing for Mapsuite, I would like to be able to map large volumes of data in an SQL Server database. I have been able to do this by querying the database and then joining the result to a shapefile, though now i would like to be able to embed the shapefile in my database and pass a query string to MsSql2008FeatureLayer. This isnt currently available in the contructor, so the only way i have been able to join a table with my spatial data is by creating a view. Is there another way to do this? The problem is that my view needs to be dynamic depending on what the user selects through a "data selection wizard". I imagine that i could create a temporary view, but if multiple users are connecting to the database at the same time i then to to monitor view names etc.


I imagine i am not the only person with this type of request, how would you recommend I get around this?


thanks


Phil


 



 Phil,


 
Thanks for your posts!
 
I think you want to execute a query for the MsSql2008FeatureLayer, but you didn't find out in the constructors, so you guessed maybe you need to create a view to implement the requirements. Actually, we have a way to pass a query string to MsSql2008FeatureLayer and return a data table object. Please refer the following code:
 


sql2008Layer.Open();
DataTable table = sql2008Layer.QueryTools.ExecuteQuery("Your Sql statement");
sql2008Layer.Close();
  I think that's what you want, however, if I misunderstood anything or more questions please let me know again,


Thanks,


Scott,



Hello Scott, 
  
 If i understand correctly, QueryTools.ExecuteQuery is performed on the layer once you have already extracted data from the SQL database, i need to perform the query on the database end. For example, in the code below I am connecting to a view: 
  
 MsSql2008FeatureLayer sql2008Layer = new MsSql2008FeatureLayer(ConfigurationManager.ConnectionStrings[1].ToString(), "View_EEZTest", "PRISMID"); 
  
 I would like to be able to run this view as an sql command in Mapsuite, and then open the layer with this string, rather than a table/view in sql server: 
  
 
sqlstr = SELECT     dbo.PGIS_EEZ_MERC.ID, dbo.PGIS_EEZ_MERC.COUNTRY_ID, dbo.PGIS_EEZ_MERC.PRISMID, dbo.PGIS_EEZ_MERC.geom, dbo.NMDI_VALUES.ValueID, dbo.NMDI_VALUES.CountryID, dbo.NMDI_VALUES.Year, dbo.NMDI_VALUES.StartYear, dbo.NMDI_VALUES.Quarter, dbo.NMDI_VALUES.Month, dbo.NMDI_VALUES.Value, dbo.NMDI_VALUES.Notes, dbo.NMDI_VALUES.Updated, dbo.NMDI_VALUES.UserID, dbo.NMDI_VALUES.SourceID, dbo.NMDI_VALUES.IndicatorID, dbo.NMDI_VALUES.SplitID
FROM         dbo.PGIS_EEZ_MERC INNER JOIN
                      dbo.NMDI_VALUES ON dbo.PGIS_EEZ_MERC.PRISMID = dbo.NMDI_VALUES.CountryID
WHERE     (dbo.NMDI_VALUES.Year = 2011) AND (dbo.NMDI_VALUES.IndicatorID = 1) AND (dbo.NMDI_VALUES.SplitID = 1) 

MsSql2008FeatureLayer sql2008Layer = new MsSql2008FeatureLayer(Conn,sqlstr, "PRISMID");
 
  
 Is this possible? 
  
 thanks 
  
 Phil

 Phil,


We don’t provide the API to create a  MsSql2008FeatureLayer with a string instead of table/view, but if I get your point, I think you want to use the data from sql server and then render on the map or do some other operation by using MapSuite API, you can do it with InMemoryFeatureLayer rather than MsSql2008FeatureLayer, first you get data as Scott mentioned, and then create Feature object for each record, our feature object consist of two parts, one is geometry such as PointShape, LineShape and PolygonShape, you can easy to input x/y vertex to create them, the other one is ColumnValues, it looks like a dictionary, you can put your column name/ value to then. And then you add all features to InternalFeatures property of InMemoryFeatureLayer, it’s the same as MsSql2008FeatureLayer  that inherit from FeatureLayer, so the APIs are pretty much same, you will easy to use it.


Let me know if you have more questions.




PS: I am also investigating your other questions from other threads, I will give you a quick response if I get any progress.


 Thanks,


James  



 problem with loading data from sql server database. when using a shapefile, data is visible on the map, but using data from database, i can't see them on the map.


ANY HELP??


.....



String connectionparams = "Data Source=XXXXX;Initial Catalog= XXXXX; User=XXXX;Password=XXXXXX;";


            myDataLayer = new MsSql2008FeatureLayer(connectionparams, "RWA_Boundaries", "IDColumn");


            


            myDataLayer.ZoomLevelSet.ZoomLevel01.DefaultAreaStyle = AreaStyles.Country2;


            myDataLayer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20;


            overlay = new LayerOverlay();


            overlay.Layers.Add(new BackgroundLayer(new GeoSolidBrush(GeoColor.GeographicColors.ShallowOcean)));


            mapPane.CurrentExtent = new RectangleShape(0, 78, 30, 26);


            overlay.Layers.Add( "RwaSQLDB" , myDataLayer);


            mapPane.Overlays.Add(overlay);


            mapPane.Refresh();




Ben,


Thanks for your question! I don't mean to be negative but this thread is over a year old and while the existing thread does have questions about MSSQL2008FeatureLayers your question is not really related to the original author's questions.


You have a good question and we are glad to assist you, but rather than extending a non-related and very old thread I would kindly ask that for future questions you create a new thread or try out the Discussion Forum Search (I found this very similar question using the search: gis.thinkgeo.com/Support/Dis...fault.aspx).


Not only will this reduce confusion for you as only your information will be contained in the thread, but others who have the same issue will not need to sort through the old, unrelated information to get to your question.


Back to your question!

Based on what you provided above I don't see any code-related issues. I would start with the basics.



        
  • Do you have your MapUnit set correctly for the data you are loading? You have options of Meters, DecimalDegrees, Feet, or Unknown.

  •     
  • Does your MSSQL2008FeatureLayer have a Geometry column storing the location information for your shapes?

  •     
  • What type of shapes are you storing in your database? If you are storing lines then you would need to specify a DefaultLineStyle instead of an DefaultAreaStyle.

  •     
  • Do you have your CurrentExtent set to the area where your shapes should be displayed?