ThinkGeo.com    |     Documentation    |     Premium Support

Create a silverlight application with web service for serverside rendering including user choices

Hi,


I'm trying to build Silverlight Application that highlights  features on the base map when  the user clicks on the map. The  lat and long value of the clicked position is send to web service,. The web service  process the data,  creates a new InMemoryFeatureLayer. This InMemoryFeatureLayer is added to the  ServerLayerOverlay within the web service.The web service is supposed to send this  ServerLayerOverlay to the client so that it is added to the map as a new layer. However, I get an error message as:

"The server did not provide a meaningful reply; this might be caused by a contract mismatch, a premature session shutdown or an internal server error."



My question is:

1) How can I get The ShapeFile Feature layer from the server at the client side. Is it possible at client  side  to get all the layers from the ServerLayerOverlay that is rendered on the server side?



2) How do I pass the paramerters to the server side  to create  FleeBooleanStyle  dynamically. The sample below uses static value      string expression = "(ToInt32(POP_CNTRY)>10000000) AND (ToChar(LANDLOCKED)='Y')". I want to be able to get the users choice to filter the  ShapeFileFeatureLayer. 

 // Native Server 5

                // Highlight the countries that are land locked and have a population greater than 10 million

                string expression = "(ToInt32(POP_CNTRY)>10000000) AND (ToChar(LANDLOCKED)='Y')";

                FleeBooleanStyle landLockedCountryStyle = new FleeBooleanStyle(expression);



                // You can access the static methods on these types.  We use this

                // to access the Convert.Toxxx methods to convert variable types

                landLockedCountryStyle.StaticTypes.Add(typeof(System.Convert));

                // The math class might be handy to include but in this sample we do not use it

                //landLockedCountryStyle.StaticTypes.Add(typeof(System.Math));



                landLockedCountryStyle.ColumnVariables.Add("POP_CNTRY");

                landLockedCountryStyle.ColumnVariables.Add("LANDLOCKED");



                landLockedCountryStyle.CustomTrueStyles.Add(new AreaStyle(new GeoPen(GeoColor.SimpleColors.Green, 2), new GeoSolidBrush(GeoColor.FromArgb(100, GeoColor.SimpleColors.Green))));

                landLockedCountryStyle.CustomFalseStyles.Add(AreaStyles.CreateSimpleAreaStyle(GeoColor.SimpleColors.Transparent, GeoColor.FromArgb(100, GeoColor.SimpleColors.Green)));



                ShapeFileFeatureLayer fleeBooleanWorldLayer = new ShapeFileFeatureLayer(MapPath("~/app_data/cntry02.shp"), ShapeFileReadWriteMode.ReadOnly);

                fleeBooleanWorldLayer.ZoomLevelSet.ZoomLevel01.CustomStyles.Add(landLockedCountryStyle);

                fleeBooleanWorldLayer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20;



                ServerLayerOverlay fleeBooleanOverlay = new ServerLayerOverlay("NativeServerWithFleeBoolean");

                fleeBooleanOverlay.Layers.Add(fleeBooleanWorldLayer);

                SilverlightMapConnector1.ServerLayerOverlays.Add(fleeBooleanOverlay);





I have attached my mainpage.xaml,mainPage.xaml.cs, GetGeoDataService.svc, GetGeoDataService.svc.cs and Default.aspx and  default.aspx.cs in the attachment . Can someone please point me in the right direction?

Thanks!


Prava Kafle











Hi, Prava


 


There appears to be some misunderstanding regarding the ServerLayerOverlay between the server-side and client-side. They are different objects in our SilverlightEditon product. So you couldn’t send ServerLayerOverlay of server-side to client.


 


For your first question, we don’t support to get ShapeFileFeatureLayer from the server-side at client-side. However, if you just want to highlight the feature which client clicks; you could do the query operation on the server side and then return the serialized json string to client-side; client-side just need to deserialize this string and put these features into InMemoryFeatureLayer. You could refer the code in the attachment.


 


For your second question, you just need to use server-side event to implement it.


Another thing is that if you want to run this application please dump cntry02 shape file into App_Data folder.


 


Please correct me if I misunderstand your meaning.


 


Thanks,


Khalil




