lxlang/rdp

折线简化算法 Ramer–Douglas–Peucker

0.0.2 2024-03-27 12:44 UTC

This package is auto-updated.

Last update: 2024-09-27 13:50:10 UTC


README

PHP 实现了用于折线简化的 Ramer–Douglas–Peucker 算法。

许可证:公有领域

示例简化折线

Example polyline before and after simplification

安装

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 坐标系的英国进行的,所以它工作得很好。

但是,如果您想尝试在其他坐标系中做同样的事情,请小心。该算法假设在二维平面上是笛卡尔坐标系。尝试在球面上使用经纬度将会得到错误的结果。对于近似折线简化,结果可能仍然是可以接受的。随着您接近两极,错误将变得越来越明显:简单来说,经度的度数将比纬度的度数更接近,因此将从折线中错误地选择要删除的点。