[OpenLayers-Users] WMS GetFeatureInfo - difficult to click exactly on a point

Kimball, David (DCR) David.Kimball at state.ma.us
Fri Jan 30 16:48:12 EST 2009


Thanks for your help everyone...you're right Chris, I'm using GeoServer
not Mapserver.  So on Ivan's suggestion (and with Aleda's help) I went
with a WFS GetFeature request with a +/- 5 pixel BBOX (to make the
points and lines easier to select) and a custom list of fields (not
including the geometry), and parsed the GML2 response into what I
needed.  Actually easier-to-code and more functional than before!  

Here's the URL and some code snippets...there are actually separate
loadURL requests for the line and point layer queries now; this is just
the code for querying the line layer...

http://maps.massgis.state.ma.us/dcr/trails/DCR_RoadTrail12.html


// ======== THE EVENT CODE (PART OF THE INIT FUNCTION):

	map.events.register('click', map, function (e) {
		exy = e.xy;

		llMin = map.getLonLatFromPixel(new
OpenLayers.Pixel(e.xy.x - 5,e.xy.y + 5));  
			// don't know why these have to be backwards on
the Y coordinates...
		llMax = map.getLonLatFromPixel(new
OpenLayers.Pixel(e.xy.x + 5,e.xy.y - 5));  
			// don't know why these have to be backwards on
the Y coordinates...

		var url2 =  map.layers[0].getFullRequestString(
		{
			SERVICE: 'WFS',
			VERSION: '1.0.0',
			REQUEST: "GetFeature",
			TYPENAME: 'massgis:DCR.ROADS_TRAILS_LINE',
			OUTPUTFORMAT: 'GML2',
			PROPERTYNAME: lineFieldListString,
			MAXFEATURES: 20,
			SRSNAME: 'EPSG:26986',
			BBOX: llMin.lon + "," + llMin.lat + "," +
llMax.lon + "," + llMax.lat
		},
	
"http://giswebservices.massgis.state.ma.us/geoserver/wfs");
		OpenLayers.loadURL(url2, '', this, setHTMLLine,
setHTMLLine);

		OpenLayers.Event.stop(e);
	});




// ======== AND THE FUNCTION THAT IS CALLED WHEN THE GML IS RETURNED
(most of this is specific to placing the values on the web page):

function setHTMLLine(response) { 

var myGMLFormat = new OpenLayers.Format.GML();
var myGML = myGMLFormat.read(response.responseText);

// ---- IF A LINE WAS CLICKED, FILL THE LINE BOX
	if ((myGML.length > 0) && (map.getScale() <= maxLineScale)) {
		for (var k in myGML[0].attributes) { // only uses the
attributes of the first Line returned for now...

// ----- This places the value into a new variable and truncates it if
it's a long URL; this variable is used only for placing the text on the
screen, not for href values.  This way you can have a link with its
actual href string separate from its truncated presentation on-screen
			var thisIsTheValue = myGML[0].attributes[k];

// ----- PLACE THE VALUES INTO THE CORRECT AREAS IN THE ATTRIBUTE
DISPLAY AREA (if a place for them exists)

// ----- This places the value onto the page
			if ((document.getElementById("LINE_" + k)) &&
(document.getElementById("LINEROW_" + k))) {    // if a row for this
attribute exists in the line table-box
				document.getElementById("LINE_" +
k).innerHTML = thisIsTheValue;    // write the attribute value into the
table-box
				document.getElementById("LINEROW_" +
k).style.display = '';    // make this table-box row visible
			} // end if
		} // end for (k)
		document.getElementById("lineTableHeader").innerHTML =
"Road &amp; Trail Line Attributes";
	} // end of GPS LINE section
	else {
		document.getElementById("lineTableHeader").innerHTML =
"No Road/Trail clicked";
	}
} // end of function setHTMLLine




--David

||||||| David Kimball
||||||| GIS Specialist
||||||| MA Department of Conservation and Recreation
||||||| http://www.mass.gov/dcr/stewardship/gis/
||||||| david.kimball at state.ma.us
||||||| 617.626.1447 phone
||||||| 617.626.1349 fax

