ThinkGeo.com    |     Documentation    |     Premium Support

WMS Server and openlayers

Hi,


I have went thru the quickstart tutorial of map suite wms server and created the hellowmsplugin dll. I have deployed the project as WmsPluginService in IIS 7 with framework version 2.0. Now, i want to add the simple map i have created to my web application project. I have found the following format to use the wms with openlayers. How can I modify this so that it displays the following link in the web application project? (The link shows a preview of the simple map at my local host) 


localhost/WmsPluginService/MapView.htm?serverUrl=WmsHandler.axd&layer=Map&style=DEFAULT&projection=EPSG:4326&units=degrees&bbox=26,36,45,42


var map = new OpenLayers.Map("map", options);

var wms = new OpenLayers.Layer.WMS(  "ThinkGeo Wms Server", serverUrl,

                                   { LAYERS: layers, STYLES: styles, FORMAT: 'image/png' }

            );


map.addLayer(wms);



Hi Rumeysa,  
  
 Within the Map Suite map controls you could use a WmsRasterLayer and provide the URI you have setup for your WMS server. 
 wiki.thinkgeo.com/wiki/ThinkGeo.MapSuite.Core.WmsRasterLayer

Hi Rumeysa,


Within the Map Suite map controls you could use a WmsRasterLayer and provide the URI you have setup for your WMS server.

wiki.thinkgeo.com/wiki/Think...asterLayer



Hi Ryan,



Thanks a lot for the reply.



To elaborate more on my question, I have the hellowmsplugin code. I have added the layers to the map using mapconfiguration and return the mapconfiguration at the end of the code. After running the code, a dll file is created.

I have deployed the project in iis 7. When I browse the web application, and click on preview to see the map it opens up the map showing the layers I have added. Now, I want to consume this map using openlayers in another web application project. 



You mentioned that I must use wmsrasterlayer. Do I add this within the hellowmsplugin code or to the javascript code in the project where I want to consume this map ( where I have added maps from google and other sources like bing?) Is there any example for wmsrasterlayer? I have the following piece of code from my javascript file in my other web application project that displays maps with openlayers.How can I embed the thinkgeo map i deployed in the IIS and call this with openlayers in the javascript code file?



