ThinkGeo.com    |     Documentation    |     Premium Support

Dynamically adding 'plugin' to WMS Server

Hi,


 


Here is my scenario:


I am required by my client to provide a web application based on JQuery framework and OpenLayers. NOTE: No aspx and no thinkgeo web suite control allowed :(.


I have a ThinkGeo WMS server which works great, and I provide REST services build ontop of ThinkGeo Web Suite Edition. Using these services, I construct shapefiles from data residing in a MySql database. I need to display those shapefiles in the OpenLayers map. I tried converting the shapefile to GeoJSON (successfully and every quick operation), however, the problems is, using GeoJSON, it takes about 40 minutes to load a shapefile that represents all ZIP Code features(>30k features) for the USA!! So GeoJSON is out. Another option is to consume each feature as  WKT, one at a time - also very inefficient.


It would be fantastic if I could add the newly generated shapefile(s) to the WMS server on the fly, and then just consume them from there. Any ideas on how I could achieve this, or is it even in the realm of possibilities.


Any other suggestions would be greatly appreciated.


 


Thanks,


Chris


 


PS. I investigated doing this with GeoServer and it allows me to add new shapefiles to the WMS server on the fly via cURL, but styling etc is real pain in the *ss on GeoServer, and the performance in my experience is not as good as that of ThinkGeo WMS server.



Chris, 
  
 Thanks for your post.   I"m not sure I completely understand your requirements but let me take a shot at it. 
  
 So it sounds like you have some feature data in a MySQL database that you would like to display to your client.  If I’m understanding everything correctly I believe your best approach would be to modify your WMS Server to serve up this data as an additional layer.  This way your client app could request it along with your other WMS data or if they didn’t want that they wouldn’t request that layer.   With this approach you could handle everything on the server side and have a lot of control over what data is served up to the client and it would also perform very well would be my guess. 
  
 Let me know if you have thought about this approach. 
  
 Thanks!

Clint, 
  
 Your understanding is correct. I was thinking along the same lines. However, the data that the WMS server needs to extract, are based on parameters that the user will select during run-time. For instance, I have 750,000records in the MySql database representing reps, accounts, stores in the US. Based on a certain criteria (which may not be geographical in nature) that the user specify, only the records matching those criteria will be extracted and a layer of point features created. 
  
 I do know how to create the SQL query that will return the records, and create features based on the result set. What I don’t know is how to pass those criteria which will be used to generate the SQL query on to the WMS server for it to do its magic and serve up the layer. 
  
 Thanks 
 Chris

 Chris,


Thanks for the additional information.  What I would suggest is adding additional parameters on to your WMS Request within your applicaiton.  You can do this by calling the .Add method on the parameters collection on the WMSLayer or WMSOverlay you are using in your applciation consuming the WMS Service. 


Then on the WMS Sever side you shoudl be able to read these parameters just like any other query string paramters passed into the server and build up your custom layer from your database accordingly.  The WMS Server shouldn't care that these extra parameters exist.


I'm sure i have oversimplified everything a great deal but that is approach I would use at a high level.  Let me know your thoughts.


Thanks




Clint


 


 



Clint, 
  
 I have been unsuccessful so far. Any examples you can point me to? 
  
 Thanks, 
 Chris

Chris, 
  
 What part are you having trouble with?  Knowing how to pass the additional parameters to the WMS Server or writing the code on the WMS Server side to read the parameters and do you code against the MySQL database.  After reviewing this post again I had originally forgot that you were only using OpenLayers on the client side, however I still think you would be able to post additional parameters to the WMS Service through the OpenLayers API. 
  
 Have you looked at the WMSPlugins and WMSPLuginService examples that come with the Map Suite WMS Server edition for guidance on the server side coding? 
  
 Thanks!

Clint,


After I upgraded to WMS Server 6.0, I found the examples to be more complete that the previous version. I am going to try and use the SimulateVehicleTrackingWmsLayerPlugin as a starting point and work from there.


The next step is to figure out how to pass additional parameters from OpenLayers using their API. If you a quick answer ready - much appreciated :)


 


Cheers,


Chris



Clint, 
  
 I figured it out. One can actually specify any key/value pair during the creation of the WMS layer in OpenLayers, as long as those key do not clash with any of the ‘reserved’ keys like ‘LAYER’ or ‘STYLE’, etc 
  
 Thanks for you help so far. 
  
 Cheers, 
 Chris

Hello Chris, 
  
 I’m glad it’s working now, if you still meet any problems, don’t hesitate to let us know. 
  
 Regards, 
  
 Gary

Hi Chris,


Glad to hear that it works now, we implemented it in another way by overwriting the GetMapCore to analyze  CustomerParameter of MapRequest. Please check it out.


Thanks,


Johnny



DynamicallyCreateLayers.cs (2.4 KB)

Johnny,


The attachment leads to an html error page. I cannot see the code (which I suppose was in that attachment to your message). Please advise.


Thanks,

Chris



Gosh, it doesn't allow the *.cs or *.js file. Please check it out again.



DynamicallyCreateLayers.zip (1018 Bytes)

Johnny,


 


Thanks a bunch - this is exactly what I was looking for!


 


Thanks,

Chris



Hello Chris, 
  
 Feel free to let us know your problems. 
  
 Regards, 
  
 Gary