根据道路名称获取道路上所有经纬度解决办法

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了根据道路名称获取道路上所有经纬度解决办法相关的知识,希望对你有一定的参考价值。

参考技术A 首先想到的是调用地图厂商如高德或者百度现有的webapi,能够直接返回理想的数据,但是翻遍了这些厂商的api都没有发现,搜索之下有篇2020年的 帖子 说调用高德隐api可以满足要求:

但是实测下来会报错权限问题,如图

说明高德确实是有这个api的,但是因为权限问题被禁用了,故询问了一下客服不能调用的原因或者怎样可以满足调用条件,得到回复该接口已经不对外开放!!!

那么就没有办法了吗?并不是,既然高德的官网是可以实现这样子的功能的话,就说明他们是有自己的api在用的,尝试在高德官网搜索道路

发现官方是可以实现的,那么我们打开开发者模式看看他们是怎么请求的,这里不得不说藏的很深!

可以看到在poiinfo接口下有一个看着像是我们想要的数据:

我们把数据拷贝出来看一下

这一个个就很像我们需要的经纬度啊,是不是!?
但是细看会发现,这些经纬度是被 | 和 _ 分割开的,如果他俩的作用是一样的,为啥不用同样的字符分割?但是我们也不知道人家这样做的意图是什么样子的,所以只能先按照相同的作用做分割,把数据分割好之后是这个样子的:

有那个意思了,导入到项目里面一看,蒙了,连起来是个啥啊,一条路连起来像个蜘蛛网,当时没截图大家可以脑补一下

开玩笑的,这边项目不方便透露,写了个demo来按照点的顺序展示点,发现数据顺序是错乱的

毫无章法是不是?这指定是有问题的,想来就是点的顺序有问题,那么就是数据分割的有问题,重新来梳理过:
1、先根据 | 分割数组

所以写了个简易的python脚本处理数据:

临时写的,没考虑啥性能,莫笑,最终的效果就是传入从高德官网扒下来的字符串直接输出二维路线经纬度数组

给定纬度和经度的最近道路

【中文标题】给定纬度和经度的最近道路【英文标题】:Nearest road given latitude & longitude 【发布时间】:2013-09-18 14:27:51 【问题描述】:

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

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

数据库的 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 等 Web api 或 PostGIS(必须使用 sqlite - 移动应用)的情况下解决这个问题

【问题讨论】:

这个数据库是基于 OpenstreetMap、Ordnance Survey、TomTom 还是诺基亚地图? 现在是免费的,还是在与操作系统的合同中,顺便看看我的答案 【参考方案1】:

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

【讨论】:

【参考方案2】:

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

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

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

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

走最短距离。

您必须在调用 distanceToLineSegment 之前动态转换点,以便它们位于笛卡尔空间中。使用四边形节点的中心作为变换中心。

【讨论】:

以上是关于根据道路名称获取道路上所有经纬度解决办法的主要内容,如果未能解决你的问题,请参考以下文章

如何在谷歌地图API中获取高速公路和道路的纬度和经度

给定纬度和经度的最近道路

计算两个经纬度之间的道路距离

特定的纬度/经度落在啥“道路”上?美国人口普查形状文件

谷歌地图步行路线将精确坐标替换为最近的道路。有解决方法吗?

高德地图抓路服务