var map;var mapoptions=(projection: new OpenLayers.Projection("EPSG:900913"),displayProjection: new OpenLayers.Projection("EPSG:4326"),  units: "m", numZoomLevels: 21, maxResolution: 156543.0339 //the mapoptions parameters go on); map= new openlayers.map ('map',mapoptions);var googlelayerS= new openlayers.layer.Google("Google streets",{numZoomLevels: 20, 'sphericalMercator': true })map.addlayers(googlelayers);



Hi Rumeysa,


I would recommend referring to OpenLayers support and API documentation for advise on accessing WMS servers with an OpenLayers client.

dev.openlayers.org/apidocs/f...MS-js.html


If you are using Map Suite as your WMS Client we have WMSOverlays object that would be the best choice for connecting to your new WMS Server layer.


One element that might be helpful in determining the parameter you need to send it would be the LoadAWMSOverlay sample application where we show some samples that work with our WMS Samples server.


Here is some sample code that shows some of the parameters for the WMSOverlay:

 



WmsOverlay wms = new WmsOverlay("WMS Overlay");
wms.Parameters.Add("layers", "Countries02");
wms.Parameters.Add("STYLE", "SIMPLE");
wms.ServerUris.Add(new Uri("wmssamples.thinkgeo.com/WmsServer.aspx"));
wms.TileType = TileType.MultipleTile;
wms.TileHeight = 256;
wms.TileWidth = 256;


In the quickstart tutorial project, there is a service called WMS within the default.aspx.cs code. But how can i get to the contents of this servicE?

I want to display the simple map created by the quickstart tutorial in another application that uses openlayers. 

I used the following code inside my javascript file that has various maps like google and bing. I was able to display this map in my web project.


var wms = new OpenLayers.Layer.WMS("ThinkGeo",  "wmssamples.thinkgeo.com/WmsServer.aspx", { LAYERS:  'Countries02', STYLES: 'SIMPLE' });map.addLayers(wms);

 

But when i write the following code, it displays pink tiles on the window. 


var wms = new OpenLayers.Layer.WMS("ThinkGeo", "localhost/WmsPluginService/MapViewA.aspx",  {LAYERS: 'Map'} );


Do i need to write a service to get the parameters and serve them to the openlayers?


Thanks in advance



You can get to the contents of the WMSPluginService by setting the WMSPluginService as the StartUp Project and running the application. 

Once the WMS Server Admin page comes up you should see a 'View Capabilities' link that will provide you with the standard XML based WMS Service specification. 

Screenshots of part of the admin page are shown in the 'Managing Plugins' section of the WMS Server Quick Start Guide found at this link: wiki.thinkgeo.com/wiki/Map_S...tart_Guide



Here is the url of the View Capabilities link which is a standard 'GetCapabilities' request:

localhost:62626/WmsHandler.axd?SERVICE=WMS&VERSION=1.1.1&REQUEST=GetCapabilities
 

Here is the result of the View Capabilities link:





Thanks for posting Ryan. Okey, I was able to get it but the issue is about how to consume the wms in a web application project- inside a javascript file with openlayers? I have setup the wms server correctly and I deployed it in IIS 7. Now I want to consume this wms on a client application. The client application is a javascript file and in this javascript file we serve the google and bing maps with openlayers. I want to add the thinkgeo map inside the javascript file with openlayers to serve it in our web application. 
 I have not downloaded map suite web or desktop edition to my computer.Because my web application project is not made with map suite. The quickstart tutorial shows it on the map suite. But, I want to do this without that.

Hi,



I found a link that shows the deployment of wms server and  how it can be consumed by the client application. My client application  is a web application that uses a javascript file to show the maps on  the application. (I am not using map suite)


I also converted the mapview.htm to mapview.aspx

 

wiki.thinkgeo.com/wiki/Map_Suite_WMS_Server_Edition_Deployment_Guide



I  followed the instructions and now when I browse thru the IIS 7 in my  server and click on view capabilities I get the screenshots labeled as  after modification.



Note that before modifying the Capability  files "CapabilitiesXml/WmsHandlerCapabilities.xml ,  SecureServerRequestsWmsHandlerCapabilities.xml,  ThrottleUserRequestsWmsHandlerCapabilities.xml" when I browse thru my  wms server and click on View Capabilities I get the before modification  screenshot.






What is the purpose of modifying these files? I want  to be able to call this map from my javascript with openlayers.   Using  the following code in my javascript to display the map doesn't give me  any results. still pink tiles occuring in my application.


var wms = new OpenLayers.Layer.WMS("ThinkGeo",  "localhost/WmsPluginService/MapViewA.aspx", { layers: 'Map',  styles: 'DEFAULT' });


But when I use the following code inside my javascript I can see the thinkgeo map in my web application which is not the one I developed.


code lang="script">var wms = new OpenLayers.Layer.WMS("ThinkGeo", "wmssamples.thinkgeo.com/WmsServer.aspx", { LAYERS: 'Countries02', STYLES: 'SIMPLE' });



 



Rumeysa,


I think you are a bit confused. The changes you made to the WmsHandlerCapabilities.xml are okay but are not really necessary.


The GetCapabilites command is something you send to a WMS server in order to see what layers the WMS can provide you. 

It is an informational page about what the WMS server can provide.



When you send GetCapabilities the WMS server provides you an XML file that serves as a 'Table of Contents' for the Layers that the WMS Server can provide. Some of the contents of this file are configurable by modifying the WmsHandlerCapabilities.xml file but most of the GetCapabilities XML is automatically generated by the WMS PluginService. So in the second and third screenshots that I provided (shown below for convenience) you can see that in the Layer section there are multiple available Layers.


Available Layers include:

Simulate Vehicle Tracking

Dynamically Draw on Maps

Change Style By User

Display A Simple Map

Get Data from Custom Sources

etc...



 


This layer listing along with the SRS, LatLonBoundingBox, and Style information for each Layer are created from the Plugins that you create and add to the WMSPlugInService. The WMS PluginService reads the plugin dlls you create and then creates the XML for each of them.


Each of these layers is made available by creating a WMSPlugin, compiling it into a dll and adding that dll to the WMSPlugInService. You then deploy the WMSPluginService to your server with all the necessary WMSPlugin - Dlls.

This is the process detailed in the Quick Start Guide.


So why all the explanation about the GetCapabilities?

Because the GetCapabilities shows you what parameters you should send in from your OpenLayers client to get the maps that you want.


If you have the WMSPluginService running on your IIS server surely you have setup a host header for this site? 

So let's say you setup wms.myspecialserver.com for your wms server site.


Let's then say for testing you deployed the 'Display A Simple Map'  WMSPlugin to the WMSPluginService. The name that is specified for this plugin in the GetNameCore() is "Display A Simple Map".



The client will use the 'GetMap' command to request tiles from the WMS server. 

Let's look at the GetCapabilities XML again and find out what our parameters are for our WMS request:

GetMap section - URL: wms.myspecialserver.com/WmsHandler.axd





Layer: "Display A Simple Map"

Style Parameter: "Default"





So using the information from our GetCapabilities we can put together the URL and parameters you need to send in from your client.

For OpenLayers I would recommend referring to the OpenLayers' API Documentation to see how to arrange these parameters correctly: dev.openlayers.org/apidocs/f....Layer.WMS



Below is a sample from the Open Layers documentation showing a sample of a request:



var wms = new OpenLayers.Layer.WMS("NASA Global Mosaic","wms.jpl.nasa.gov/wms.cgi",{layers: "modis,global_mosaic"});

You might try replacing the above with the information you find in the GetCapabilities of your WMS Server.

 



Hi Ryan,


Thanks a lot for the detailed reply. The explanation is very informative. 


I really got confused since I am very newbie to this area.That's why I kept posting questions which might have been silly for you. 


In your response, you have said that I should have set a host header for the web application I deployed at IIS. But, I have not done this actually. I just converted the project to a web application and  was just calling localhost/WmsPluginService/MapView.htm? inside the openlayer.layer.wms as the layer. I did not know that I should have setup a host header and called this as the serverurl inside openlayers.layer.wms. I will try that.


Besides this, I have read a few articles on the web that says that the projection matters for the map. Inside the javascript code, we are using epsg:900913 projection to render the maps. and I realized that I am displaying the simple map in epsg:4312 projection format. So, could that have created a problem.?I altered the Hellowmsplugin class code to display the map in epsg:900913 format. But, I could not set the projection to be a spherical mercator. In the worldMapkitplugin, there is an example for it. But, can I also make the simple map in Hellowmsplugin as spherical mercator? I could not find an example on it in your website.


worldMapKitLayer.Projection = WorldMapKitProjection.SphericalMercator;


Thanks a lot in advance



Hi Rumeysa, 

I was not sure of your experience level and as there are several moving parts in the WMS Server I wanted to try an give you as good of an overview as possible.


You are correct that having your map in an incorrect projection could make it difficult to view it. For your map to display correctly and have all the map data 'line up' with each other, all your data needs to use the same projection.


Map Suite has a Proj4Projection class that can help you to re-project shapefiles. So if you need to reproject from Geodetic/WGS84/Decimal Degrees(which is the projection of the sample Countries02.shp) to Google's projection (900913) you could use the following code for your Plugin's Map Configuration:



protected override MapConfiguration GetMapConfigurationCore(string style, string crs)
{
// Get the directory to the sample data
string worldLayerFilePath = Directory.GetParent(Directory.GetParent(AppDomain.CurrentDomain.BaseDirectory).FullName).FullName + Path.DirectorySeparatorChar + "SampleData" + Path.DirectorySeparatorChar + "Countries02.shp";

// If want to know more srids, please refer Projections.rtf in Documentation folder.
Proj4Projection proj4Projection = new Proj4Projection();
proj4Projection.InternalProjectionParametersString = Proj4Projection.GetEpsgParametersString(4326);

proj4Projection.ExternalProjectionParametersString = Proj4Projection.GetGoogleMapParametersString();


// Create the world layer from a shapefile and add a style to it
ShapeFileFeatureLayer worldLayer = new ShapeFileFeatureLayer(worldLayerFilePath);
worldLayer.ZoomLevelSet.ZoomLevel01.DefaultAreaStyle = AreaStyles.Country1;
worldLayer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20;
worldLayer.FeatureSource.Projection = proj4Projection;

// Create a MapConfiguration and add the layer to it
MapConfiguration mapConfiguration = new MapConfiguration();           
mapConfiguration.Layers.Add("WorldLayer", worldLayer);
return mapConfiguration;
}


Hi Ryan, 
 I was busy with my other projects so i could not get onto this for a couple of days. Thanks for the detailed reply. I will get my hands on the code you have given.  
  
 I have a question about setting up a host header for the site. My question is not about the how part but basically what I did before was that I have deployed the wmspluginservice as an application under the default web site at  iis 7. I was browsing thru this application and calling the localhost/WmsPluginService/MapView.htm? inside openlayers. So I did not quite understand what you meant in your statement. Is it that I have to add a web site for my wmspluginservice at IIS 7 rather than just making it as an "application under default web site"?  
  
 Thanks a lot, 
 Rumeysa

 



Hi Rumeysa,  
  
 I believe this should work but this is more of a IIS question then a Map Suite WMS Server question. :) 
  
 It is really your preference but in my opinion this adds some complexity to the setup. 
 You should be able to create the WMS Server as a web application. You would want to treat this web application just like you would a Website. So you would want to make sure your Default Website had a DefaultDocument of WebForm1.aspx, which would be found in your Web Application. Potentially you could also setup an HTTP redirect on your site to point WMS request to your WMS server Web Application but we are getting beyond the scope of the support offered in this forum. 
  
 Try setting it up and let us know how it works for you!

Hi Ryan, 
 Thanks a lot for the detailed reply. I was able to publish the map thru openlayers without creating a host header. I just deployed the wmsplugin as an application under the default site at iis 7. As a matter of fact, my implementation thru openlayers was right (I was using the information published in the xml file) to publish the map. But my projection was not correct. So after using the projection class you have provided, I could get the map to be displayed.  
 I displayed the thinkgeo map as a base layer. Now, I should be able to display the thinkgeo map with my own data on it as an overlay. Is there any example for this? Also, can I display my own data as an overlay on the google maps with thinkgeo?  
 Thanks a lot, 
 Rumeysa Yilmaz

Hi Rumeysa, 
  
 You can render our map on client side now, that’s OK. Your question is how to render your own data via our map control, I think you can get more help from our HowDoISample project both in Desktop edition and web edition. Or you can reference online samples here: wiki.thinkgeo.com/wiki/Map_Suite_Web_Edition_All_Samples 
  
 Our map control support render many types of data. 
  
 For your second question, I think you are asking whether you can render your own data and the base layer is Google Maps? If you render your data as an overlay, you can choose Google map as base overlay in Map, I think that should works. 
  
 Regards, 
  
 Don