-----Original Message-----
From: Ivan Grcic [mailto:igrcic at gmail.com] 
Sent: Friday, January 30, 2009 5:09 AM
To: Christopher Schmidt
Cc: Richard Greenwood; users at openlayers.org; Kimball, David (DCR)
Subject: Re: [OpenLayers-Users] WMS GetFeatureInfo - difficult to click
exactly on a point

Hi,
i think its 2px default in Geoserver and cant be configured still. You
have to write ur own WFS request where u calculate BBOX..

 Take a look at wfsgetfeature control, might help
http://dev.openlayers.org/sandbox/topp/wfs/examples/wfs-getfeature.html


cheers
On Fri, Jan 30, 2009 at 5:36 AM, Christopher Schmidt
<crschmidt at metacarta.com> wrote:
> On Thu, Jan 29, 2009 at 07:20:38PM -0700, Richard Greenwood wrote:
>> > Kimball, David (DCR) wrote:
>> >> Hi everyone,
>> >>
>> >> I'm using a WMS GetFeatureInfo to simultaneously query the
attributes of
>> >> a line layer and a point layer (from GeoServer).  Unfortunately
you have
>> >> to click *exactly* on the center of a point to get it to send you
the
>> >> point attributes.
>
>> Look at TOLERANCE in http://www.mapserver.org/mapfile/layer.html
>
> The original poster said he was using GeoServer. Although MapServer
> does have a TOLERANCE parameter, I do not believe that there is a
> corresponding functionality in GeoServer.
>
> Regards,
> --
> Christopher Schmidt
> MetaCarta
> _______________________________________________
> Users mailing list
> Users at openlayers.org
> http://openlayers.org/mailman/listinfo/users
>



-- 
Ivan Grcic


> Kimball, David (DCR) wrote:
>> Hi everyone,
>>
>> I'm using a WMS GetFeatureInfo to simultaneously query the attributes
of
>> a line layer and a point layer (from GeoServer).  Unfortunately you
have
>> to click *exactly* on the center of a point to get it to send you the
>> point attributes.
>>
>> http://maps.massgis.state.ma.us/dcr/trails/DCR_RoadTrail10.html
>>
>>
>>       map.events.register('click', map, function (e) {
>>               var url =  map.layers[0].getFullRequestString(
>>               {
>>                       REQUEST: "GetFeatureInfo",
>>                       EXCEPTIONS: "application/vnd.ogc.se_xml",
>>                       BBOX: map.getExtent().toBBOX(),
>>                       X: e.xy.x,
>>                       Y: e.xy.y,
>>                       INFO_FORMAT: 'text/html',
>>                       QUERY_LAYERS: map.layers[8].params.LAYERS + ","
>> + map.layers[9].params.LAYERS,
>>                       FEATURE_COUNT: 50,
>>                       WIDTH: map.size.w,
>>                       HEIGHT: map.size.h
>>               },
>>
>> "http://giswebservices.massgis.state.ma.us/geoserver/wms");
>>               OpenLayers.loadURL(url, '', this, setHTML, setHTML);
>>               OpenLayers.Event.stop(e);
>>
>>
>> I searched a bunch for this and all I could find were suggestions to
do
>> a WFS getfeature instead of a WMS GetFeatureInfo, or to set some
options
>> on the server (not an option in this case).  I'd rather use the WMS
>> request because I'd rather not rewrite all my parsing Javascript, and
>> there might be a performance hit - some of the lines have hundreds of
>> vertices, and when I tried a similar approach recently with large
>> polygons it was slow because of the large amount of data sent back.
>>
>> So, is there any (client-side) radius/tolerance option for
>> GetFeatureInfo?
>>
>> Thanks a lot,
>>
>> David

Look at TOLERANCE in http://www.mapserver.org/mapfile/layer.html

-- 
Richard Greenwood
richard.greenwood at gmail.com
www.greenwoodmap.com



More information about the Users mailing list