如何通过 lat long 进行有效的多搜索点

Posted

技术标签:

【中文标题】如何通过 lat long 进行有效的多搜索点【英文标题】:How can I do efficient multi search points by lat long 【发布时间】:2013-02-05 01:57:27 【问题描述】:

我是 ios 上的一款应用,其中包含 Trip Planner。 例如,我使用谷歌方向 API 来获取从纽约到波士顿的路线。 我有 50 个不同的经纬度来在地图上制作折线。 之后,我需要在这条路线上找到可以在去波士顿的路上参观的地方。

Google 路线 API 为我提供:

latitude = "30.308399"; longitude = "-89.748299";
latitude = "30.310930"; longitude = "-89.818604";
latitude = "30.350050"; longitude = "-89.916054";
latitude = "30.432850"; longitude = "-90.098549";
....

现在对于我在 mysql 数据库中搜索以获取最近的位置的每个点:

选择 id,title,type_id,service_id,纬度,经度,州,城市,邮编,地址, ( 3959 * acos( cos( 弧度(31.72723) ) * cos( 弧度(纬度) ) * cos(弧度(经度)-弧度(-106.3047))+ sin( 弧度(31.72723))* sin(弧度(纬度))))AS距离 按距离 ASC 限制 10 放置距离

但是如果这次从纽约到旧金山的旅行,我将有 800 分,我会向数据库进行 800 次查询,总共需要 2 秒以上。我有 7 个不同的表,需要 14 秒。

如果这样做最好怎么办?

【问题讨论】:

数据库中有多少分? 7张桌子共有8万个地方 您需要使数据库中的地方更有条理..可能是通过运行 k-means 聚类并将它们划分为不同的集群..然后您可以按每个集群搜索而不是搜索每个地方..size集群的..应该取决于缩放级别.. Algorithm to find all Latitude Longitude locations within a certain distance from a given Lat Lng location 的可能重复项 【参考方案1】:

这里有一种加快速度的方法:

(1) 将经纬度表放入索引。

(2) 在查询中,首先只选择那些在路线上点的水平和垂直距离内的地点,这些地点足够接近以引起兴趣。按纬度范围和经度范围选择。

(3) 然后按距离对这些点进行排序,无论是在查询内部还是外部。

【讨论】:

【参考方案2】:

我可以建议这是Voronoi diagram。但是很难实现。

注意事项: 由于您只有 80k 点,您可以在应用程序中缓存所有这些点并从应用程序所需的点返回。

【讨论】:

【参考方案3】:

尝试加入最小距离条款,如距离 > 100 等。

这称为锥形扫描。您从低分辨率开始,然后随着靠近而不断增加。

【讨论】:

没什么变化,他还是需要计算距离。 总共还需要对数据库进行 5 600 次查询。 他不会收到数百个数据点,也许是几十个。这将加快他的查询速度。这是直观的解决方案 - 对于非常远的距离,首先进行“更广泛”的扫描,然后缩小距离。 他只选择前 10 名。要应用您的查询,SQL 仍然必须计算到每个点的距离。

以上是关于如何通过 lat long 进行有效的多搜索点的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 boost 处理 lat long 值?

laravel 如何通过 long 和 lat 找到附近的地方

使用 D3.js geom 缩放 voronoi 多边形,结果为 lat long,而不是 px 坐标

计算街道的哈希值

通过其他连接获得laravel 5中的纬度和经度

sql 通过@maplion为@simplot获取Lat / Long的FIPS代码