queryByPoint on dynamic layer from mysql

Doug Williams williams at WEBSAWYER.COM
Fri Feb 17 13:58:49 EST 2006


Hi,
Trying to query points that I have added to my map with php_mapscript from a
mysql table. 
I've bumbled through the "set index" problem in older versions, 
have installed MapServer 4.8.1, 
and now seem to be able to get records from my query, but... 
while the points and labels show up on the map properly, 
indicating that the layer of points is being created and the lat/lon and label
values are associated properly,... 
when I process the records obtained from my queryByPoint, 
using getShape to get at the details, 
There is no data in the shape object's members for the dynamic layer, although
the result objects from the point query do have the correct index values that
I programmatically set (incrementing from zero by 1 ... i tried incrementing
by five to see if index values needed to be 'just so', and that broke the
point query - yes, i believe they need to increment by one from zero).


Querying layers (from standard shape files added to the map from a mapfile)
with the same code works as expected. I can get a shapes member values with
either values() or getValue() ... works the same both ways.


It was not possible to query dynamically added points in phpmapscript in the
old version I last installed (4.4) because the index for the shapes was
readonly and incorrectly set to -1. Now I can set the index values and the
queryByPoint does grab the point, but the result record seems to have no data.
I must be doing something wrong. 


Any help is greatly appreciated!


++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 =================================================================================
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++


Here's the bit of code where I can't get the details for the dynamic layer,
though the code works for the mapfile layers. 
This code was copied from the list serve and modified slightly


for ($iRes=0; $iRes < $numResults; $iRes++) 
{ 
$oRes = $oLayer->getResult($iRes); 
//echo "<script>window.alert('oRes tile index: " . $oRes->tileindex . " oRes
shape index: " . $oRes->shapeindex . "')</script>"; 


// the shape index values I 'set' when adding the points (in prior code, shown
below) are correct, tileindex values were -1


$oShape = $oLayer->getShape($oRes->tileindex,$oRes->shapeindex);
printf("<TR>\n");
//printf("<script>window.alert(' bounds(%f, %f)-(%f, %f)')</script>", 
// $oShape->bounds->minx, $oShape->bounds->miny, 
// $oShape->bounds->maxx, $oShape->bounds->maxy); 
// bounds values are good for all layer records EXCEPT dynamic, for which they
are all 0 (zero)


for($iField=0; $iField < sizeof($selFields); $iField++) 
{ 
// $tempval = $oShape->getValue($oLayer, $selFields[$iField]); // both these
methods give the same results 
$tempval = $oShape->values[$selFields[$iField]]; // both these methods give
the same results 


// in both cases I get the field name properly from $selFields 
// but not the value from the shape object 
// again, the problem only occurs for the dynamic layer 
// data is properly read for the other layers


if ($iLayer == "points") { // points is the dynamic layer - this is just for
debugging as with the other alerts
echo "<script>window.alert('$iLayer : $selFields[$iField] : $tempval
:')</script>"; 
} 
printf("<TD BGCOLOR=#FFFFFF>"); 
printf("%s", $tempval); 
printf("</TD>"); 
} 
printf("</TR>\n"); // yes, i know they say not to use tables anymore
$oShape->free();
$numResultsTotal++; 
}


++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 =================================================================================
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++


here is the code where I create the dynamic layer:


// this function came from the list server, although I added input variables
for label ($labeltext) and index ($pointnumber)
function add_point_to_layer($layer, $longitude, $latitude, $labeltext,
$point_number) {
  // create and initialize new point object
  $point = ms_newPointObj();
  $point->setXY($longitude, $latitude);
  // create and initialize new line object
  $line = ms_newLineObj();
  $line->add($point);
  // create and initialize new shape object
  $shape = ms_newShapeObj(MS_SHAPE_POINT);
  $shape->add($line);
//echo "<script>window.alert('label text: " . $labeltext . "')</script>";
  $shape->set('text', $labeltext);
  $shape->set('index', $point_number);
  // add our shape
  $layer->addFeature($shape);
}


if ($pointshow) {


   if (!$orderby) $orderby = "id";
//   echo $orderby . "<br>";


   $query = "select * from peop order by $orderby";


   $points = mysql_query($query);


   if ($points) {
      $num_points = mysql_num_rows($points);
      //echo "$num_points";


      if ($num_points > 0) {   // this code was copied from the list serve and
modified slightly
         $ptlayer = ms_newLayerObj($map);
         $ptlayer->set("name", "points");
         $ptlayer->set("type", MS_LAYER_POINT);
         //$ptlayer->setProjection("init=epsg:4326");
         $ptlayer->set("status",  MS_ON);
         $ptlayer->setMetaData("DESCRIPTION",  "Points");
         $ptlayer->setMetaData("RESULT_FIELDS",  "text index");  // these are
the shape members that I wish to read in the query
         $ptlayer->set("template",  "points_template.html");


         $ptclass = ms_newClassObj($ptlayer);
         $ptclass->set("status", MS_ON);
         $ptclass->set("name", "Points");
         $ptclass->label->set("type", MS_TRUETYPE);
         $ptclass->label->set("font", 'times');
         $ptclass->label->color->setRGB( 200,100,200);
         $ptclass->label->outlinecolor->setRGB(255, 255, 255);
         $ptclass->label->set("size", 11);
         $ptclass->label->set("position", 1);


         $ptstyle = ms_newStyleObj($ptclass);
         $ptstyle->set("symbol", $map->getsymbolbyname( 'circle'));
         $ptstyle->set("size", 8);
         $ptstyle->color->setRGB( 200,100,200);
         $ptstyle->outlinecolor->setRGB(255, 255, 255);


         for ($i=0; $i < $num_points; $i++) {
            $row = mysql_fetch_array($points);
//echo "<script>window.alert('outer- label text: " . $row["username"] .
"')</script>";
            $indexforshape = $i;
            $labeltxt = $row["username"];
            add_point_to_layer($ptlayer, $row["lon"], $row["lat"], $labeltxt,
$indexforshape);
         }


      } else {
         //echo "$num_points points in database.<br><br>";  // should be zero
      }


   } else {
      //echo "Query error.";
   }


}


++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 =================================================================================
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++



More information about the mapserver-users mailing list