ThinkGeo.com    |     Documentation    |     Premium Support

Passing map data from server to client

Hi,


I'm using the Map Suite WPF Desktop Edition.


All map data is stored in Postgre database.


My WPF-application gets all data using PostgreSqlFeatureLayer, appealing directly to the database.


But now I have to build a client-server architecture, getting all the layers from the database on the server-side, and then transferring them to the WPF map control on the client-side in some way (perhaps via WCF-service), without referring to a database on the client-side.


Could you explain to me how to do it properly, please?


Elena



Hi Elena, 



Welcome to MapSuite and thanks for the post,  please get the code bellow: 



string connectString = "Server=YourServerIP;User Id=YourUserID;Password=YourPassword;DataBase=YourDataBaseName;"; 

PostgreSqlFeatureLayer postgreLayer = new PostgreSqlFeatureLayer(connectString, YourTableName, YourFeatureIdColumn); 


And the rest code please refer to the sample at  HowDoISample/Extending MapSuite/LoadAPostgreSqlFeatureLayer

If you have any question, feel free to ask! 



Regards, 

Edgar



Hi Edgar, 
  
 Thanks for the reply! Yes, I have some questions. 
  
 That example (LoadAPostgreSqlFeatureLayer) assumes that there is direct access to the database server from a client machine. Previously, access was, but now it is not. Only the application server has access to the database server. I can get the layer using the database connection string only on the server-side of the application. And the question is how to transfer the layer data from the server-side to the client-side, to the map control.

Hi Elena, 



If you want to transfer the data from the server to the client, please use our “GeoSerializer” to serialize all features to string on Serverside then use “Socket” to transfer it to the client side, when the client side receives the serialized string, use “GeoSerializer” to deserialize the string. Attached is the snip code for your consideration. 



We recommend you to make the client-side be able to directly connect to the database, because this way the structure of solution will be much easier. 



Hope it helps,thanks, 



Johnny



11137sample.txt (1.39 KB)

Hi Johnny, 
  
 thank you very much for the sample! You have dispelled my doubts. This approach works. 
  
 Unfortunately, I still can not use GeoSerializer. I receive error messages of type “hexadecimal value …, is an invalid character” while deserializing, so my service returns serializable Collection<Feature> to client, where I’m adding each feature to InternalFeatures of InMemoryFeatureLayer. 
  
 Transferring data from the server-side and creation of in-memory layers slightly increases the time spent on the displaying of the map. 
  
 I have one especially large layer containing 200,000 features (this layer’s dbf file size is 100Mb and shp file is 35Mb). Providing data for this layer and creating the appropriate InMemoryFeatureLayer for it systematically leads to OutOfMemory errors, which occur at different moments, mostly when transfer data and deserializing, and once when building index for InMemoryFeatureLayer (at System.Collections.Generic.List`1.set_Capacity(Int32 value)). As long as only one map control is open in the application, these errors do not occur, but if I open the second and more, I start getting OutOfMemory errors. 
  
 Perhaps I need to look for ways to optimize getting the map layers from the database and transferring them to the client-side, given the fact that the application can open more than one map control. Maybe I need to look for ways of sharing once obtained from the database map layers between multiple map controls. 
  
 Returning to the fact that the application can open more than one map control, can I run into problems because of the presence of large number of in-memory layers at once? (I was able to open 5-7 map controls simultaneously without any problems, when I used PostgreSqlFeatureLayers)

Hi Elena, 
  
 First suggestion to optimize the problem, the client could pass a boundingbox of the area which will be drawn on map to the server, then the server use the boudingbox to find the needed features in this area, then pass the needed features to the client-side, this way the transfered features will decrease a lot. 
  
 Another suggestion is to use ClusterPointStyle, here is link for how to use it: 
 gis.thinkgeo.com/Support/DiscussionForums/tabid/143/aff/21/aft/11024/afv/topic/Default.aspx
  
 The last suggestion is to use zoomlevel to control how many feature will show, for example,  add the different type of features to higher or lower zoomlevel to prevent load all features at the beginning.  
  
 For example, zoomlevel1-10, show your inmemoryfeaturelayer, and zoomlevel 11-20 show your markers, just make sure at the first time of map load, doesn’t load the zoomlevel of your markers exist.  
  
 Hope it helps 
  
 Gary