derickr / gpx-utils
一套用于合并和排序不同类型GPX文件的实用工具
Requires
- php: >=8.0.0
- ext-geospatial: ^0.3.1
README
GPX Utils
一套操作GPX文件和GPX文件集的实用工具。
读取GPX文件
可以使用GPX读取器类 DerickR/GPX/Reader
来读取一个GPX文件。
它可以读取GPX路线(rte
/rtept
),如果不存在,它将读取GPX轨迹(trk
/trkseg
/trkpt
)。
你可以使用以下方法读取GPX文件
<?php require __DIR__ . '/vendor/autoload.php'; use DerickR\GPX\Reader; $gpxInformation = new Reader( $file ); ?>
要访问轨迹,你可以使用 getTrack()
方法,该方法返回一个封装有序坐标对的 DerickR/GPX/Track
对象。如果GPX文件包含多个轨迹,这些轨迹将被合并为一个。
$track = $gpxInformation->getTrack();
要从GPX文件中获取单个轨迹,你可以使用 getTracks()
方法获取一个 Track
对象数组
$tracks = $gpxInformation->getTracks(); foreach ( $tracks as $track ) { /* Do something with $track */ }
对于包含路线(rte
/rtept
)的GPX文件,这仍将返回一个合并的轨迹。
对于包含轨迹(trk
/trkseg
)的GPX文件,这将返回一个轨迹数组,每个 Track
对象表示存储在GPX文件中的轨迹。
要合并存储在多个GPX文件中的轨迹,请参阅合并GPX文件。
写入GPX文件
可以使用GPX写入器类 DerickR/GPX/Writer
使用 trk
/trkseg
/trkpt
元素将 Track
对象写入GPX轨迹。它仅支持 lat
和 lon
XML元素。
你可以使用以下方法将轨迹写入GPX文件
<?php require __DIR__ . '/vendor/autoload.php'; use DerickR\GPX\Writer; $writer = new Writer( $track ); $writer->writeGpx( 'route-test.gpx' ); ?>
除了直接将GPX XML写入文件,还可以通过使用getGpxString()方法获取包含此信息的字符串。
<?php require __DIR__ . '/vendor/autoload.php'; use DerickR\GPX\Writer; $writer = new Writer( $track ); $xmlString = $writer->getGpxString(); ?>
在轨迹上操作
类 Track
有几个方法可以操作GPX轨迹。以下方法被支持
getTrackData
- 返回一个包含lat/lon坐标对的数组。
getFirstPointAsGeoJson
- 返回轨迹中的第一个元素,格式为GeoJson数组。
getLastPointAsGeoJson
- 返回轨迹中的最后一个元素,格式为GeoJson数组。
appendTrack( Track $newTrack )
- 将新轨迹中的所有坐标对按顺序添加到轨迹中。
reverse()
- 反转构成轨迹的坐标对数组。
truncatePrecision( int $decimals )
- 遍历轨迹中的所有坐标对,将坐标对的小数位数截断为
$decimals
。在第二次循环中,如果截断后连续坐标对相同,则合并它们。
合并GPX文件
可以使用静态方法 Utils::createMergedTrack
来合并一组GPX文件。该方法会根据轨迹的第一个和最后一个点自动反转和选择合并轨迹的顺序。
到 createMergedTrack
的第二个参数决定了不同轨迹的不同点可能相距多远(以米为单位)才被视为连续。默认为 25.0
米。
如果GPX文件不是连续的,则会抛出异常。
例如,要合并目录中的所有GPX文件,可以使用以下方法
<?php require __DIR__ . '/vendor/autoload.php'; use DerickR\GPX\Reader; use DerickR\GPX\Utils; use DerickR\GPX\Writer; // Find all .gpx files $files = glob( '*.gpx' ); // Read all tracks into an array $tracks = []; foreach ( $files as $file ) { $tracks[] = (new Reader( $file ))->getTrack(); } // Merge all tracks into a single one. $track = Utils::createMergedTrack( $tracks ); // Write created track to a file $writer = new Writer( $track ); $writer->writeGpx( 'route-test.gpx' ); ?>