" ins GPX-File, Bugfix Leerzeichen vor Lon
//-------------------------------------------------
$verinfo = 'Benutzerwegepunkte von Hikr.org holen, Version 0.4, 2019-08-23';
//-------------------------------------------------
// Benutzereinstellungen
// Hier muss der Benutzername aus dem HTTP Pfad rein kopiert werden
// http://www.hikr.org/user/Ekkehard/piz/
// ^------^
// Bei mir ist das "Ekkehard"
// Weiterhin kann der Ausgabename und Pfad angepasst werden
//-------------------------------------------------
// User settings
// You must change the variable Username according to the HTTP path of your User page
// You may change the name and path of the output file
//-------------------------------------------------
//$username = 'Ekkehard';
$username = 'Ekkehard';
$gpxfilename = 'waypoints.gpx';
//-------------------------------------------------
// Benutzung
// 1.) Benutzernamen und ggf Namen der Zieldatei anpassen
// 2.) Diese Datei speichern, zb unter c:\hikrorgtools\waypoints.php
// 3.) Das Script benötigt den PHP Interpreter, dieser kann hier kostenfrei geladen werden
// https://www.php.net/downloads.php
//
// 4.) Nach der Installation muss eine Konsole geöffnet werden
// Bei Windows auf "Start" klicken, dann "cmd" eingeben und die Konsole auswählen und ausführen
// 5.) Anschließend muss in das Verzeichnis gewechselt werden, in dem diese Datei gespeichert wurde
// dies geht mit dem Befehl "cd", zb
// cd \hikrorgtools
// 6.) PHP ausführen und den Dateinamen dieser Datei angeben. Normalerweise ist PHP im Suchpfad
// Falls PHP nicht gefunden wird muss das Ausführbare Programm gesucht und mit dem vollen Pfad
// angegeben werden.
// Es sollte aber wie folgt funktionieren
// php waypoints.php
//-------------------------------------------------
// Usage
// 1.) Change username and if wanted target filename
// 2.) Save this file to the hdd, e.g. c:\hikrorgtools\waypoints.php
// 3.) The script needs an PHP interpreter installed on the system. PHP could be downloaded free here
// https://www.php.net/downloads.php
//
// 4.) After the PHP beiing installed open a console
// On windows click to "Start" end enter "cmd" with keyboard, select console from the list
// 5.) In the console switch to the correct folder where this file has been saved
// The "cd" command does the job, e.g.
// cd \hikrorgtools
// 6.) Execute PHP while passing the name of this file as a parameter. Generally PHP is included in the search path.
// If PHP is not found, you have to locate the executable and use the full path instead
// Usually it work like this
// php waypoints.php
//-------------------------------------------------
// Globale Variablen
//-------------------------------------------------
$tourlist = array();
$waypointlist = array();
$waypointinfo = array();
//-------------------------------------------------
// ProcessMainTableRow
// Bearbeitet eine Zeile in der Haupttabelle
// Extrahiert einen Link auf eine Tourenseite
// Trägt den Link in das globale Array ein und gibt 1 bei Erfolg zurück
// sonst 0
//-------------------------------------------------
function ProcessMainTableRow($ARow) {
global $tourlist;
$cnt = 0;
// echo $ARow;
$startdata = 0;
do {
$startdata = strpos($ARow,'
';
$enddata = strpos($ARow,$endmarker,$startdata);
if ($enddata === false) {
break;
}
$enddata = $enddata + strlen($endmarker);
$cnt++;
$startdata = $enddata;
} while(1);
if ($cnt < 5) return 0; // Anzahl der Spalten zu klein
// Link für Tour finden
$startdata = strpos($ARow,' | ';
$enddata = strpos($ARow,$endmarker,$startdata);
$enddata = $enddata + strlen($endmarker);
$data = substr($ARow,$startdata,$enddata-$startdata);
//echo "Data: ".$data."\r\n\r\n";
// Link extrahieren
$starta = strpos($data,'';
$enda = strpos($data,$endmarker,$starta);
if ($enda === false) {
return 0;
}
$enda = $enda + strlen($endmarker);
$a = substr($data,$starta,$enda-$starta);
// echo $a."\r\n\r\n";
$marker = 'href="';
$startlink = strpos($a,$marker);
if ($startlink === false) {
return 0;
}
$startlink = $startlink+strlen($marker);
$endlink = strpos($a,'"',$startlink);
if ($endlink === false) {
return 0;
}
$link = substr($a,$startlink,$endlink-$startlink);
//echo $link."\r\n";
// Link an die globale Tourenliste anhängen
//array_push($tourlist,$link);
$tourlist[] = $link;
return 1;
}
//-------------------------------------------------
// ProcessMainTable
// Bearbeitet die Haupttabelle
// Lokalalisiert einzelne Zeilen und gibt diese zur Bearbeitung weiter
// Gibt die Anzahl der gefundenen Zeilen zurück
// Weniger als 51 Zeilen bedeutet, dass es keine weiteren Seiten mit Waypoints gib
//-------------------------------------------------
function ProcessMainTable($AMainTable) {
$cnt = 0;
// echo $AMainTable;
$startrow = 0;
do {
$startrow = strpos($AMainTable,'';
$endrow = strpos($AMainTable,$endmarker,$startrow);
if ($endrow === false) {
return $cnt;
}
$endrow = $endrow + strlen($endmarker);
$row = substr($AMainTable,$startrow,$endrow-$startrow);
//echo "Zeile: $cnt ".$row."\r\n\r\n";
if ($cnt > 0) { // Die Header Zeile überspringen
ProcessMainTableRow($row);
}
$cnt++;
$startrow = $endrow;
} while(1);
return $cnt;
}
//--------------------------------------------------------
// ProcessMainFile
// bearbeitet eine Hauptseite, extrahiert die Tabelle und gibt sie zur bearbeitung
// Die Rückgabe ist 1 wenn es (vermutlich) eine weitere Seite mit Waypoints gibt
// 0 wenn es keine weiteren gibt
//--------------------------------------------------------
function ProcessMainFile($AMainFile) {
// echo $AMainFile;
// den Marker für den Anfang der Tabelle suchen
$marker = '';
// Suchen ob vorhanden
$starttablendx = strpos($AMainFile,$marker);
if ($starttablendx === false) { // Prüfen ob gefunden
return 0; //Nein, dann fertig
}
// echo 'Waypoint table at: '.$starttablendx."\r\n";
$marker = ' ';
// Suchen ob vorhanden
$endtablendx = strpos($AMainFile,$marker,$starttablendx);
if ($endtablendx === false) { // Prüfen ob gefunden
return 0; //Nein, dann fertig
}
$endtablendx = $endtablendx+strlen($marker);
// echo 'Waypoint table end at: '.$endtablendx."\r\n";
$table = substr($AMainFile,$starttablendx,$endtablendx-$starttablendx);
$cnt = ProcessMainTable($table);
// echo $cnt;
if ($cnt <= 2) return 0; //Keine Inhalte in der Tabelle, fertig
return 1; // War was drin
}
//--------------------------------------------------------
// ProcessWayPointList
// Bearbeitet eine Wegpunkteliste, wie sie sich in der Turenseite befindet
//--------------------------------------------------------
function ProcessWayPointList($AWayPointList) {
global $waypointlist;
//echo $AWayPointList;
$marker = 'href=\'';
$startlink = 0;
while(1) {
$startlink = strpos($AWayPointList,$marker, $startlink);
if ($startlink === false) {
return 0;
}
$startlink = $startlink+strlen($marker);
$endlink = strpos($AWayPointList,'\'',$startlink);
if ($endlink === false) {
return 0;
}
$link = substr($AWayPointList,$startlink,$endlink-$startlink);
//echo $link."\r\n";
// Link an die globale WayPoint anhängen
$waypointlist[] = $link;
// Index weiter rücken
$startlink = $endlink;
};
return 0;
}
//--------------------------------------------------------
// ProcessTour
// Bearbeitet eine einzelne Tour, lädt die Seite und zieht den Block mit den Wegepunkiten raus
//--------------------------------------------------------
function ProcessTour($ATourLink) {
// echo $ATourLink."\r\n";
echo 'Lade Tourenseite: '.$ATourLink."\r\n";
$tourpage = file_get_contents($ATourLink);
//echo $tourpage;
// Den Anfang der Liste funden
$marker = ' Wegpunkte:';
$startndx = strpos($tourpage,$marker);
if ($startndx === false) {
return 0;
}
$startndx = $startndx+strlen($marker);
// Das Ende der Liste finden
$marker = ' | ';
$endndx = strpos($tourpage,$marker,$startndx);
if ($endndx === false) {
return 0;
}
// Den Anfang der Liste korrigieren auf
$marker = ' $endndx) {
return 0;
}
// Block rausziehen
$waypointblock = substr($tourpage,$startndx,$endndx-$startndx);
//echo $waypointblock;
ProcessWayPointList($waypointblock);
return 1;
}
//--------------------------------------------------------
// ProcessTour
// Bearbeitet einen einzelnen Wegpunkt, lädt die Seite und zieht die Informationen raus
// Praktischerweise stehen die ganz oben in einem META Tag, man muss also nicht ganz tief suchen
// Der gefundene Punkt wird in die globale Liste der Punkte eingetragen
//--------------------------------------------------------
function ProcessWayPoint($AWayPointLink) {
global $waypointinfo;
// echo $AWayPointLink."\r\n";
echo 'Lade Wegepunktseite: '.$AWayPointLink."\r\n";
$wppage = file_get_contents($AWayPointLink);
//echo $wppage;
/*
*/
$marker = ' 'Defreggerhaus 2962m'
// Dann ist die Höhe wie folgt al RegEx zu beschreiben
//ein Leerzeichen, tab oä, mindestens eine Ziffer, ein 'm' und dann das Zeilenende
$regexp = '/\s\d+m\z/';
if (preg_match($regexp,$AHikrWayPointName,$found)) {
// es wurde was gefunden
$result[1] = substr($found[0],1,-1); // Höhe eintragen
$result[0] = substr($AHikrWayPointName,0,-(strlen($result[1])+2)); //Namen kürzen
}
return $result;
}
//--------------------------------------------------------
// SaveWaypointsInGPXFile
// Wegepunkte in Datei sichern
// Der Dateiname wird ganz oben definiert
//--------------------------------------------------------
function SaveWaypointsInGPXFile($AWayPointArray, $AGPXFileName) {
global $username;
$fc = ''."\r\n";
$fc .= ''."\r\n";
foreach ($AWayPointArray as $wpname => $wpcoord) {
$latlon = explode(",", $wpcoord);
$found = array();
$nameele = ExplodeHikrWayPointName($wpname);
if (count($latlon) == 2) {
$fc .= ''."\r\n";
$fc .= ''.$nameele[0].''."\r\n";
if (strlen($nameele[1]) > 0) {
$fc .= ''.$nameele[1].''."\r\n";
}
$fc .= ''."\r\n";
}
}
$fc .= ''."\r\n";
file_put_contents($AGPXFileName, $fc);
}
//--------------------------------------------------------
// Hauptprogramm
// Öffnet die Hauptseite und iteriert durch alle weiteren Seiten
// Gibt den geladenen Seiten Text in die Bearbeitungsfunktion
// Am Ende dieses Prozesses befinden sich alle gefundenen Tourenlinks in der globalen Liste
//--------------------------------------------------------
echo $verinfo."\r\n";
$pagendx = 0;
while(1) {
// Namen der Übersichtsseite zusammenbasteln
$pagename = 'http://www.hikr.org/user/'.$username.'/piz/?skip='.$pagendx;
echo 'Lade übersichtsseite: '.$pagename."\r\n";
// Inhalt der Übersichtsseite holen
$listpage = file_get_contents($pagename);
if (ProcessMainFile($listpage) == 0) break;
$pagendx += 50; //Zähler für folgende Seiten hochzählen
}
// Doppelte Einträge aus der Touren Liste enfernen.
$tourlist = array_unique($tourlist);
//var_dump($tourlist);
echo 'Anzahl der gefundenen Touren: '.count($tourlist)."\r\n";
foreach ($tourlist as $tour) {
ProcessTour($tour);
}
// Doppelte Eionträge aus der Wegepunklteliste entfernen
$waypointlist = array_unique($waypointlist);
//var_dump($tourlist);
echo 'Anzahl der gefundenen Wegepunkte: '.count($waypointlist)."\r\n";
foreach ($waypointlist as $waypoint) {
ProcessWayPoint($waypoint);
}
echo 'Anzahl der gefundenen Wegpunkte: '.count($waypointinfo)."\r\n";
echo 'Name, Lat, Lon, Elevevation (m)'."\r\n";
echo '-------------------------------------------'."\r\n";
foreach ($waypointinfo as $wpname => $wpcoord) {
$nameele = ExplodeHikrWayPointName($wpname);
echo '"'.$nameele[0].'",'.$wpcoord.','.$nameele[1]."\r\n";
}
echo '-------------------------------------------'."\r\n";
SaveWaypointsInGPXFile($waypointinfo,$gpxfilename);
echo 'Fertig! Daten in Datei '.$gpxfilename.' geschrieben'."\r\n";
?> |