1863-RequireDataFromServerUsingWcf.zip (226 KB)

Hi, Khalil 



Thank you very much for your quick response. I opened the project in zip file, it worked great. I still have one more confusion.  

Is it possible to execute SQL query in  InMemoryFeatureLayer / ShapeFileFeatureLayer. I had this code  



ShapeFileFeatureSource myFsource = (ShapeFileFeatureSource) (shapeFileLayer.FeatureSource); 

Collection<feature> highlighFeatureSource = myFsource.GetFeaturesByColumnValue(columnName, value); 



This just returns the features whose value is exactly equal to the input. I want to return all the features whose value is >= the user input. My target is to display features in map and also  display the feature information in the grid. 



I was able to display feature information for features whose value was equal to the input in a Datagrid. However I am not able to query features whose value is >input value. 



I found the  following code 

#   ShapeFileFeatureLayer worldLayer = new Helper().GetShapeFileLayer("countries02");   

#             RegexStyle regexStyle = new RegexStyle();   

#             regexStyle.ColumnName = "CNTRY_NAME";   

#             regexStyle.RegexItems.Add(new RegexItem(RegularExpressionTextBox.Text, new AreaStyle(new GeoSolidBrush(GeoColor.StandardColors.LightGreen))));   

#             worldLayer.ZoomLevelSet.ZoomLevel01.CustomStyles.Add(regexStyle);   

#             worldLayer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20;   





I believe the above code is just for styling the feature layer.  Is it possible to  query all the features that has been highlighted and display their attributes in datagrid. 



Thanks    </feature>


Prava



Hi, Prava 
  
 Yes, you are right. The code posted in your last reply is just for styling the feature layer. We support execute query operation in ShapeFileFeatureLayer. You could refer the code below to implement your requirements: 
  
                 worldLayer.Open(); 
                 DataTable dt = worldLayer.FeatureSource.ExecuteQuery("select * from cntry02 where POP_CNTRY > 100000"); 
                 GridView1.DataSource = dt; 
                 GridView1.DataBind(); 
                 worldLayer.Close(); 
  
 And then, you need to bind the result of  ExecuteQuery operation to a data control. 
  
 Thanks, 
 Khalil

Thanks for the information. 


Prava



Prava, 
  
 Please feel free to let us know if you have more queries.  
  
 Thanks, 
 Khalil

Hi Khalil,




Is it possible to filter a feature with a wild card. I am using MsSql2008FeatureLayer  to create a RoadLayer. How do I create an expression to filter RoadLayer to dispaly only features that have "ave" in the column "FeatureText". The "FeatureText" column is of DataType nvarchar(50). 



In SQL SERVER I would use "SELECT ID, FeatureID, MapName,FeatureText FROM RoadsGeometry WHERE FeatureText LIKE '%{0}%'", roadName); 



I am trying to create a FleeBooleanStyle by refering to code below: 

string expression = "(ToInt32(POP_CNTRY)>10000000) AND (ToChar(LANDLOCKED)='Y')"; 

FleeBooleanStyle landLockedCountryStyle = new FleeBooleanStyle(expression); 



In my code as mentioned below, I am trying to get the value from textbox and build a string to pass into the function GetNameFleeBooleanStyle(string expression). 



//Update the map using the new style based on input text 

protected void QryByName_Click(object sender, EventArgs e) 



string roadName = QryNameTextBox.Text; 

string nwroadName = ".*" + roadName; 

// roadName = "(FeatureType = POINT )"; 

// string roadNameEx = "^.*[aA][vV][eE].*"; 

ServerLayerOverlay roadsOverLay = SilverlightMapConnector1.ServerLayerOverlays[0]; 

MsSql2008FeatureLayer msSql2008Layer = (MsSql2008FeatureLayer)roadsOverLay.Layers[0]; 

FleeBooleanStyle newRoadStyle = GetFleeBooleanStyle(roadName); 

msSql2008Layer.ZoomLevelSet.ZoomLevel01.CustomStyles.Clear(); 

msSql2008Layer.ZoomLevelSet.ZoomLevel01.CustomStyles.Add(newRoadStyle); 

msSql2008Layer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20; 




//Create a FleeBoolean style to use in map 

