Re: [mapserver-users] distance between line and a given point usingmapscript

2009-07-28 Thread Mark Brooks
I got the looping through each result.  However, all distances are
calculated to -1, which I know can't be right.  In debugging, I'm also
echo'ing the shape index for each result, but it's always the same.  Am I
constructing the layer correctly?


// create array of points from database query results.
for ($i=0; $row=mysql_fetch_assoc($result); $i++){

$points[$row['snum']][$i]['lat'] = $row['lat'];
$points[$row['snum']][$i]['lon'] = $row['lon'];

} // End loop through points

// create map object
$map = ms_newMapObj('wms.map');

// create new layer for hurricane tracks.
$my_layer = ms_newLayerObj($map);

// set some fields for this new layer
$my_layer-set(toleranceunits,miles);
$my_layer-set(tolerance,20);

// Create new class and add TEMPLATE.
$my_class = ms_newClassObj($my_layer);
$my_class-set(template,'query_template.html');

// Loop through points, create line for each storm, and add track points
to new line object.
while (list($snum,$coordinates)=each($points)){

// Create new line object
$my_line = ms_newLineObj();

// Loop through each point coordinate for this snum
while (list($num,$coordinate)=each($coordinates)){

// Create new point object
$my_point = ms_newpointObj();
$my_point-setXY($coordinate['lon'],$coordinate['lat']);

// Add point to line object
$my_line-add($my_point);

} // done adding this storm's points to the line object

// Now create a new shape object
$my_shape = ms_newShapeObj(MS_SHAPE_LINE);
$my_shape-add($my_line);

// Add feature to the layer
$my_layer-addFeature($my_shape);

} // end creating and adding points to line objects and line objects to
the layer.

// Draw map.
$map-draw();

// Make a new point object that will be our reference point.
$my_ref_point = ms_newpointObj();
$my_ref_point-setXY(-78.7,35.4);  // user-entered coordinates of where we
are querying from.

// Run a point query on the line object layer.
if (@$my_layer-queryByPoint($my_point,MS_MULTIPLE,-1)==MS_SUCCESS){

// Loop through results.
$num_results = $my_layer-getNumResults();
echo # results = $num_results\n\n;

// Loop through each result
for ($num=0; $num$num_results; $num++){
echo result # $num:\n;

// Get this result
$my_result = $my_layer-getResult($num);

//$my_shape =
$my_layer-getShape($my_result-tileindex,$my_result-shapeindex);
 // Get the shape
echo shapeindex = .$my_result-shapeindex.\n;
$my_shape = $my_layer-getFeature($my_result-shapeindex);
 // Get the feature
echo distanceToShape =
.$my_ref_point-distanceToShape($my_shape).\n\n; //
calculate distance from ref point to feature

}
}



On Mon, July 27, 2009 11:54 pm, Steve Lime wrote:
 There are lots of samples that show you how to loop through a set of
 search
 results. There's a getNumResults() method for layer objects and then a
 getResult()
 method to retrieve each one individually.

 Steve

 Mark Brooks mark_bro...@ncsu.edu 07/27/09 9:50 AM 
 Steve,

 This is a huge help.  The only thing I had not figured out was the
 'toleranceunits' and 'tolerance' fields.  I appreciate your help!

 I intend to add many, possible hundreds, lines to a layer.  Then query
 it with a given reference point.  How do I get the number of results and
 then loop through each one?

 Best Regards,
 Mark


 Steve Lime wrote:
 How do I query a layer with one or more line features to find all
 features with X miles of a given point?

 Your line layer should like so:

   LAYER
 NAME 'lines'
 TYPE LINE
 ...other junk...
 TEMPLATE 'dummy' # to be queryable
 TOLERANCEUNITS MILES
 TOLERANCE X
   END

 Then in mapscript you'd do a

   $my_layer-queryByPoint($my_point, MS_MULTIPLE, -1);

 The buffer parameter is used to override a layer tolerance so setting to
 -1 tells
 the method to ignore it.  If you do use it then it's given in the units
 of the layer
 being searched (before any projection).

 Does that help?

 Steve

 Mark Brooks mark_bro...@ncsu.edu 07/24/09 3:26 PM 
 I'm trying to create several new line objects and then find the lines
 that are within x miles of a given point.  (i.e., how far away a given
 point is from the track of a hurricane or the path of a ship).  I'm
 having some difficulties and I hope someone can help.

 How do I query a layer with one or more line features to find all
 features with X miles of a given point?

 Here is how I'm approaching the problem in PHP:

 // Test array of points.  This is used to make a line.
 $points[0]['lat'] = 35.5;
 $points[0]['lon'] = -78.8;
 $points[1]['lat'] = 36.5;
 $points[1]['lon'] = -79.8;
 $points[2]['lat'] = 37.5;
 $points[2]['lon'] = -80.1;

 // make new map object.
 $map = ms_newMapObj('mapdata/mymap.map');

 // Create new line
 $my_line = 

