Shortest path using php [closed]

江枫思渺然 提交于 2019-12-08 14:26:29

问题


i have an array of coordinates in php like this:

Array ( 
    [0] => Array ( 
        [0] => 39.1057579 
        [1] => 26.5451331 
    ) 
    [1] => Array ( 
        [0] => 39.1057579 
        [1] => 26.5451331 
        [2] => 39.1055889 
        [3] => 26.5452403 
    ) 
    [2] => Array ( 
        [0] => 39.1057579 
        [1] => 26.5451331 
        [2] => 39.1055889
    )
)

I'm going to find a function with start latlng and end latlng as inputs and return an array of coordinates as the shortest path.


回答1:


As Mark Baker pointed out, you'll need to use something like Dijkstra's algorithm to traverse a weighted graph (which is what you'll have when you include distances).

Here's a simple distance function I found here:

<?php

/*::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
/*::                                                                         :*/
/*::  This routine calculates the distance between two points (given the     :*/
/*::  latitude/longitude of those points). It is being used to calculate     :*/
/*::  the distance between two locations using GeoDataSource(TM) Products    :*/
/*::                                                                         :*/
/*::  Definitions:                                                           :*/
/*::    South latitudes are negative, east longitudes are positive           :*/
/*::                                                                         :*/
/*::  Passed to function:                                                    :*/
/*::    lat1, lon1 = Latitude and Longitude of point 1 (in decimal degrees)  :*/
/*::    lat2, lon2 = Latitude and Longitude of point 2 (in decimal degrees)  :*/
/*::    unit = the unit you desire for results                               :*/
/*::           where: 'M' is statute miles                                   :*/
/*::                  'K' is kilometers (default)                            :*/
/*::                  'N' is nautical miles                                  :*/
/*::  Worldwide cities and other features databases with latitude longitude  :*/
/*::  are available at http://www.geodatasource.com                          :*/
/*::                                                                         :*/
/*::  For enquiries, please contact sales@geodatasource.com                  :*/
/*::                                                                         :*/
/*::  Official Web site: http://www.geodatasource.com                        :*/
/*::                                                                         :*/
/*::         GeoDataSource.com (C) All Rights Reserved 2013                  :*/
/*::                                                                         :*/
/*::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
function distance($lat1, $lon1, $lat2, $lon2, $unit) {

  $theta = $lon1 - $lon2;
  $dist = sin(deg2rad($lat1)) * sin(deg2rad($lat2)) +  cos(deg2rad($lat1)) * cos(deg2rad($lat2)) * cos(deg2rad($theta));
  $dist = acos($dist);
  $dist = rad2deg($dist);
  $miles = $dist * 60 * 1.1515;
  $unit = strtoupper($unit);

  if ($unit == "K") {
    return ($miles * 1.609344);
  } else if ($unit == "N") {
      return ($miles * 0.8684);
    } else {
        return $miles;
      }
}

echo distance(32.9697, -96.80322, 29.46786, -98.53506, "M") . " Miles<br>";
echo distance(32.9697, -96.80322, 29.46786, -98.53506, "K") . " Kilometers<br>";
echo distance(32.9697, -96.80322, 29.46786, -98.53506, "N") . " Nautical Miles<br>";

?>

To find all distances between nodes, you'll need to simply loop through all your nodes. You'll come out with an array that looks something like this:

$distance[0][1] = 10;
$distance[0][2] = 12;
$distance[0][3] = 7;
...
$distance[4][3] = 14;

Where the dimensions of your array represent your node numbers, and the assigned value is the distance. You'd run this array through Dijkstra to find the shortest weighted path.

Hope this helps you. If you need further assistance you might want to try to refine your question to be more narrow. Graph traversal is a VERY broad area of study. Good luck.



来源:https://stackoverflow.com/questions/19127055/shortest-path-using-php

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!