FleeBooleanStyle GetNameFleeBooleanStyle(string expression) 



FleeBooleanStyle selectedRoadStyle = new FleeBooleanStyle(expression); 

selectedRoadStyle.StaticTypes.Add(typeof(System.Convert)); 

selectedRoadStyle.ColumnVariables.Add("FeatureText"); 

selectedRoadStyle.CustomTrueStyles.Add(new LineStyle(new GeoPen(GeoColor.SimpleColors.BrightOrange, 2), new GeoPen(GeoColor.SimpleColors.Red, 2))); 

selectedRoadStyle.CustomFalseStyles.Add(new LineStyle(new GeoPen(GeoColor.SimpleColors.Green, 2), new GeoPen(GeoColor.SimpleColors.Green, 2))); 

return selectedRoadStyle; 

}


Thanks,


Prava Kafle


 



Hi, Prava 
  
 Yes, if you want to filter render features with a wildcard; RegexStyle is the best choice for you. Please refer to the code of server-side below: 
    ShapeFileFeatureLayer layer = new ShapeFileFeatureLayer(MapPath("~/app_data/cntry02.shp")); 
                 layer.ZoomLevelSet.ZoomLevel01.CustomStyles.Add(AreaStyles.CreateSimpleAreaStyle(GeoColor.SimpleColors.Transparent, GeoColor.FromArgb(100, GeoColor.SimpleColors.Green))); 
                 layer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20; 
  
                 // Draw features based on regular expression 
                 RegexStyle regexStyle = new RegexStyle(); 
                 regexStyle.ColumnName = "CNTRY_NAME"; 
                 regexStyle.RegexItems.Add(new RegexItem(".*land", new AreaStyle(new GeoSolidBrush(GeoColor.StandardColors.LightGreen)))); 
                 layer.ZoomLevelSet.ZoomLevel01.CustomStyles.Add(regexStyle); 
  
                 ServerLayerOverlay regexOverlay = new ServerLayerOverlay("RegexOverlay"); 
                 regexOverlay.Layers.Add("RegexLayer", layer); 
  
                 SilverlightMapConnector1.ServerLayerOverlays.Add(regexOverlay); 
  
 And you could use it on the client-side like this: 
  
             Map1.MapUnit = GeographyUnit.DecimalDegree; 
             Map1.CurrentExtent = new RectangleShape(-135.7, 83.6, 113.5, -53); 
  
             ServerLayerOverlay serverLayerOverlay = new ServerLayerOverlay("NativeServerWithFleeBoolean", "SilverlightMapConnector1"); 
             Map1.Overlays.Add(serverLayerOverlay); 
  
             Map1.Refresh(); 
  
 Thanks, 
 Khalil 


 



Hi, Prava


Sorry, I can't recreate your problem. I have downloaded your files,  and what you have done is right. I have used Cntry02 shape file with RegexStyle to test, and it works well. You have posted two images, one is with data and another one is without data. So I think maybe there is something wrong with your code on the client side or server side. If you still have this problem, please provide us with a simple sample to help me to recreate your problem. If your files is big, please send to support@thingeo.com and ask him to forward to me.

 


Thanks,

Khalil



Hi Khalil, 
  
 My application is working fine now. I am sorry for not posting an update before deleting the thread.  I figured out that  the problem was with datasize, I changed the data source to a sql table with 1000  records instead of  15,000 records. I was trying to generate a  Featurelayer in a map by using spatial data from SQL Server. My application was filterering large chunk of data using RegexStyle  and the Server timed out.  
  
 Thanks 
 Prava

Hi, Prava 
  
 Glad to see that you have solved this problem. 
 If you still have any problem about our products please let me know. 
  
 Thanks 
 Khalil

Please I am new to silverlight technology I have a sql 2008 spatial layer that  i wish to add to Map1 
 Db credintials: 
 UName: Wael    PW:Password   DBName: Incidens 
 would you please give me a kick off in how to add this layr to Map1

wael, 
  
 Please see the details in your another post. 
  
 gis.thinkgeo.com/Support/DiscussionForums/tabid/143/aff/28/aft/9572/afv/topic/Default.aspx#28298 
  
 Regards, 
  
 Gary