ThinkGeo.com    |     Documentation    |     Premium Support

Using GetFeatureInfo()

I am reading some map data from a WMS on a Amazon Web Server running GeoServer.  The WMS layer (actually a layer group) is configured to allow queries and appears to work fine using layer preview in GeoServer.



Unfortunately I am having trouble when trying to use the same layer from Map Suite.  The layer opens fine and I can zoom in, pan and so on but GetFeatureInfo always returns a count of 0.  The code I am using to query the layer looks like this:




private void theMapControl_MapClick(object sender, MapClickWinformsMapEventArgs e)
{
    WmsRasterLayer searchLayer = theMapControl.FindRasterLayer("ClipLayer"as WmsRasterLayer;
    searchLayer.Open();
    Dictionary<string, Collection<feature>> selectedFeatures =
        searchLayer.GetFeatureInfo(new ScreenPointF(e.ScreenX, e.ScreenY), "text/html", 1);
    if (selectedFeatures.Count > 0)
    {
        clsMyMessages.mySimpleNotification("Hello");
    }
    searchLayer.Close();
}



Do I need to do any other setting up to make this work? or am I maybe overlooking something?



Regards,

Jonathan

Oops - I put this in the wrong forum - it is should be in Desktop / WinForms.  Is it possible to move it?



Sorry,

Jonathan

Hi Jonathan, 
  
 It doesn’t matter to put into which topic. :) 
  
 As for your issue, I guess it might be a bug, and we are working on it. 
 We will update the status if any thing new. 
  
 Thanks, 
 Johnny

Hi Jonathan, 
  
 Thanks for your query, would you please make a confirmation to check if the Amazon Web Server support GetFeatureInfo Operation?  To see the server response more directly,Following code could be used to get the requestUri string, then the requestUri could be put on IE  
  
  private void Form_Load(object sender, EventArgs e) 
 { 
 …  
 searchLayer.SendingWebRequest += new EventHandler<SendingWebRequestEventArgs>(wmsImageLayer_SendingWebRequest); 
 … 
 } 
  
 void wmsImageLayer_SendingWebRequest(object sender, SendingWebRequestEventArgs e) 
 { 
 string requestUri = e.WebRequest.RequestUri.AbsoluteUri; 
 } 
  
 If possible, would you please provide us your webserver Uri for a further test? 
  
 Waiting for your further information. 
  
 Best Regards 
  
 Summer

Sorry for the delay.  I will provide you with that information today. 
  
 Thanks, 
 Jonathan

I tried the bit of code to get the URI and end up with:



79.125.121.243:8080/geoserver/wms?&SERVICE=WMS&REQUEST=GetFeatureInfo&VERSION=1.1.1&LAYERS=MasterMap&QUERY_LAYERS=MasterMap&STYLES=&BBOX=466957.076068265,106991.354820484,467062.992026696,107069.902955151&FEATURE_COUNT=1&WIDTH=1281&HEIGHT=950&FORMAT=image/png&INFO_FORMAT=text/xml&SRS=EPSG:27700&X=512&Y=228



trying that direct in a browser came back with a response that I think meant INFO_FORMAT parameter was wrong.

I tried again by removing &INFO_FORMAT=text/xml and it returned a value (when using the browser).



Regards,

Jonathan


Hi Johnathan, 
  
 Thanks for your further information, currently we support "text/xml" but not "text/plain", now, we are making a deeper discussion for supporting "text/plain", this might need a little while, would you please wait a little while before we figure it out? 
  
 Best Regards 
  
 Summer

Summer, 
  
 Certainly can wait.  I’ll try and investigate a bit more myself with some other WMS feeds, 
  
 Thanks, 
 Jonathan

Summer, 
  
 I have a little more information for you. 
  
 1.  I tried specifying “text/plain” and “application/json” in the GetFeatureInfo() call and then used the generated Uris in a browser and they worked fine, however there were no entries in the returned dictionary (SelectedFeatures.Count = 0). 
  
 2.  I looked at the capabilities of two other WMS feeds, one from the British Geological Survey (BGS) and one from the Forestry Commission (FCS).  The FCS appeared to support text/xml and the generated Uri worked fine however I still didn’t get any information back within the program.  The FCS Uri was: 
  
 “mapgateway.snh.gov.uk/ServicesWMS/FCS_National_Forest_Estate/MapServer/WMSServer?&SERVICE=WMS&REQUEST=GetFeatureInfo&VERSION=1.1.1&LAYERS=1,2,3,4,5,6&QUERY_LAYERS=1,2,3,4,5,6&STYLES=&BBOX=283969.718908131,760428.016124843,287359.029577903,762941.556434197&FEATURE_COUNT=1&WIDTH=1281&HEIGHT=950&FORMAT=image/png&INFO_FORMAT=text/xml&SRS=EPSG:27700&X=767&Y=621” 
  
 Hope this helps, 
 Jonathan

