3

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

谷歌方向 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,latitude,longitude,state,city,zip,address, ( 3959 * acos( cos( 弧度(31.72723) ) * cos( 弧度(latitude ) ) * cos( 弧度( longitude ) - 弧度(-106.3047)) + sin( 弧度(31.72723) ) * sin( 弧度(纬度) ) ) ) AS 到地方的距离距离 <= 10 按距离排序 ASC 限制 10

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

如果最好怎么办?

例子

4

3 回答 3

2

这是使其更快的一种方法:

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

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

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

于 2013-02-20T06:45:05.410 回答
1

我最好建议这是Voronoi 图。但很难实施。

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

于 2013-02-20T06:43:20.870 回答
-1

尝试加入最小距离条款,其中 Diatance > 100 等。

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

于 2013-02-20T06:28:56.327 回答