我有两个 GPS 坐标,它们链接在一起形成一条线。我还有一个 GPS 点,它靠近但从不完全在这条线上。我的问题是,如何找到沿线到给定点的最近点?
user177082
问问题
5830 次
3 回答
11
Game Dev 对此有一个答案,它是用 C++ 编写的,但它应该很容易移植。CarlG做了什么(希望他不介意我转发):
public static Point2D nearestPointOnLine(double ax, double ay, double bx, double by, double px, double py,
boolean clampToSegment, Point2D dest) {
// Thanks StackOverflow!
// https://stackoverflow.com/questions/1459368/snap-point-to-a-line-java
if (dest == null) {
dest = new Point2D.Double();
}
double apx = px - ax;
double apy = py - ay;
double abx = bx - ax;
double aby = by - ay;
double ab2 = abx * abx + aby * aby;
double ap_ab = apx * abx + apy * aby;
double t = ap_ab / ab2;
if (clampToSegment) {
if (t < 0) {
t = 0;
} else if (t > 1) {
t = 1;
}
}
dest.setLocation(ax + abx * t, ay + aby * t);
return dest;
}
于 2009-09-22T10:57:57.897 回答
2
尝试这个:
ratio = (((x1-x0)^2+(y1-y0)^2)*((x2-x1)^2 + (y2-y1)^2) - ((x2-x1)(y1-y0) - (x1-x0)(y2-y1))^2)^0.5
-----------------------------------------------------------------------------------------
((x2-x1)^2 + (y2-y1)^2)
xc = x1 + (x2-x1)*ratio;
yc = y1 + (y2-y1)*ratio;
Where:
x1,y1 = point#1 on the line
x2,y2 = point#2 on the line
x0,y0 = Another point near the line
xc,yx = The nearest point of x0,y0 on the line
ratio = is the ratio of distance of x1,y1 to xc,yc and distance of x1,y1 to x2,y2
^2 = square
^0.5 = square root
公式是在我们找到从点 x0,y0 到线 (x1,y1 -> x2,y3) 的距离后得出的。看这里
我在这里测试了这段代码(我在上面给你的这个特定的),但我几年前用过类似的方法,它可以工作,所以你可以试试。
于 2009-09-22T11:20:10.113 回答
1
您可以为此使用JTS。
- 创建一个LineSegment(你的线)
- 创建坐标(要捕捉到线的点)
- 使用closestPoint方法获取线上的Point
非常简单的代码示例:
// create Line: P1(0,0) - P2(0,10)
LineSegment ls = new LineSegment(0, 0, 0, 10);
// create Point: P3(5,5)
Coordinate c = new Coordinate(5, 5);
// create snapped Point: P4(0,5)
Coordinate snappedPoint = ls.closestPoint(c);
于 2016-07-10T09:59:46.717 回答