Autor Zpráva
mackopu
Profil
Používám následující fci pro parsování obsahu GPX souboru:
<?php
function distance($lat1, $lng1, $lat2, $lng2, $miles = true)
{
    $pi80 = M_PI / 180;
    $lat1 *= $pi80;
    $lng1 *= $pi80;
    $lat2 *= $pi80;
    $lng2 *= $pi80;
 
    $r = 6372.797; // mean radius of Earth in km
    $dlat = $lat2 - $lat1;
    $dlng = $lng2 - $lng1;
    $a = sin($dlat / 2) * sin($dlat / 2) + cos($lat1) * cos($lat2) * sin($dlng / 2) * sin($dlng / 2);
    $c = 2 * atan2(sqrt($a), sqrt(1 - $a));
    $km = $r * $c;
 
    return ($miles ? ($km * 0.621371192) : $km);
}

$xml = new simplexmlelement('<?xml version="1.0" encoding="UTF-8"?>
<gpx version="1.0" creator="mackopu http://www.ambike.com" xmlns="http://www.topografix.com/GPX/1/0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.topografix.com/GPX/1/0 http://www.topografix.com/GPX/1/0/gpx.xsd">
  <trk>
    <trkseg>
      <trkpt lat="50.229394" lon="12.871549">
        <ele>386</ele>
      </trkpt>
      <trkpt lat="50.229475" lon="12.871034">
        <ele>386</ele>
      </trkpt>
      <trkpt lat="50.229231" lon="12.869741">
        <ele>387</ele>
      </trkpt>
      <trkpt lat="50.229167" lon="12.869445">
        <ele>388</ele>
      </trkpt>
      <trkpt lat="50.228957" lon="12.869304">
        <ele>389</ele>
      </trkpt>
    </trkseg>
  </trk>
</gpx>');
foreach ($xml->trk->trkseg->trkpt as $uzel) {
  $eles[] = $uzel->ele;
  $lats[] = $uzel['lat'];
  $lons[] = $uzel['lon'];
}

for($i=0; $i<count($lats); $i++) {
  if($i==0) {
    $distances[] = 0;
  } else {
    $distances[] = distance($lats[$i-1], $lons[$i-1], $lats[$i], $lons[$i], false);
  }
}

$total_distances = 0;
for($i=0; $i<count($distances); $i++) {
  $total_distances += $distances[$i];
  echo $distances[$i]."; ".$total_distances."; ".$eles[$i]."<br>";
}
?>
Poslední cyklus for() mi ale vypisuje řádky, kde $distances[$i] a (pochopitelně pak i $total_distances) jsou rovny 0.
Pokud ale zadám natvrdo:
$distances[] = distance(50.229394, 12.871549, 50.229475, 12.871034, false);
$distances[] = distance(50.229475, 12.871034, 50.229231, 12.869741, false);
$distances[] = distance(50.229231, 12.869741, 50.229167, 12.869445, false);
$distances[] = distance(50.229167, 12.869445, 50.228957, 12.869304, false);
$distances[] = distance(50.228957, 12.869304, 50.228296, 12.864153, false);
pak je vše v pořádku. Mořím se s tím už dva dny, kde dělám chybu?
nightfish_
Profil *
  $lats[] = (float)$uzel['lat'];
  $lons[] = (float)$uzel['lon'];
mackopu
Profil
Neuvěřitelné!
Tohle vůbec neznám!
Zkoušel jsem to s intval(), ale nezabralo to...

Už to fachčí :-)

Díky moc!
Alphard
Profil
mackopu:
Zkoušel jsem to s intval()
A so myslíte, že dělá? Parsuje na integer, což je u gps dost nepřesné. Podobně existuje floatval(), jen vybrat tu správnou funkci.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: