2014-02-04 5 views
0

Попытка вычислить из файла .gpx расстояние между точками gps. Я пробовал две разные формулы. Это один должен быть более точным: DIST = 6378.388 * экоса (Sin (LAT1) * sin (LAT2) + соз (LAT1) * соз (LAT2) * соз (lon2 - lon1))Расчет расстояния между точками gps

Это один должен также работают на короткие расстояния: distance = sqrt (dx * dx + dy * dy)

Расстояние между каждой точкой макс. 100 м. Я вычислил расстояние с моей программой и получил 26,8 км. Затем я импортировал файл .gpx в goole earth, и у меня есть расстояние 21 км. Я не знаю, почему эти ценности сильно различаются. Может быть, ты поможешь мне.

Здесь приходит код (только соответствующие фрагменты), чтобы вычислить расстояние от файла GPX:

... 
$xml = file_get_contents($file); 
$doc = new DOMDocument(); 
$doc->loadXML($xml); 
$track = array(); 

/* get the elevation for each gps point */ 
... 

/* get the time for each gps point */ 
... 

/* get the position for each gps point*/         
$trkpts = $doc->getElementsByTagName('trkpt'); 
$i=0; 
foreach ($trkpts as $trkpt) { 
    $track[$i]['position'] = array(); 
    $track[$i]['position']['lon'] = $trkpt->getAttribute('lat'); 
    $track[$i]['position']['lat'] = $trkpt->getAttribute('lon'); 
    $i++; 
} 

/* calculate the distance for each gps point */ 
ini_set('precision', '50'); 
for($i2=0;$i2<($i);$i2++){ 
    if($i2==0){ 
     $track[$i2]['distance'] = 0; 
     /* get first point */ 
     $lastlat = deg2rad($track[$i2]['position']['lat']); 
     $lastlon = deg2rad($track[$i2]['position']['lon']); 
     $lastele = $track[$i2]['ele']; 
    } 
    else{ 

     $aktlat = deg2rad($track[$i2]['position']['lat']); 
     $aktlon = deg2rad($track[$i2]['position']['lon']); 
     $aktele = $track[$i2]['ele']; 

     /* if coordinates differ calculate distance */     
     if(($aktlat-$lastlat)!=0 || ($aktlon-$lastlon)!=0){ 
      $track[$i2]['distance'] = acos(sin($lastlat)*sin($aktlat)+cos($lastlat)*cos($aktlat)*cos($aktlon-$lastlon)); 

      $track[$i2]['distance'] = $track[$i2]['distance'] * 6378137; 

      /* calculate the elevation difference */ 
      $track[$i2]['distance'] = sqrt(pow($track[$i2]['distance'],2)+pow(($aktele-$lastele),2)); 

     } 
     else{ 
      $track[$i2]['distance'] = 0; 
     } 
     /* save act point as last point */ 
     $lastlat     = deg2rad($aktlat); 
     $lastlon     = deg2rad($aktlon); 
     $lastele    = $aktele; 
    } 
} 

Вот файл GPX для всех, кто хочет проверить: http://mein-sporttagebuch.de/userfiles/tempfiles/runtastic_20130825_1054_Radfahren.gpx

Спасибо за любой советы.

EDIT Здесь приходит код для получения высоты (от высоты я вычисляю еще ряд мер, как высшей и самой глубокой точке):

$eles = $doc->getElementsByTagName('ele'); 
$i=0; 
$minheight = 0; 
$maxheight = 0; 
$asc  = 0; 
$desc  = 0; 
$lastheight = 0; 
foreach ($eles as $ele) { 
    if($i>0){ 
     if($lastheight<$ele->nodeValue){ 
     $asc += $ele->nodeValue-$lastheight; 
     } 
     else{ 
     $desc += $lastheight-$ele->nodeValue; 
     } 
    } 
    $track[$i] = array(); 
    $track[$i]['ele'] = $ele->nodeValue; 
    if($minheight>$ele->nodeValue || $i==0){ 
     $minheight = $ele->nodeValue; 
    } 
    if($maxheight<$ele->nodeValue){ 
     $maxheight = $ele->nodeValue; 
    } 

    $lastheight = $ele->nodeValue; 
    $i++; 
} 
+0

Немного странно, что вы извлекаете данные элемента в отдельном цикле из позиций. Хотелось бы также увидеть этот код, если у вас неверные данные о высоте, это может вызвать эту проблему. – bazzargh

+0

@bazzargh: Я добавил соответствующий код. – zuluk

ответ

1

В конце цикла есть ошибка в коде.

/* save act point as last point */ 
    $lastlat     = deg2rad($aktlat); 
    $lastlon     = deg2rad($aktlon); 

Но aktlat/долгота были определены как:

$aktlat = deg2rad($track[$i2]['position']['lat']); 
    $aktlon = deg2rad($track[$i2]['position']['lon']); 

... вы сделали преобразование deg2rad дважды. Это должно быть:

/* save act point as last point */ 
    $lastlat     = $aktlat; 
    $lastlon     = $aktlon; 

Не уверен, что это именно то, что вызывает вашу ошибку, но это не может помочь! Вы также используете другой радиус для земли в своем коде из формулы вверху, но это совсем мало.

+0

Ошибка в чтении lat и lon из gpx-файла в трек ['position']. Спасибо за вашу помощь! Beacuse Я нашел это, проверив с помощью excel. – zuluk

0

Как я вижу, вы берете возвышений в своих расчетах. Вероятно, карты Google не учитывают высоты в их формуле. Вы пытались рассчитать расстояние для «плоской» площади?

+0

Я пробовал это, получил 21,4 км без возвышения и 21,6 км с. Это не так. Я делаю вычисления в электронной таблице, не используя его оригинальную программу. – bazzargh

+0

@bazzargh: вы правы. Значения отличаются на 200 м. – zuluk

Смежные вопросы