如何优化点到圆匹配?

时间:2012-07-28 18:17:42

标签: postgresql computational-geometry

我有一个包含一堆地球坐标(纬度/经度)和相关半径的表格。我还有一个表格,其中包含一些我希望与这些圆圈匹配的点,反之亦然。两者都是动态的;也就是说,可以随时添加或删除新圆圈或新点。当添加其中任何一个时,我希望能够将新的圆圈或点分别与所有适用的点或圆相匹配。

我目前有一个包含C函数的PostgreSQL模块,用于找到地球上两个点之间的距离给出它们的坐标,它似乎有效。问题是可扩展性。为了使它能够做到这一点,该函数当前必须扫描整个表并对每一行进行一些三角计算。两个表都由纬度和经度索引,但该函数不能使用它们。在我们知道这两件事是否匹配之前,它必须做它的事情。新信息可能每秒发布几次,每次检查每个点都开始变得非常笨拙。

我看过PostgreSQL的几何类型,但它们似乎更适合直角坐标而不是球体上的点。

如何安排/优化/过滤/预先计算此数据以使匹配更快并减轻负载?

3 个答案:

答案 0 :(得分:3)

答案 1 :(得分:2)

在这里大声思考......你有一个点(纬度/经度)和半径,你想要找到可能重叠的所有尖端点半径组合吗? (或类似的东西......)

似乎你可能能够存储更多的信息以及那些可以帮助你排除在查询过程中无法接近的其他数据......这可能会避免很多触发操作。

例如,使用点x,y和半径r,您可以轻松计算可行纬度/长度(方形区域)的范围,如果针对另一个点进行不必要的计算,可以使用该范围来帮助排除它。

然后,您可以在数据库中存储max和min lat以及该点。然后,在每行上运行trig之前,您可以过滤结果以消除明显超出范围的点。

答案 2 :(得分:0)

如果我没有正确理解你,那么我的第一个想法是缓存一些数据并消除大部分检查。

想象一下,你的圆圈实际上是一个盒子,它有4个边

你可以存储这些线的基本坐标,就像你在真实地图上有线(网格)一样。所以你存储每个圆圈的东,西,北,南边缘

如果你得到你的坐标及其外框,你可以确定它不会在圆圈里面,因为这个框大于圆圈。

如果不是那么你必须像现在一样检查。但我想你已经可以消除大部分步骤了。