在Ruby中计算大量的Lat / Lng到一组2000 Lat / Lngs

时间:2012-03-27 11:17:47

标签: ruby-on-rails ruby gis

我正在努力找到解决问题的最佳方法:

问题

我在套装A中有(最多)100,000个Lat / Lng点 我在Set B中有(最多)2000个Lat / Lng点

我需要找到集B中点的最近邻点到集合A中的点。

一旦他们配对了 - 我就需要计算他们的距离: 2000 Set A指向2000 Set B Points。

这些点“在内存中”并非来自数据库 - 它们是系统中进行的其他计算的结果。

当前解决方案

在Ruby中使用KDTree实现我可以创建一个与我拥有的点匹配的KDTree查找。然后我在Ruby中使用一个hasrsine方法来计算它们配对时的点距离。

KDtree代码:Ruby KDTree Code hasrsine代码:Haversine Code

平台

我正在运行jruby - 使用rails作为Web框架。

问题

它慢!比如慢30到40秒......我认为主要的瓶颈在KDtree中,但是看起来需要很长时间(我认为)。在Set B中较小的数字它的速度很快但是B组中的点数越多它就会越快。

问题

有人会想到这样做吗?有什么我想念的东西。我认为Java库可能会更快,但是我将如何实现它,以及我将使用哪一个(在Java中不强 - 我在JVM中使用Jruby来处理多线程ruby代码)

2 个答案:

答案 0 :(得分:0)

是否可以将信息保存到数据库中?因为那时你可以使用GeoKit,它利用地理感知数据库(MySQL,Postgres> 8.1等),以便你可以这样做:

Location.find(:all, :origin =>[37.792,-122.393], :within=>10, :order=>"distance asc")

此外,您还可以找到两点之间的距离等。响应时间将更符合数据库查询,并且比您所看到的要快得多。

答案 1 :(得分:0)

在我的脑海里只是一个想法。如果你将你的纬度/长度四舍五入到小数点后两位,那么1.11 km的所有点都将是相同的。有关详细信息,请参阅this。我不是100%肯定它,但它可能适合你。对于波兰附近地区的偏离航线,当经度缩小时,这将不起作用。

为了加快两个纬度/长度之间的距离计算,您可以使用简单的距离公式而不是地理距离来计算欧氏距离。这个距离在正确的过程中不准确,但会加快你的过程。