尝试使用PHP while和for循环计算位置之间的距离


Trying to calculate distance between locations using PHP while and for loops

UPDATE:我能够使用Baba的代码并对其进行修改以完成我希望完成的任务,然而,现在我想将内容写入CSV文件。每次创建文件时,它都是空的。如何将数据导入CSV文件?

我正在尝试创建一个php脚本,它允许我计算位置之间的距离。例如(A到B、A到C、A到D)、(B到C、B到D)和(C到D),其中A、B、C、D是Lat和Long的对。

Lat和Long是从CSV文件中读取的,我希望最终使用php创建一个包含所有位置和彼此距离的CSV文件。到目前为止,我可以回声每一列,但无法通过距离函数传递它。如有任何帮助,我们将不胜感激。

distance.php

<?php
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;
}
}
$file = file("geocode2.csv");
$outfile = fopen('geodis.csv','w');
do {list($lat1, $lon1) = explode(",", array_shift($file));
foreach ( $file as $data ) {
    list($lat2, $lon2) = explode(",", $data);
    $line = printf("%f,%f to %f,%f = %f Miles <br>",$lat1,$lon1,$lat2,$lon2,distance($lat1, $lon1, $lat2, $lon2, "M"));
fputcsv($outfile, $line);
                        }
}
while(!feof($file));
fclose($outfile);
?>

地理编码.csv

bg_lat,bg_long
40.8394936,-73.3203704
40.8297023,-73.0942956
40.8853812,-73.1019428
40.858722,-73.20665
40.7503593,-73.1310993

(A to B, A to C, A to D),(B to C, B to D),(C to D)10,000点有很多操作,我不建议您在PHP 中这样做

尝试使用支持Geospatial的数据库,如MongoDB

这是使用的一个基本示例

(A to B, A to C, A to D)
 ^       ^       ^
 |       |       |
 A is constant for every other element in the list 

这里有一个有趣的解决方案,文件中的列表元素是A

我的log.txt是这样的

40.8394936,-73.3203704
40.8297023,-73.0942956
40.8853812,-73.1019428
40.858722,-73.20665
40.7503593,-73.1310993

因此40.8394936,-73.3203704将是A

代码

// Load Files
$file = new SplFileObject("log.txt");
// Get A ( The first Lat , Lon )
list($lat1, $lon1) = explode(",", $file->fgets());
// Loop
while (!$file->eof()) {
    // Get Other Lat , Lon )
    list($lat2, $lon2) = explode(",",  $file->fgets());
    // Get Distance and print result
    printf("%f,%f to %f,%f = %f KM 'n",
        $lat1,$lon1,
        $lat2,$lat2,
        distance($lat1, $lon1, $lat2, $lon2, "K")
    );
}

输出

40.839494,-73.320370 to 40.829702,40.829702 = 19.049914 KM 
40.839494,-73.320370 to 40.885381,40.885381 = 19.063217 KM 
40.839494,-73.320370 to 40.858722,40.858722 = 9.800795 KM 
40.839494,-73.320370 to 40.750359,40.750359 = 18.763195 KM 

距离函数

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

我不理解你的问题,据我所见,脚本会很好地工作,但不知道如何将一行与另一行进行比较,对吧?骨骼A到B

编辑:

我的答案。

<?php
ini_set('display_errors', 'On');
function distance($lat1, $lng1, $lat2, $lng2, $miles = true)
{
return round((acos(sin(deg2rad ($lat1)) * sin(deg2rad ($lat2)) + 
             cos(deg2rad ($lat1)) * cos(deg2rad ($lat2)) * 
             cos(deg2rad ($lng1) - deg2rad ($lng2))) * 6378),2);
}  
$file = fopen('geocode.csv','r');
$data0 = array();
while(($data = fgetcsv($file,0,",")) !== FALSE){
array_push($data0, $data);
}
$num = count($data0);
$data1 = $data0;
for ($x=0; $x < $num; $x++) {
for ($x2=0; $x2 < $num; $x2++) {
    echo $data0[$x][0].','.$data0[$x][1].' - ' .$data1[$x2][0]. ','.$data1[$x2][1]. '  =  '.
    distance($data0[$x][0],$data0[$x][1],$data1[$x2][0],$data1[$x2][1])."<br>";
}

 }
fclose($file);
?>