Попытка вычислить из файла .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++;
}
Немного странно, что вы извлекаете данные элемента в отдельном цикле из позиций. Хотелось бы также увидеть этот код, если у вас неверные данные о высоте, это может вызвать эту проблему. – bazzargh
@bazzargh: Я добавил соответствующий код. – zuluk