在php中查找最近的数据点和阳光数据

时间:2011-10-03 16:13:29

标签: php file

我遇到了一个大问题。问题在于

1)我有一个.dat文件(用于存储数据的dat文件)。它是一个25 MB的文件,其中包含 超过200K行的纬度和经度。这样一行的例子是

-59.083 -26.583 9.4 5.2 3.3 4.3 8.1 6.6 5.3 8.4 8.3 10.0 9.1 5.1

它的统计数据形成了1月份的纬度,经度,日照数据(小时),法布里......以及等等。

我有超过200K行,如上所述。

我的任务是计算纬度和经度的日照时数。假设我的纬度= 3.86082,经度= 100.50509;那我的任务就是在这个纬度和经度上找到每月的平均日照时数。但是第二个问题是,我不会将给定纬度和经度的精确匹配与我在文件中的精确匹配。首先,我必须找到最近的点,然后我必须计算日照时数。

我使用以下代码计算最近的点。但是由于文件中的大量数据需要花费大量时间

$file_name='grid_10min_sunp.dat';

$handle = fopen($file_name, "r");

$lat1=13.86082;
$lan1=100.50509;

$lat_lon_sunshines = make_sunshine_dict($file_name);

$closest = 500;
for($c=0;$c<count($lat_lon_sunshines);$c++)
{

$lat2=$lat_lon_sunshines[$c]['lat'];
$lan2=$lat_lon_sunshines[$c]['lan'];
$sunshines=$lat_lon_sunshines[$c]['sunshine'];

$lat_diff = abs(round((float)($lat1), 4)-$lat2);

if ($lat_diff < $closest)
{
    $diff = $lat_diff +  abs(round((float)($lan1), 4)-$lan2); 

     if($diff < $closest)
     {
              $closest = $diff;
            $sunshinesfinal=$sunshines;
     }      
}
$sunshines='';

}
print_r($sunshinesfinal);die;

函数make_sunshine_dict($ file_name)也会遍历文件的每一行并准备一个数组,如下所示

$sunshines_dict = array();      

  $f = file_get_contents($file_name);

  $handle = fopen($file_name, "r");

  while($buffer = fgets($handle))
  {

   $tok = strtok($buffer, " \n\t");

   $lat=$tok;

   $latArray[]=$tok;

   $tok = strtok(" \n\t");

   $months = '';

   $months = array();

   for ($k = 0; $tok !== false; $k+=1) 
   {

   if($k==0)
   {
   $lan=$tok;
   $lanArray[]=$tok;
   }

   if($k!=0)
   {
        $months[] = $tok ;
         "month $k : ".$months[$k]."<br>";

   }

    $tok = strtok(" \n\t");
    }

    $data[$kkk]['lat']=$lat;
    $data[$kkk]['lan']=$lan;

    foreach($months as $m=>$sunshine)
    {


         $sunshines=array();
          $sumD = 0;

          $iteration= 31;

          for($n=1;$n<=$iteration;$n++)
          {
              $J = ($m+1)*$n; 



             $P = asin(.39795*cos(.2163108 + 2*atan(.9671396*tan(.00860*($J-186)))));



          $value=(sin(0.8333*pi/180) + sin($lat*pi/180)*sin($P))/(cos($lat*pi/180)*cos($P));

            /* $value ? ($value > 1 and 1) : $value;

             $value ? ($value < -1 and -1): $value;*/


          $D = 24 - ((24/pi) * acos($value));



           $sumD = $sumD + $D;

             }

                $sunshinesdata=(($sumD/30)*(float)($sunshine)*.01);

           $data[$kkk]['sunshine'][$m]=$sunshinesdata; 

          $sunshines='';
    }

    }
return $data;

请帮助,如果您需要更多信息,请告诉我

请注意我不能在这里使用默认的php函数来获取阳光信息beacsue我也考虑了云层覆盖和其他因素

2 个答案:

答案 0 :(得分:0)

很多代码看起来都不对(只是计算出日照时数)。虽然,我承认,我在make_sunshine_dict函数中失去了你在做什么。

在帮助您加快速度方面,您正在阅读两次文件:

 $f = file_get_contents($file_name);
 $handle = fopen($file_name, "r"); 

此外,您可以将Lat / Long坐标映射到网格中。换句话说,制作二维阵列,其中每行和每列分别代表1度纬度和1度经度。在读入文件时,将条目转储到网格中正确的lat / long存储桶中。当您需要找到最接近给定纬度/经度的位置时,您只需要将该位置与其桶中的点进行比较。

答案 1 :(得分:-1)

在Cron作业中每隔x个时间间隔将.dat加载到SQL数据库中,然后像往常一样查询数据库。