Zoom and Pan
To actually chage the extents, we need a way to access the coordinates of
the zoombox, panbox or click. So how do we get at these from within the
callback functions? In "zoom1.html" we used the same callback functions for
zoom and pan as for the command button that displayed the maps.
There is a crucial difference, however, between
callback functions for simple buttons and the ones for dragging. The latter
are always called with five parameters: the four coordinates of the
corners of the dragbox (in screen coordinates),
and the window where the dragging
started. This window has the inner variables contentLeft and contentTop, which
give the screen coordinates of the top left corner of its frame.
With these the zoom- or panbox can be computed in local window coordinates.
In
I wrote three new callback functions for zoom, pan and click.
They just show an alert with the coordinates of the zoombox
,
panbox
,
and click
.
A menu is used to assign zoom, drag or click to the windows.
Note that the second parameter to the global... functions
(the one that specifies which window should be made responsive
to zooming, dragging or clicking) is not an individual window, but an array
of windows. Many functions in MapClient can take as a parameter
both an individual element and an array of elements. In this case,
all three windows are made responsive to the specified dragging operation.
So the only thing that remains is translating these returned coordinates
to a MapServer call to produce a new map.
This happens in
.
The functions "submitZoom()", "submitPan()" "submitZoomOut()"
and "submitZoomAll()' compute the corners of the dragged area, and set
the MapServer variables "imgext", "imgbox" and "imgxy". With these,
MapServer can compute a new extent, based on the former extent and
the specified image coordinates.
These operations are completely independent of window resizing.
Note especially that variables are really persistent, so after a zoom
operation the "imgbox", "imgext" and "imgxy" variables have to be removed
explictly.
Without doing so, they would be sent again, and interfere with the next
map request.
And finally, mark the generic function "submitwin()" that is called when
all three windows are resized. All callback functions
from windows are called with the window that triggered the callback as
first parameter. That way, the generic function can address individual
windows.