Re: [mapserver-users] distance between line and a given point usingmapscript

2009-07-27 Thread Steve Lime
There are lots of samples that show you how to loop through a set of search
results. There's a getNumResults() method for layer objects and then a 
getResult()
method to retrieve each one individually.

Steve

 Mark Brooks mark_bro...@ncsu.edu 07/27/09 9:50 AM 
Steve,

This is a huge help.  The only thing I had not figured out was the 
'toleranceunits' and 'tolerance' fields.  I appreciate your help!

I intend to add many, possible hundreds, lines to a layer.  Then query 
it with a given reference point.  How do I get the number of results and 
then loop through each one?

Best Regards,
Mark


Steve Lime wrote:
 How do I query a layer with one or more line features to find all
 features with X miles of a given point?
 
 Your line layer should like so:
 
   LAYER
 NAME 'lines'
 TYPE LINE
 ...other junk...
 TEMPLATE 'dummy' # to be queryable
 TOLERANCEUNITS MILES
 TOLERANCE X
   END
 
 Then in mapscript you'd do a 
 
   $my_layer-queryByPoint($my_point, MS_MULTIPLE, -1);
 
 The buffer parameter is used to override a layer tolerance so setting to -1 
 tells
 the method to ignore it.  If you do use it then it's given in the units of 
 the layer
 being searched (before any projection).
 
 Does that help?
 
 Steve
 
 Mark Brooks mark_bro...@ncsu.edu 07/24/09 3:26 PM 
 I'm trying to create several new line objects and then find the lines
 that are within x miles of a given point.  (i.e., how far away a given
 point is from the track of a hurricane or the path of a ship).  I'm
 having some difficulties and I hope someone can help.
 
 How do I query a layer with one or more line features to find all 
 features with X miles of a given point?
 
 Here is how I'm approaching the problem in PHP:
 
 // Test array of points.  This is used to make a line.
 $points[0]['lat'] = 35.5;
 $points[0]['lon'] = -78.8;
 $points[1]['lat'] = 36.5;
 $points[1]['lon'] = -79.8;
 $points[2]['lat'] = 37.5;
 $points[2]['lon'] = -80.1;
 
 // make new map object.
 $map = ms_newMapObj('mapdata/mymap.map');
 
 // Create new line
 $my_line = ms_newLineObj();
 
 // Loop through points, and add to the line
 while (list(,$coordinate)=each($points)){
 
  // Create new point object
  $my_point = ms_newpointObj();
  $my_point-setXY($coordinate['lon'],$coordinate['lat']);
 
  // Add point to line object
  $my_line-add($my_point);
 }
 
 // Now create a new shape
 $my_shape = ms_newShapeObj(MS_SHAPE_LINE);
 $my_shape-add($my_line);
 
 // create new layer
 $my_layer = ms_newLayerObj($map);
 
 // set some fields for this new layer
 //$my_layer-set(units,miles);  // does not seem to work as expected
 
 // Create new class and add TEMPLATE.  This is required for queries on 
 the layer to work?
 $my_class = ms_newClassObj($my_layer);
 $my_class-set(template,'/home/www/html/query_template.html');
 
 // Add feature to the layer
 $my_layer-addFeature($my_shape);
 
 // Draw map. Query doesn't work if I don't do this now.
 $map-draw();
 
 // Make a new point object that will be our ref point
 // to check how far away the line is from this point.
 $my_point = ms_newpointObj();
 $my_point-setXY(-82,36); // lon, lat
 
 // Run a point query on the line object layer; layer must have a class 
 with a LAYER TEMPLATE value
 // The third argument is the buffer tolerance.  Default unit is pixels? 
   Must figure out how to make miles or km.
 if ($my_layer-queryByPoint($my_point,MS_SINGLE,1)==MS_SUCCESS){
 
  $my_result = $my_layer-getResult(0);  // Get the result
  $my_layer = 
 $my_layer-getShape($my_result-tileindex,$my_result-shapeindex);  // 
 Get the shape
 
 }
 ___
 mapserver-users mailing list
 mapserver-users@lists.osgeo.org
 http://lists.osgeo.org/mailman/listinfo/mapserver-users
 


