我需要遍历一个包含地图中点的数组并检查它们之间的距离。我需要计算每个节点的 200m 和 50m 范围内有多少个节点。它适用于较小数量的值。但是,当我尝试通过它运行更多值(大约 4000 用于可扩展性测试)时,会出现一个错误,说我已经达到了 300 秒的最大执行时间。如果可能的话,它需要能够在 300 秒内至少处理这么多。
我已经阅读并发现有一种方法可以禁用/更改此限制,但我想知道是否有更简单的方法来执行以下代码,以便运行它所需的时间会减少。
for($i=0;$i<=count($data)-1;$i++)
{
$amount200a=0;
$amount200p=0;
$amount50a=0;
$amount50p=0;
$distance;
for($_i=0;$_i<=count($data)-1;$_i++)
{
$distance=0;
if($data[$i][0]===$data[$_i][0])
{
}
else
{
//echo "Comparing ".$data[$i][0]." and ".$data[$_i][0]." ";
$lat_a = $data[$i][1] * PI()/180;
$lat_b = $data[$_i][1] * PI()/180;
$long_a = $data[$i][2] * PI()/180;
$long_b = $data[$_i][2] * PI()/180;
$distance =
acos(
sin($lat_a ) * sin($lat_b) +
cos($lat_a) * cos($lat_b) * cos($long_b - $long_a)
) * 6371;
$distance*=1000;
if ($distance<=50)
{
$amount50a++;
$amount200a++;
}
else if ($distance<=200)
{
$amount200a++;
}
}
}
$amount200p=100*number_format($amount200a/count($data),2,'.','');
$amount50p=100*number_format($amount50a/count($data),2,'.','');
/*
$dist[$i][0]=$data[$i][0];
$dist[$i][1]=$amount200a;
$dist[$i][2]=$amount200p;
$dist[$i][3]=$amount50a;
$dist[$i][4]=$amount50p;
//*/
$dist.=$data[$i][0]."&&".$amount200a."&&".$amount200p."&&".$amount50a."&&".$amount50p."%%";
}
索引 0 包含每个节点的唯一 ID,1 包含每个节点的纬度,索引 2 包含每个节点的经度。
错误发生在第一个循环内的第二个 for 循环中。此循环是将所选地图节点与其他节点进行比较的循环。我也在使用Haversine 公式。