I've added the patch with the GetFeatureInfo request possibility.
I've made the following changes.
ICanQueryLayer .cs: Added a boolean in ICanQueryLayer to set layers queryable for the WMS
VectorLayer.cs, GdalRasterLayer.cs, Layergroup.cs: implemented this boolean of ICanQueryLayer
WmsServer.cs: added the getFeatureInfo thing
capabilities.cs: added the required getfeature information for the capabilities
The code added to wmsserver works as follows:
A getfeatureinfo request is received
Checks on all necessary parameters
The map size and boundingbox are set according to the settings of the client and the point clicked in the map of the client is translated to the coordinates of the projection using this new map size and bbox
The optional parameter FEATURES_COUNT is checked whether the client requests one or more features per layer
For each requested layer, it is checked whether the layer is queryable. When true, the layer is queried and all found features are placed in the featuredataset.
This featuredataset is then sorted on area size, because when the client requests a limited number of features, the user is more likely to be interested in the feature with the smallest bbox (imagine a very curved polygon like the character C and a small
polygon within the bbox of the 'C' polygon. If the user clicks the small polygon, both the 'C' polygon bbox and the small polygon bbox will be returned. When the FEATURES_COUNT is set to 1, only the feature attributes of the 'C' polygon might be send back,
instead of the small polygon attributes the user wanted to see. By sorting on bboxarea from small to large, the small polygon attribute information will be send back. If the user wants to see attribute information of the 'C' polygon, he will click the 'C'
polygon and the click will only be within the 'C' polygon bbox and not within the small polygon bbox (hope this is clear to you;-))
Then for each feature that will be returned to the user (as set by FEATURES_COUNT) all the ItemArrays from the featuredataset are placed in the string.
I've added exceptions where necessary. I should have added an exception for quering layers which are set WMSQueryable= false, but I forgot ;-)
A difference between the WMS1.1.1 spec and the WMS 1.3.0 spec is the parameter name of the point clicked by the user. It used to be X and Y in 1.1.1, but this has changed to I and J in 1.3.0. In order to make life a little bit easy for myself in OpenLayers
and for others which might not know about this change, I added support for X and Y as well. If both are within the Request, the I and J will overwrite values set by X and Y. Including neither X&Y nor I&J will result in an exception.
These are the major changes.
Because somebody might not want queries on his WMS, I've added a variable to VectorLayer.cs, GdalRasterLayer.cs, Layergroup.cs, which sets querying by the WMS on or off. This is checked in wmsserver.cs to allow a query and in capabilities to set the query
attribute of the layer.
And off course the capabilties.cs is modified to include the GetFeatureInfo in the GetCapabilities.
I tested the functionality using polygon data (shapefile) and rasterdata(ASCII) using EPSG:28992 Dutch Rijksdriehoekstelsel