我正在努力找到解决问题的最佳方法:
我在套装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代码)
答案 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%肯定它,但它可能适合你。对于波兰附近地区的偏离航线,当经度缩小时,这将不起作用。
为了加快两个纬度/长度之间的距离计算,您可以使用简单的距离公式而不是地理距离来计算欧氏距离。这个距离在正确的过程中不准确,但会加快你的过程。