Query a layer in mapscript php

When learning to use mapserver and mapscript, the first steps have been to display, zoom and pan. Zooming and panning is quite easy, it is just a line like

where $map is a mapboject, $zoomfactor is a number telling how many times to zoom in or out, positive for zoom in, negative for zoom out, $clickpoint is a pointobject of the location of the click in image coordinates.

Then enter the urge to do a query as well – but not much luck. I reused the same $clickpoint and tried
$map->queryByPoint($clickpoint, MS_SINGLE, 1);
(after doing some adjustments in the map file) but to no luck. Digging into the kmap source code, I understood after a while that the coordinates needed to be in map coordinates and not image coordinates. That is just a simple linear transformation, just with the little snag that the y-coordinates go the opposite direction in the image than in the map. Kmap called the transformation function twice, once for each koordinate, I preferred to make one function for the two-dimentional transformation:

function pix2geo($mapx,$mapy,$minx,$miny,$maxx,$maxy,$sizex,$sizey)
// $mapx and $mapy: image coordinates of point of interest 				 
// $minx, $maxx,$miny, $maxy map extent in map coordinates
// $sizex and $sizey, width and height of image
	// swaps miny and max y since the coordinates acsends upwards in the map, downwards in the picture
	foreach( array('x','y') as $dim){
		foreach(array('map','min','max','size') as $par){

This can be used like:

$geopoint->setXY( $geoX,$geoY);
$map->queryByPoint($geopoint, MS_SINGLE, 1);

followed by getNumResults for each layer, getResult, getShape and finally getting the relevant values out of the shape.

I have to admit, I simplified things a bit at the beginning. The point needs to be in the projection of the queried data set. As I have the queried dataset in geographical projection and want to have the map in utm, I still have a problem there..

This entry was posted in mapserver. Bookmark the permalink.