Php 需要帮助转换和计算距离吗

Php 需要帮助转换和计算距离吗,php,Php,我陷入困境,需要帮助。我有一个超过3000个纬度和经度的数据库,我正试图把它们转换成十进制的纬度和经度,这样我就可以显示两个坐标之间的距离。这两个坐标在页面的url中传递。第一个(lat1和lon1)已转换,但第二个(lat2和lon2)未转换。我的数据库中的纬度和经度是这样存储的:26°56.34308'-094°41.32328',因此我认为逗号可能应该删除。我有一些源代码,但我不知道如何正确地将它们组合在一起 ///// Get the two locations from the url

我陷入困境,需要帮助。我有一个超过3000个纬度和经度的数据库,我正试图把它们转换成十进制的纬度和经度,这样我就可以显示两个坐标之间的距离。这两个坐标在页面的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";
///从url获取这两个位置
$lat1=$_GET[lat1];
$lon1=$_GET[lon1];
//////lat2和Lon2是需要转换的
$lat2=$_GET[lat2];
$lon2=$_GET[lon2];
/////将lat2和lon2转换为十进制格式
$pos1=strrpos($mystring,“”);
$pos2=strrpos($mystring,“.”);
$pos3=strrpos($mystring,“”);
//从字符串获取子字符串:substr(源、开始、长度)
$deg=substr($mystring,0,$pos1);
$min=substr($mystring,$pos1,$pos2-$pos1);
$sec=substr($mystring,$pos2,$pos3-$pos2);
函数DMStoDEC($deg、$min、$sec){
//转换DMS(度/分/秒)
//到十进制格式经度/纬度
返回$deg+($min*60)+($sec))/3600;
}
//////计算距离
功能距离($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=strotupper($unit);
如果($单位=“K”){
返回(英里*1.609344);
}否则,如果($unit==“N”){
返回($miles*0.8684);
}否则{
返回$miles;
}
}
//迈尔斯
回波距离($lat1、$lon1、$lat2、$lon2,“m”)。“英里

”; //公里 回波距离($lat1,$lon1,$lat2,$lon2,“k”)。“公里数

”; //海里 回波距离($lat1,$lon1,$lat2,$lon2,“N”)。“海里”;
数据库中有纬度和经度吗?什么样的数据库?一些数据库,如MySQL和PostgresQL,可以在一个简单的SQL查询中轻松计算两点之间的距离。为此,您必须确保数据位于空间列中,如
列。(如果
列中没有数据,可以轻松创建新的
列,并使用非点列中的数据更新新列)

然后,要计算两点之间的距离,只需执行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

?>
签出这些链接

,


您可能会在此处找到解决方案。

是否有任何特定行出现错误?您已经有一个此问题的精确副本打开。请检查此链接可能是同一用户的副本。