我正在尝试在2D平面上进行几何计算(例如从点到线的距离)。
目前正在调查turfjs
以计算点到线的距离。
distance.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.4
和24
,但事实并非如此。
答案 0 :(得分:1)
如果你看turf.js source code for point to line distance,你会看到它计算了rhumb line的平面距离,这不是你在平面几何中所期望的。
要实现您的目标,您可以自己实施equation,例如
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]);
答案 1 :(得分:1)
Turf.js
意在用于墨卡托(网络,二维)地图,但计算时它基于WSG84(3D)标准,即将地球视为椭球体。有时候,特别是在广泛的区域,2D地图上的球形特征的表示和操作会返回不直观或意外的结果;在这些情况下,我们采用了Rhumb甚至欧几里德操作(例如planar
的{{1}}选项),这有时可能导致准确性降低。
所以,为了回答你的第一个问题,Turf认为你的点在曲面上并回答你的第二个问题,因此无法指示Turf在平面上工作。
对于替代库,您可能需要考虑使用多个库;除了已经建议的pointToLineDistance
之外,您还可以查看jsts
来处理union和intersect等操作。
如果您不仅限于Javascript,您可能需要查看Python Shapely
,这在我的理解中是一个非常强大和可靠的工具。
以上两个库都在少数Turf包中使用,或者用作实现和/或结果的参考。
关于flatten.js
的说明,它在草坪上显示some issues,但根据您案件的复杂程度,您可能会很好。