The code that you included in your last email seems to be missing the stuff that handles the zoom. i.e. a comment suggests that you create a $extent_obj for this, which is either initialized from the values in the $extent[] array, or from the $map->extents which have just been set from the contents of the $extent[] array, so in both case you get more or less the same result minus the width/height ratio adjustment that MapServer does automatically on $map->setExtent()... and there is nothing to adjust the extents to reflect the last zoom operation and pass that to $map->setExtents().

What does the $extent[] array contain when this code starts being executed? Is it the extents before or after applying the zoom?

Daniel

percy wrote:
Thanks Daniel, but I've been testing this pretty hard as you can see from the code snippet below (testing parts are commented out). The layers are getting turned on and off correctly in the section right before the call to processlegendtemplate...

$map = ms_newMapObj($mymap);
    if ($extent['x1'] && $extent['y1'] &&
        $extent['x2'] && $extent['y2']) {
        // set the extent
$map->setExtent($extent['x1'], $extent['y1'], $extent['x2'], $extent['y2']);

        // set up extent object for use in zoom (!?!?)
        $extent_obj = ms_newRectObj();
$extent_obj->setExtent($extent['x1'], $extent['y1'], $extent['x2'], $extent['y2']);
    } else {
        $extent_obj = ms_newRectObj();

$extent_obj->setExtent ($map->extent->minx, $map->extent->miny, $map->extent->maxx, $map->extent->maxy);
    }
//now handle turning the layers on or off
if (count($layers)>0) {
//echo "I see more than 0 layers\n";
  for ($i=0; $i<$map->numlayers; ++$i) {
    $oLayer=$map->getLayer($i);
//    echo "got layer number".$i;
    if (in_array($oLayer->name,$layers)) {
      $oLayer->set("status",MS_ON);
//      echo "turning on layer  ".$oLayer->name;
//      echo $oLayer->status;
    } else {
      $oLayer->set("status",MS_OFF);
//      echo "turning OFF layer  ".$oLayer->name;
    }
  }
}
$my_html=$map->processLegendTemplate(null);
//echo $_SERVER['QUERY_STRING'];
echo $my_html;



Daniel Morissette wrote:
percy wrote:

When you zoom in on the map, the scale dependencies all work great for the map, but the legend is always out of whack. I am using php/mapscript to generate a processlegendtemplate() request. For debugging this issue, I have also tried just a straight drawlegend() request and I get similarly odd behavior. The geologic faults, which are set to show up at a scale of 1:500,000 don't show up in the legend until zoomed in to around 1:100,000. (though sometimes if I zoom in small increments, they'll show up sooner...)


The problem could be related to the order in which you make calls in your PHP script. The legend object uses the last calculated scale in its tests to decide which layer/classes to include in the legend, so if you call processlegendtemplate() before the extents and scale have been updated to reflect the last zoom operation then you could get this kind of behavior.

I just did a quick check in the code and $map->setExtent() does update the scale value, so if you call that with the right extents before processing the legend then you should be fine.

Daniel



--
Daniel Morissette
http://www.mapgears.com/

Reply via email to