捕捉指向一条线

我有两个GPS坐标连接在一起形成一条线。 我还有一个GPS点,它靠近线路,但从未完全在线路上。 我的问题是,如何找到沿给定点的最近点?

游戏开发有一个答案 ,它是在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; } 

尝试这个:

 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)的距离之后导出公式。 看到这里

我在这里测试了这个代码(我上面给你的这个特别的代码),但是我几年前就用过类似的方法,它可以运行,所以你可以尝试一下。

你可以使用JTS 。

  • 创建LineSegment (您的行)
  • 创建坐标 (要捕捉到该线的点)
  • 使用nearestPoint方法获取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);