1

我正在尝试在 2D 平面上进行一些几何计算(例如点到线的距离)。

目前正在研究turfjs计算点到线的距离。


代码

距离.js:

// hello
var turf = require('@turf/turf')

init();

// init,
function init() {
    distance();
}

function distance() {
    // line
    let line = turf.lineString([
    [0, 0],
    [3, 4]
    ]);
    console.log(line);

    // point
    let point = turf.point([3, 0]);
    console.log(point);

    // calculate distance from point to line, using planar,
    let dis = turf.pointToLineDistance(point, line, {
    units: 'degrees',
    method: 'planar'
    });
    console.log("distance: %f", dis);
}

输出

距离:2.398995395932417

如果我将点更改为[30, 0]并将线更改为[0, 0], [30, 40],则输出为:

距离:25.741472914575986

该程序使用degrees作为单元和planar作为方法。

预期的结果是2.424,但事实并非如此。


问题

  • 那么,这是否意味着这些点位于曲面上,而不是平面上?
  • 是否可以在平面而不是曲面中定义点&线&多边形?
  • 如果没有,那么是否还有另一个类似的工具来执行此任务?
4

2 回答 2

1

如果您查看turf.js 源代码中的 point to line distance,您会发现它会计算沿rhumb line的平面距离,这不是您在平面几何中所期望的。

为了实现你想要的,你可以自己实现方程,比如

function pointToLineDistance(line, p0) {
    var p1 = line[0],
        p2 = line[1];

    var x0 = p0[0], y0 = p0[1],
        x1 = p1[0], y1 = p1[1],
        x2 = p2[0], y2 = p2[1]


    return Math.abs(
        (y2 - y1) * x0
        - (x2 - x1) * y0
        + x2 * y1
        - y2 * x1
    ) 
    /
    Math.sqrt(
        (y2 - y1) * (y2 - y1)
        +
        (x2 - x1) * (x2 - x1)
    );
}

console.log(
    pointToLineDistance([[0, 0], [3, 4]], [3, 0]),
    pointToLineDistance([[0, 0], [30, 40]], [30, 0]),
);

或者,如果您更喜欢图书馆,类似flatten.js的东西可以帮助您:

let Flatten = require('flatten-js');

let {point, line} = Flatten;

let l = line(point(0, 0), point(3, 4));
let p = point(3, 0)
let d = p.distanceTo(l);

console.log(d[0]);
于 2018-06-06T10:59:21.630 回答
1

Turf.js旨在用于墨卡托(网络,2D)地图,但计算它基于WSG84(3D)标准,即认为地球是一个椭球体。但有时,特别是在大范围内,对 2D 地图上的球面特征的表示和操作会返回不直观或意外的结果;在这些情况下,我们采用了Rhumb甚至欧几里得运算(例如,因此选择了该planar选项pointToLineDistance),这有时会导致准确性降低。

因此,要回答您的第一个问题,Turf 会考虑您在曲面上的点,而要回答您的第二个问题,则无法指示 Turf 在平面上工作。

至于替代库,您可能需要考虑使用多个;除了已经建议的之外,flatten.js您还可以查看jsts联合和相交等操作。

如果您不限于 Javascript,您可能想看看 Python Shapely,在我的理解中它是一个非常强大和可靠的工具。

上述两个库都在少数 Turf 包中使用或用作实现和/或结果的参考。关于 的注释jsts,它在 Turf 中显示了一些问题,但根据案件的复杂性,您可能会对此感到满意。

于 2018-06-08T16:04:26.103 回答