【问题标题】:Calculate distance along line, closest to other point (aka "project")计算沿线的距离,最接近其他点(又名“项目”)
【发布时间】:2016-11-01 01:16:02
【问题描述】:

我有一个由许多点组成的LineString(坐标字符串),我想计算最接近Point 的沿线的距离(从第一个点到最后一个点,方向性很重要)就像这样说的:"project()" calculation

如果我不必使用任何第三方库,那就太好了,我意识到有些可以轻松做到这一点。

【问题讨论】:

  • 到目前为止你尝试过什么?你能给我们看一些代码吗?这很容易实现,但是您需要仔细考虑数学,一旦有了这些,编写数学代码就很容易了。
  • @sorfiend 我可以逐行(连接线串的点)并找到每个点上最近的点,然后找到到该点的距离。然后取最接近的点并使用它。然后通过获取之前的线段,添加它们,然后将线的部分线段与选定的点相加,来测量沿线的距离。但这对于以前可能已经非常有效地完成的事情来说听起来过于复杂和缓慢

标签: java gis


【解决方案1】:

线性参考是您正在寻找的。从您的评论来看,这听起来确实很复杂,但是当您将其分解然后添加一个循环来遍历您的点以计算出最近的部分时,它仍然是一段非常简单的数学/代码。

下面是从谷歌搜索中提取的一个很好的代码...... 您可以使用它来查找线段上的最近点:Util.getClosestPointOnSegment(Point ss, Point se, Point p)

代码:

import java.awt.Point;

public class Util{

  /**
   * Returns closest point on segment to point
   * @param ss - segment start point
   * @param se - segment end point
   * @param p - point to found closest point on segment
   * @return closest point on segment to p
   */
  public static Point getClosestPointOnSegment(Point ss, Point se, Point p)
  {
    return getClosestPointOnSegment(ss.x, ss.y, se.x, se.y, p.x, p.y);
  }

  /**
   * Returns closest point on segment to point
   * @param sx1 - segment x coord 1
   * @param sy1 - segment y coord 1
   * @param sx2 - segment x coord 2
   * @param sy2 - segment y coord 2
   * @param px - point x coord
   * @param py - point y coord
   * @return closets point on segment to point
   */
  public static Point getClosestPointOnSegment(int sx1, int sy1, int sx2, int sy2, int px, int py)
  {
    double xDelta = sx2 - sx1;
    double yDelta = sy2 - sy1;

    if ((xDelta == 0) && (yDelta == 0))
    {
      throw new IllegalArgumentException("Segment start equals segment end");
    }

    double u = ((px - sx1) * xDelta + (py - sy1) * yDelta) / (xDelta * xDelta + yDelta * yDelta);

    final Point closestPoint;
    if (u < 0)
    {
      closestPoint = new Point(sx1, sy1);
    }
    else if (u > 1)
    {
      closestPoint = new Point(sx2, sy2);
    }
    else
    {
      closestPoint = new Point((int) Math.round(sx1 + u * xDelta), (int) Math.round(sy1 + u * yDelta));
    }
    return closestPoint;
  }
}

显然,您仍然需要编写一些代码来计算出要检查的最接近的段,并且仍然添加长度,但这会让您开始。

示例取自:

http://www.java2s.com/Code/Java/2D-Graphics-GUI/Returnsclosestpointonsegmenttopoint.htm

【讨论】:

  • 如果没有其他人出现,我会接受答案,但我正在寻找更完整的东西,因为我已经了解您的解决方案。仍然感谢您布置它
猜你喜欢
  • 2018-07-14
  • 1970-01-01
  • 2021-10-16
  • 1970-01-01
  • 1970-01-01
  • 2021-11-05
  • 2021-03-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多