Re: [mapserver-users] distance between line and a given point usingmapscript
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
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
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