折线简化Ramer–Douglas–Peucker算法

0.0.1 2016-05-02 19:23 UTC

This package is not auto-updated.

Last update: 2024-09-28 19:09:40 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坐标做的,所以这个方法有效。

但是,如果您想尝试使用其他坐标系统,请务必小心。该算法假设在二维平面上的笛卡尔坐标系。尝试在球面上使用经纬度将导致结果不正确。对于近似折线简化,结果可能仍然可以接受。当接近两极时,错误将越来越明显:简单来说,经度的度数将比纬度的度数更接近,因此会选择错误点从折线中移除。