Hi Johnathan, 
  
 Thanks for sharing your information, now we are digging it deeper, any thing new will be updated here immediately. 
  
 Best Regards 
  
 Summer

Hi Johnathan, 
  
 Sorry for the waiting. 
  
 After some investigations, I guess we might have some misunderstandings on GetFeatureInfo method.  What I can sure is the WmsRasterLayer GetFeatureInfo method only can work with the WmsServerEdition which is our WmsServer production. Though those investigations, I guess the reason why the GetFeatureInfor can’t work with other Wms service is because each WMS server owns its own featureinfo template and this will make WmsRasterLayer GetFeatureInfo method can’t handler all kinds of WMS server. 
  
 Here is a video to show how it works fine with WmsServerEdition screencast.com/t/Ms1zd95O  
  
 Hope it helps. 
 Thanks, 
 Johnny 


Thanks for the extra information.



When using our own test geoserver I initially used WFS to handle getting feature information and that worked really well,

however we are now working with other WMS providers and that is not an available option.



Does the desktop edition send the feature info request and get the reply, but then not processes it as it is not in the expected format?



If so would it be possible for me to intercept the reply and maybe try and display the information myself?

for example using a simple display XML function?



Regards,

Jonathan

Hi Johnathan, 
  
 Yes, we can intercept the response and then process it by ourselves. 
 We can register the SentWebRequest event in the WmsRasterLayer and then process the response. The below codes show how to handler the xml format: 
  wmsImageLayer.SentWebRequest += new EventHandler<SentWebRequestEventArgs>(wmsImageLayer_SentWebRequest);

void wmsImageLayer_SentWebRequest(object sender, SentWebRequestEventArgs e)
        {
            HttpWebResponse response = (HttpWebResponse)e.Response;
            string contentType = response.ContentType;

            try
            {
                if (contentType.EndsWith("xml", StringComparison.OrdinalIgnoreCase))
                {
                    XmlTextReader xmlTextReader = new XmlTextReader(response.GetResponseStream());
                    XmlDocument xmlDocument = new XmlDocument();
                    xmlDocument.Load(xmlTextReader);

                    if (xmlDocument.SelectSingleNode("ServiceExceptionReport/ServiceException") != null)
                    {
                        string errorMsg = xmlDocument.SelectSingleNode("ServiceExceptionReport/ServiceException").InnerText;
                        throw new InvalidOperationException(errorMsg);
                    }
                    else
                    {
                        // HandleXmlInfoFormatResponse like GetFeatureInfo
                    }
                }
            }
            finally
            {
                response.Close();
            }
        }
 
 Similarly, we can handler the other type response for example the format is Json, or plain Text etc. 
  
 Hope it helps. 
 Thanks, 
 Johnny 


Johnny, 
  
 Thank you - that should be very useful. 
  
 Regards, 
 Jonathan

I have tried the code you suggested and I think it works really well (thanks), however unless I unregistered the handler I had problems with refreshing the layers (The request was aborted: The connection was closed unexpectedly.).  The code that appears to work is like this:




// GET FEATURE INFO TEST (FROM WMS)
WmsRasterLayer searchLayer = theMapControl.FindRasterLayer(“wmsImageLayer”as WmsRasterLayer;
searchLayer.SentWebRequest += new EventHandler<SentWebRequestEventArgs>(wmsImageLayer_SentWebRequest);
searchLayer.GetFeatureInfo(new ScreenPointF(e.X, e.Y), “text/html”, 1);
searchLayer.SentWebRequest -= wmsImageLayer_SentWebRequest;

And then the event handler.



I’m not sure if this is the best way to do things?  Is it acceptable / good practice or should I be doing something different?



Regards,

Jonathan

Hi Johnathan, 
  
 Good to hear it is fit for you. 
  
 It is a good practice based on the codes! 
 As for the exception caused by “The request was aborted”, I guess it is possible as we have closed the Response in the event. So, I guess removing the close method in this event should fix this issue. 
  
 If the issue persists, please feel free to let us know. 
 Thanks, 
 Johnny 


Johnny, 
  
 Thanks - I think it all looks to be working now.  I will need to work on some nice presentation of the data but the functionality is good. 
  
 Regards, 
 Jonathan

Hi Johnathan, 
  
 Good to hear it works. 
 If any questions, don’t hesitate to let us know. 
  
 Thanks, 
 Johnny