-- 

Mark Brooks
State Climate Office of North Carolina
Box 7236, NC State University
Raleigh, NC 27695-7236

Phone:  919.515.1446
Fax:  919.515.1441

___
mapserver-users mailing list
mapserver-users@lists.osgeo.org
http://lists.osgeo.org/mailman/listinfo/mapserver-users


Re: [mapserver-users] distance between line and a given point usingmapscript

2009-07-25 Thread Steve Lime
Oh, wanted to also note that there are some distance methods associated
with points in mapscript so that you could avoid the query methods altogether.

They are (for a point):
  - distanceToSegment(a, b); # where a and b are pointObj's
  - distanceToShape(a); # where a is a shapeObj

These are planar distances, no great circle computations.

Steve

 Mark Brooks mark_bro...@ncsu.edu 07/24/09 3:26 PM 
I'm trying to create several new line objects and then find the lines
that are within x miles of a given point.  (i.e., how far away a given
point is from the track of a hurricane or the path of a ship).  I'm
having some difficulties and I hope someone can help.

How do I query a layer with one or more line features to find all 
features with X miles of a given point?

Here is how I'm approaching the problem in PHP:

// Test array of points.  This is used to make a line.
$points[0]['lat'] = 35.5;
$points[0]['lon'] = -78.8;
$points[1]['lat'] = 36.5;
$points[1]['lon'] = -79.8;
$points[2]['lat'] = 37.5;
$points[2]['lon'] = -80.1;

// make new map object.
$map = ms_newMapObj('mapdata/mymap.map');

// Create new line
$my_line = ms_newLineObj();

// Loop through points, and add to the line
while (list(,$coordinate)=each($points)){

 // Create new point object
 $my_point = ms_newpointObj();
 $my_point-setXY($coordinate['lon'],$coordinate['lat']);

 // Add point to line object
 $my_line-add($my_point);
}

// Now create a new shape
$my_shape = ms_newShapeObj(MS_SHAPE_LINE);
$my_shape-add($my_line);

// create new layer
$my_layer = ms_newLayerObj($map);

// set some fields for this new layer
//$my_layer-set(units,miles);  // does not seem to work as expected

// Create new class and add TEMPLATE.  This is required for queries on 
the layer to work?
$my_class = ms_newClassObj($my_layer);
$my_class-set(template,'/home/www/html/query_template.html');

// Add feature to the layer
$my_layer-addFeature($my_shape);

// Draw map. Query doesn't work if I don't do this now.
$map-draw();

// Make a new point object that will be our ref point
// to check how far away the line is from this point.
$my_point = ms_newpointObj();
$my_point-setXY(-82,36); // lon, lat

// Run a point query on the line object layer; layer must have a class 
with a LAYER TEMPLATE value
// The third argument is the buffer tolerance.  Default unit is pixels? 
  Must figure out how to make miles or km.
if ($my_layer-queryByPoint($my_point,MS_SINGLE,1)==MS_SUCCESS){

 $my_result = $my_layer-getResult(0);  // Get the result
 $my_layer = 
$my_layer-getShape($my_result-tileindex,$my_result-shapeindex);  // 
Get the shape

}
___
mapserver-users mailing list
mapserver-users@lists.osgeo.org
http://lists.osgeo.org/mailman/listinfo/mapserver-users

___
mapserver-users mailing list
mapserver-users@lists.osgeo.org
http://lists.osgeo.org/mailman/listinfo/mapserver-users