【问题标题】:How to find closest position on a line from another point如何从另一点找到一条线上最近的位置
【发布时间】:2023-01-13 02:54:32
【问题描述】:

MKMapView - 我有一条路,由许多定位点组成。 从每个点到下一个点绘制一条线,使其成为一条可见的道路线。

我有一个用户位置,我想画一条线到那条路的最近点。

这意味着 - 我需要迭代每两个点,并确定离用户位置最近的点。

一切正常,但问题是 - 计算出的直线上的最近点有时并不直接与所述直线成 90 度角。 (在某些情况下,角度几乎是 45 度)。

看来这取决于线的角度。

请看示例视频: https://imgur.com/a/27QFmHx

(或视频截图:)

在这个可见的例子中,绘制了 3 条黑色静态线,其中两条是垂直的(右边的)。

红线 - 即时计算,绘制在用户位置(地图中心)与每条线上最近点之间。

可见,顶线是直的(没有角度),找到的最近点,它画的线是垂直的。

但是正确的黑线存在问题。找到的点(和红线)显然不是 90 度。

这是我正在使用的代码,用于确定直线上的最近点:

func distanceBetweenTwoPointsFrom(origin: CLLocationCoordinate2D, pointOne: CLLocationCoordinate2D, pointTwo: CLLocationCoordinate2D) -> CLLocationCoordinate2D {

    let A: Double = origin.latitude - pointOne.latitude
    let B: Double = origin.longitude - pointOne.longitude
    let C: Double = pointTwo.latitude - pointOne.latitude
    let D: Double = pointTwo.longitude - pointOne.longitude


    let dot: Double = A * C + B * D
    let len_sq: Double = C * C + D * D
    var param: Double = -1

    if len_sq != 0 {
        param = dot / len_sq
    }

    var xx: Double = 0
    var yy: Double = 0

    if param < 0 || (pointOne.latitude == pointTwo.latitude && pointOne.longitude == pointTwo.longitude) {
        xx = pointOne.latitude
        yy = pointOne.longitude
    } else if param > 1 {
        xx = pointTwo.latitude
        yy = pointTwo.longitude
    } else {
        xx = pointOne.latitude + param * C
        yy = pointOne.longitude + param * D
    }


    return CLLocationCoordinate2D.init(latitude: xx, longitude: yy)
}

问题:如何修复,使黑线上找到的点与用户成90度角? (显然是从用户位置到所述线的最直线)

【问题讨论】:

标签: swift mkmapview


【解决方案1】:

您应该按如下方式计算两点之间的距离:

import MapKit

func distance(
    from: CLLocationCoordinate2D,
    to: CLLocationCoordinate2D
) -> CLLocationDistance {
    MKMapPoint(from).distance(to: MKMapPoint(to))
}

但请注意,您只会找到距离最短的距离给予点,这可能不是从用户位置到路径上任何点的实际最短距离。

除非您有很多点非常接近您的路径,否则您可以添加此步骤:

为了提高准确性,您可以使用此公式从最接近用户点的两个点创建一条线,

https://en.wikipedia.org/wiki/Linear_equation

这基本上使用一条线创建了对实际路径的近似 - 但具有无限点。

然后使用以下公式搜索距离用户位置和这条线最短距离的点:

https://en.wikipedia.org/wiki/Distance_from_a_point_to_a_line

这也不能保证您得到距离最短的实际点,但它肯定是一个更好的近似值。

【讨论】:

    猜你喜欢
    • 2021-07-06
    • 1970-01-01
    • 1970-01-01
    • 2019-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-26
    相关资源
    最近更新 更多