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);
?>