需要帮助转换和计算距离

时间:2012-03-08 04:08:39

标签: php

我被困住了,需要一些帮助。我有一个拥有超过3000纬度和经度的数据库,我正在尝试将它们转换为十进制lat和lon,这样我就可以显示两个坐标之间的距离。两个坐标在页面的url中传递。第一个(lat1和lon1)已经被转换但第二个(lat2和lon2)不是。我的数据库中的纬度和经度存储如下:26°56.34308'-094°41.32328'所以我认为应该删除逗号。我从一些来源获得了一些代码,但我不确定如何正确地将它们组合在一起。

///// Get the two locations from the url

$lat1 = $_GET[lat1];
$lon1 = $_GET[lon1];

////// lat2 & Lon2 are the ones that need to be converted

$lat2 = $_GET[lat2];
$lon2 = $_GET[lon2];

///// Convert lat2 & lon2 into decimal format

$pos1 = strrpos($mystring, "°");
$pos2 = strrpos($mystring, ".");
$pos3 = strrpos($mystring, "'");
// Get subsring from a string: substr(source, start, length)
$deg = substr($mystring, 0, $pos1);
$min = substr($mystring, $pos1, $pos2 - $pos1);
$sec = substr($mystring, $pos2, $pos3 - $pos2);

function DMStoDEC($deg,$min,$sec) {
// Converts DMS ( Degrees / minutes / seconds )
// to decimal format longitude / latitude
    return $deg+((($min*60)+($sec))/3600);
}

//////calculate the distance

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;
    }
}

// Miles
echo distance($lat1, $lon1, $lat2, $lon2, "m") . " miles<br><br>";

//Kilometers
echo distance($lat1, $lon1, $lat2, $lon2, "k") . " kilometers<br><br>";

//Nautical miles
echo distance($lat1, $lon1, $lat2, $lon2, "N") . " Nautical miles";

2 个答案:

答案 0 :(得分:0)

数据库中有纬度和经度吗?什么样的数据库? MySQL和PostgresQL等一些数据库可以轻松计算简单SQL查询中2点之间的距离。为此,您必须确保数据位于point列之类的空间列中。 (如果您在point列中没有数据,则可以轻松创建新的point列并使用非点列中的数据更新新列。

然后,要计算2点之间的距离,只需执行SQL查询。

<?php

$dbh = mysql_connect($host, $username, $password);
mysql_select_db($dbname);

// Get distance between 2 points manually
$query = "select GLength(GeomFromText('LineString({$lat1} {$lon1},{$lat2} {$lon2})'))";
$dbr = mysql_query($query);
list($length) = mysql_fetch_array($dbr);
// Now, $length has the distance between lat1, lon1 and lat2, lon2

// To put points into a table use this query
// Assuming that your table has 2 columns point1 and point2
$query = "insert into mytable (point1, point2) values( geomfromtext('point({$lat1} {$lon1})'), geomfromtext('point({$lat2} {$lon2})') )";
mysql_query($query);

// Get distance between 2 points that are stored in point columns
// Assuming the table has 2 point columns point1 and point2
$query = "select GLength(GeomFromText(concat('LineString(', x(point1), ' ', y(point1), ',', x(point2), ' ', y(point2), ')'))) from mytable";
$dbr = mysql_query($query);
list($length) = mysql_fetch_array($dbr);
// Now $length has the distance between point1 and point2

?>

然后,您可以从那里进行任何距离转换。 (另外,在查询中使用变量时要小心,不要像我上面用$lat1$lon1等那样检查它们。确保并检查它们以确保它们只包含数字来自用户输入的值)

答案 1 :(得分:0)