2013-02-20 62 views
3

我是iOS上的一个应用程序,它具有Trip Planner。 例如,我使用google方向API获取从纽约到波士顿的路线。 我有50个不同的纬度经度在地图上制作折线。 之后,我需要获得这条路线上的地点,我可以在去波士顿的途中参观。如何通过lat long来实现高效的多搜索点

谷歌路线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,标题,TYPE_ID,service_id为,北纬,经度,州,城市,邮编,地址, (3959 * ACOS(COS(弧度(31.72723))* COS(弧度(纬度))* COS(弧度(经度) - 弧度(-106.3047))+罪( 弧度(31.72723))* sin(弧度(纬度))) )作为一个距离ASC限额由 地方距离< = 10阶距离10

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

什么是最好的,如果做的?

Example

+0

数据库内多少点?在总 – 2013-02-20 06:39:24

+0

7表有80K地方 – 2013-02-20 06:40:06

+0

你需要做的地方在DB更organized..may是通过运行K-均值聚类和将它们分成不同clusters..then而不是搜索每个可以通过每个群集搜索的地方..大小的集群..应该取决于水平的缩放.. – Shivam 2013-02-20 06:52:51

回答

-1

尝试把在最小距离子句,其中Diatance> 100等

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

+0

它没有改变,他仍然需要计算距离。 – 2013-02-20 06:29:55

+0

仍然需要对数据库进行5 600次查询。 – 2013-02-20 06:31:32

+0

他不会收到数百个数据点,也许是几十个。这会加快他的查询速度。这是直观的解决方案 - 对于非常大的距离,首先进行“更广泛”的扫描,然后消除距离。 – 2013-02-20 06:34:34

1

最好的我可以建议这是Voronoi diagram。但很难实施。

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

2

这里有一种方法,使其更快:

在表(1)把索引的经度和纬度。

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

(3)然后这些点由距离,内部或查询外排序。