如何通过 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 进行有效的多搜索点的主要内容,如果未能解决你的问题,请参考以下文章
laravel 如何通过 long 和 lat 找到附近的地方