Wenn ich unterwegs bin, zeichne ich meistens meinen GPS-Track auf um dann später in Fotos den Aufnahmeort automatisch einfügen zu können. Zusätzlich wäre es ganz praktisch eine Möglichkeit zu haben sein Handy zu orten wenn man es mal verloren hat. Für beides gibt es diverse Tools, die aber alle mehr oder weniger stark ihre Daten an den Betreiber weitergeben. Insbesondere bei Google will ich nicht wissen was die mit solchen Infos anstellen... Aus dem Grund: Eigenbau! Und erfreulicherweise muss man da nicht bei 0 anfangen...

Vom Smartphone in die Datenbank

Fürs Smartphone gibt es da schon eine App: GPSLog@Home zum Beispiel. Das übergibt die Lokalisierungdaten an ein beliebigen Server, Vorraussetzung ist ein einfaches PHP-Skript das die Daten entgegen nimmt und in eine SQL-Datenbank schaufelt:

<?php
$con=mysql_connect('<IP>, '<USERNAME>', '<PASSWORD>') or die(mysql_error());
mysql_select_db("<DBNAME>",$con) or die(mysql_error());
$User=$_GET['user'];
$PW=$_GET['pw'];
$Lat=$_GET['lat'];
$Lon=$_GET['lon']; 
$Alt=$_GET['alt'];
$time=$_GET['time'];
$Dir=$_GET['dir'];
$Speed=$_GET['speed'];
$sql="INSERT INTO <TABLENAME> VALUES ('$User', '$PW',  '$Lat',  '$Lon',  '$Alt',  '$time',  '$Dir',  '$Speed', NULL  )";
$result=mysql_query($sql) or die(mysql_error());
mysql_close($con);
?>

Die Werte für USERNAME usw müssen natürlich angepasst werden! Und dazu muss natürlich die entsprechende Tabelle angelegt werden:

CREATE TABLE IF NOT EXISTS `Cell` (
`User` varchar(20) DEFAULT NULL,
`Pw` varchar(20) DEFAULT NULL,
`lat` varchar(50) DEFAULT NULL,
`lon` varchar(50) DEFAULT NULL,
`alt` varchar(50) DEFAULT NULL,
`time` varchar(50) DEFAULT NULL,
`dir` varchar(50) DEFAULT NULL,
`speed` varchar(50) DEFAULT NULL,
`Addtime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`id` int(11) NOT NULL,
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 ;

Von der Datenbank ins GPX-File

Aus der Datenbank müssen die Daten nun in ein GPX-File wandern. Auch das geht mit PHP:

<?php
$servername = "<IP>";
$username = "<USER>";
$password = "<PASS>";
$dbname = "<DB>";

$conn = new mysqli($servername, $username, $password, $dbname);

if ($conn->connect_error) {
  die("Connection failed: " . $conn->connect_error);
}
$Unit=$_GET["Unit"];
$TimeArea=$_GET["Time"];
$Time="${TimeArea} Day";

$sql = "SELECT * FROM <TABLE> WHERE User='${Unit}' AND UNIX_TIMESTAMP(DATE_SUB(CURDATE(), INTERVAL ${Time})) <= time ORDER BY Addtime ASC";
$result = $conn->query($sql);

if ($result->num_rows > 0) {
  header("Content-Type: application/xml; charset=utf-8");
  printf("<?xml version=\"1.0\" encoding=\"UTF-8\" ?>");
?>

<gpx version="1.0">
<name>Android Tracker</name>
<?php
$CurrTrack=0;
$CurrTrackTime=0;

foreach ($result as $Row) {
    $EntryTime= strtotime($Row["Addtime"]);

    if ( ($EntryTime-$CurrTrackTime) >= 86400) { // 24h vergangen?
      if ($CurrTrack>0) {
        echo "</trk>";                          // Track beenden
      }
      // Und neuen anfangen
      $CurrTrack=$CurrTrack+1;
      echo "<trk>";
      echo "<name>Track ", $CurrTrack, "</name><number>",$CurrTrack,"</number>";
      $CurrTrackTime=$EntryTime;
    }
    echo "<trkpt lat=\"" . $Row["lat"]. "\" lon=\"" . $Row["lon"]. "\">";
    echo "<time>" . $Row["Addtime"]. "</time>";
    echo "<ele>" . $Row["alt"] . "</ele>";
    echo "<speed>" . $Row["speed"] . "</speed>";
    echo "<dir>". $Row["dir"] . "</dir>";
    echo "</trkpt>\n";
  }
  echo "</trk>";
  echo "</gpx>";
} else {
  echo "0 results";
}
$conn->close();
?>

Als Übergabeparameter will das Skript dabei "Unit" und "Time" haben. Unit ist der User in der Datenbank, und Time die Anzahl an Tagen die hab haben möchte.

Next Post Previous Post