Ruby on rails 在Ruby中计算大量Lat/Lngs到一组2000 Lat/Lngs
我正在努力找到解决以下问题的最佳方法: 问题 我在集合A中有(最多)100000个Lat/Lng点 我在B组有(多达)2000个Lat/Lng点 我需要找到集合B中点到集合A中点的最近邻 一旦它们配对,我需要计算它们之间的距离,即: 2000设置A点到2000设置B点 这些点是“内存中的”,它们不是来自数据库——它们是在系统中进行的其他计算的结果 当前解决方案 使用Ruby中的KDTree实现,我可以创建一个KDTree查找,它将匹配我拥有的点。然后,我使用Ruby中的haversine方法计算点配对时的距离 KDtree代码: 哈弗森代码: 站台 我正在运行jruby——使用rails作为web框架 问题 太慢了!大概慢30到40秒。。。我认为主要的瓶颈在于KDtree,但是点查找也需要很长时间(我认为)。在B组中,分数越小,速度越快,但B组中的分数越高,速度就越快 问题Ruby on rails 在Ruby中计算大量Lat/Lngs到一组2000 Lat/Lngs,ruby-on-rails,ruby,gis,Ruby On Rails,Ruby,Gis,我正在努力找到解决以下问题的最佳方法: 问题 我在集合A中有(最多)100000个Lat/Lng点 我在B组有(多达)2000个Lat/Lng点 我需要找到集合B中点到集合A中点的最近邻 一旦它们配对,我需要计算它们之间的距离,即: 2000设置A点到2000设置B点 这些点是“内存中的”,它们不是来自数据库——它们是在系统中进行的其他计算的结果 当前解决方案 使用Ruby中的KDTree实现,我可以创建一个KDTree查找,它将匹配我拥有的点。然后,我使用Ruby中的haversine方法计算
有人会想用不同的方式来做吗?有什么我不知道的吗。我认为Java库可能会快得多,但我如何实现它,我会使用哪一个(Java不是很强大-我在JVM中使用Jruby来处理多线程ruby代码)是否可以将信息持久化到数据库?因为您可以使用,它利用地理感知数据库(MySQL、Postgres>8.1等),因此您可以执行以下操作:
Location.find(:all, :origin =>[37.792,-122.393], :within=>10, :order=>"distance asc")
也可以找到两点之间的距离等。响应时间将与DB查询更加一致,并且比你看到的要快得多。
有可能将信息保存到数据库吗?因为您可以使用,它利用地理感知数据库(MySQL、Postgres>8.1等),因此您可以执行以下操作:
Location.find(:all, :origin =>[37.792,-122.393], :within=>10, :order=>"distance asc")
也可以找到两点之间的距离等。响应时间将与DB查询更加一致,而且比你看到的要快得多。
< P>只是我心中的一个想法。如果将纵横比四舍五入到小数点后两位,则1.11公里内的所有点都相同。有关更多详细信息,请参阅。我不是百分之百确定,但可能对你有用。对于靠近北极圈的地区,这将不起作用,因为那里的经度在缩小为了加快两个lat/long之间的距离计算,可以使用简单的距离公式而不是地理距离来计算欧几里得距离。这个距离在偏离航线时不会精确,但会加快你的进程。我只是想知道。如果将纵横比四舍五入到小数点后两位,则1.11公里内的所有点都相同。有关更多详细信息,请参阅。我不是百分之百确定,但可能对你有用。对于靠近北极圈的地区,这将不起作用,因为那里的经度在缩小
为了加快两个lat/long之间的距离计算,可以使用简单的距离公式而不是地理距离来计算欧几里得距离。这个距离在偏离航线时不会精确,但会加快您的进程。我做了一个测试,测试速度非常快,但我认为无论如何都会使用相同的方法?我这么做只是为了看看距离。但我认为,并不是为了解决整个问题,我认为将其放入数据库会使整个过程变慢。不过我可以试试。。。理想情况下,我希望独立于数据库解决这个问题。它依赖于lat/long字段的索引,并使用地理感知数据库的内置几何函数。这就是为什么选择仅限于MySQL和Postgres>8.1。你可以从数据库中使用它,我想,我会尝试一下!我做了一个很快的测试,但我认为无论如何都会使用相同的方法?我这么做只是为了看看距离。但我认为,并不是为了解决整个问题,我认为将其放入数据库会使整个过程变慢。不过我可以试试。。。理想情况下,我希望独立于数据库解决这个问题。它依赖于lat/long字段的索引,并使用地理感知数据库的内置几何函数。这就是为什么选择仅限于MySQL和Postgres>8.1。你可以从数据库中使用它,我想,我会尝试一下!谢谢你的建议,但是唯一的问题是我们需要50米的精度。因此,1.11的想法行不通——但它很有趣。我将观察欧几里德距离,通过四舍五入到0.0005可以达到大约50米的精度,它将给出55.5米的精度。请让我知道它是否真的有效。:)谢谢你的建议,但是唯一的问题是我们需要50米的精度。因此,1.11的想法行不通——但它很有趣。我将观察欧几里德距离,通过四舍五入到0.0005可以达到大约50米的精度,它将给出55.5米的精度。请让我知道它是否真的有效。:)