lxlang / rdp
折线简化算法 Ramer–Douglas–Peucker
0.0.2
2024-03-27 12:44 UTC
Requires
- php: >=8.0
Requires (Dev)
- phpunit/phpunit: ^11.0
This package is auto-updated.
Last update: 2024-09-27 13:50:10 UTC
README
PHP 实现了用于折线简化的 Ramer–Douglas–Peucker 算法。
许可证:公有领域
示例简化折线
安装
composer require david-r-edgar/rdp
示例用法
use davidredgar\polyline\RDP;
$line = array(
array(150, 10),
array(200, 100),
array(360, 170),
array(500, 280));
$rdpResult = RDP::RamerDouglasPeucker2d($line, 30);
$rdpResult 将包含一个具有减少点数的数组。对于这个例子
$rdpResult == array(
array(150, 10),
array(200, 100),
array(500, 280));
RamerDouglasPeucker2d() 的第二个参数是 epsilon,表示任何点到相邻两点之间线的最大垂直距离。尝试将其替换为 10 或 50,观察结果。
用于地理目的
我最初实现这个是为了简化地图上的复杂路线。因为我是在使用 OSGB36 坐标系的英国进行的,所以它工作得很好。
但是,如果您想尝试在其他坐标系中做同样的事情,请小心。该算法假设在二维平面上是笛卡尔坐标系。尝试在球面上使用经纬度将会得到错误的结果。对于近似折线简化,结果可能仍然是可以接受的。随着您接近两极,错误将变得越来越明显:简单来说,经度的度数将比纬度的度数更接近,因此将从折线中错误地选择要删除的点。
