Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 在Ruby中计算大量Lat/Lngs到一组2000 Lat/Lngs_Ruby On Rails_Ruby_Gis - Fatal编程技术网

Ruby on rails 在Ruby中计算大量Lat/Lngs到一组2000 Lat/Lngs

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方法计算

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

问题 我在集合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组中的分数越高,速度就越快

问题
有人会想用不同的方式来做吗?有什么我不知道的吗。我认为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米的精度。请让我知道它是否真的有效。:)