phpGPX
, (*1)
Simple library written in PHP for reading and creating GPX files., (*2)
Library is currently marked as Release Candidate but is already used in production on several project without any problems. Documentation is available using GitHub pages generated by Jekyll., (*3)
Contribution and feedback is welcome! Please check the issues for TODO. I will be happy every feature or pull request., (*4)
Features
Supported Extensions
Stats calculation
- Distance (m)
- Average speed (m/s)
- Average pace (s/km)
- Min / max altitude (m)
- Start / end (DateTime object)
- Duration (seconds)
Examples
Open GPX file and load basic stats
<?php
use phpGPX\phpGPX;
$gpx = new phpGPX();
$file = $gpx->load('example.gpx');
foreach ($file->tracks as $track)
{
// Statistics for whole track
$track->stats->toArray();
foreach ($track->segments as $segment)
{
// Statistics for segment of track
$segment->stats->toArray();
}
}
Writing to file
<?php
use phpGPX\phpGPX;
$gpx = new phpGPX();
$file = $gpx->load('example.gpx');
// XML
$file->save('output.gpx', phpGPX::XML_FORMAT);
//JSON
$file->save('output.json', phpGPX::JSON_FORMAT);
Creating file from scratch
<?php
use phpGPX\Models\GpxFile;
use phpGPX\Models\Link;
use phpGPX\Models\Metadata;
use phpGPX\Models\Point;
use phpGPX\Models\Segment;
use phpGPX\Models\Track;
require_once '/vendor/autoload.php';
$sample_data = [
[
'longitude' => 9.860624216140083,
'latitude' => 54.9328621088893,
'elevation' => 0,
'time' => new \DateTime("+ 1 MINUTE")
],
[
'latitude' => 54.83293237320851,
'longitude' => 9.76092208681491,
'elevation' => 10.0,
'time' => new \DateTime("+ 2 MINUTE")
],
[
'latitude' => 54.73327743521187,
'longitude' => 9.66187816543752,
'elevation' => 42.42,
'time' => new \DateTime("+ 3 MINUTE")
],
[
'latitude' => 54.63342326167919,
'longitude' => 9.562439849679859,
'elevation' => 12,
'time' => new \DateTime("+ 4 MINUTE")
]
];
// Creating sample link object for metadata
$link = new Link();
$link->href = "https://sibyx.github.io/phpgpx";
$link->text = 'phpGPX Docs';
// GpxFile contains data and handles serialization of objects
$gpx_file = new GpxFile();
// Creating sample Metadata object
$gpx_file->metadata = new Metadata();
// Time attribute is always \DateTime object!
$gpx_file->metadata->time = new \DateTime();
// Description of GPX file
$gpx_file->metadata->description = "My pretty awesome GPX file, created using phpGPX library!";
// Adding link created before to links array of metadata
// Metadata of GPX file can contain more than one link
$gpx_file->metadata->links[] = $link;
// Creating track
$track = new Track();
// Name of track
$track->name = sprintf("Some random points in logical order. Input array should be already ordered!");
// Type of data stored in track
$track->type = 'RUN';
// Source of GPS coordinates
$track->source = sprintf("MySpecificGarminDevice");
// Creating Track segment
$segment = new Segment();
foreach ($sample_data as $sample_point)
{
// Creating trackpoint
$point = new Point(Point::TRACKPOINT);
$point->latitude = $sample_point['latitude'];
$point->longitude = $sample_point['longitude'];
$point->elevation = $sample_point['elevation'];
$point->time = $sample_point['time'];
$segment->points[] = $point;
}
// Add segment to segment array of track
$track->segments[] = $segment;
// Recalculate stats based on received data
$track->recalculateStats();
// Add track to file
$gpx_file->tracks[] = $track;
// GPX output
$gpx_file->save('CreatingFileFromScratchExample.gpx', \phpGPX\phpGPX::XML_FORMAT);
// Serialized data as JSON
$gpx_file->save('CreatingFileFromScratchExample.json', \phpGPX\phpGPX::JSON_FORMAT);
// Direct GPX output to browser
header("Content-Type: application/gpx+xml");
header("Content-Disposition: attachment; filename=CreatingFileFromScratchExample.gpx");
echo $gpx_file->toXML()->saveXML();
exit();
Currently supported output formats:, (*5)
Installation
You can easily install phpGPX library with composer., (*6)
composer require sibyx/phpgpx
Contributors
I wrote this library as part of my job in Backbone s.r.o.., (*7)
License
This project is licensed under the terms of the MIT license., (*8)