最近的道路是纬度和经度经度

时间:2013-09-13 19:49:15

标签: algorithm math geo

我有一个数据库,其中包含英国每条道路的所有航路点。

我正在尝试构建一个导航应用,给定用户纬度&经度它将从数据库计算最近的道路&显示名称

数据库的JSON表示的片段

[
{
    "NAME": "Trinity Road",
    "coordinates": [
        [
            1.7595267,
            52.4778475
        ],
        [
            1.7587864,
            52.4774
        ]
    ]
},
{
    "NAME": "Wilde Street",
    "coordinates": [
        [
            1.7593497,
            52.4795499
        ],
        [
            1.7594677,
            52.4795041
        ],
        [
            1.7598164,
            52.4793277
        ]
    ]
}
]

我遇到的问题是正确找到最近的道路。我找不到任何合适的算法,给定一个点会找到最近的路径/行

它不能简单地比较坐标,因为最近的道路可能在2个路点之间(排除“最近点对点问题”)。

有人可以提出合适的算法吗?

我能想到的最佳解决方案是加权网格/矩阵,其中道路具有权重,这取决于它们与用户的接近程度。然后选择紧邻用户的最高价值道路(但这可能很昂贵)。

我想在不使用google-maps等网络api,也不使用PostGIS(必须使用sqlite - 移动应用程序)的情况下解决这个问题。

2 个答案:

答案 0 :(得分:3)

您可以使用r树或四叉树来限制搜索空间,然后使用voronoi图来查找最近的道路。然后,您可以使用2个或更多的道路来提供voronoi图,然后在图中搜索包含该位置的voronoi单元。也许你可以尝试加权voronoi图。你可以下载我的php类additivley加权voronoi图@ https://awvd.codeplex.com/

答案 1 :(得分:0)

使用四叉树是限制搜索空间的正确方法。参数化四叉树,使其每个四元节点不会超过100行。

您不需要(复杂的)voronoi图。

在四叉树中搜索之后,结果将是与四元节点重叠的行列表。

现在使用distanceToLineSegment(Point,point0,point1); (在互联网上搜索该名称)

走最短距离。

你需要动态转换点在调用distanceToLineSegment之前,它们在笛卡尔空间。使用四元节点的中心作为转换中心。