-2

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

我目前有一个 PostgreSQL 模块,其中包含一个 C 函数,可以在给定坐标的情况下查找地球上两点之间的距离,而且它似乎可以工作。问题是可扩展性。为了让它发挥作用,该函数当前必须扫描整个表并对每一行进行一些三角计算。两个表都按纬度和经度索引,但函数不能使用它们。在我们知道这两件事是否匹配之前,它必须做它的事情。新信息的发布频率可能高达每秒几次,并且每次检查每个点都开始变得相当笨拙。

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

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

4

3 回答 3

3

您还没有提到PostGIS - 为什么您排除了这种可能性?

http://postgis.refractions.net/documentation/manual-2.0/PostGIS_Special_Functions_Index.html#PostGIS_GeographyFunctions

于 2012-07-29T10:19:42.767 回答
2

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

似乎您可以存储更多信息以及可以帮助您排除在查询期间远未接近的其他数字的这些数字......这可能会避免大量的触发操作。

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

然后,您可以将最大和最小 lat 和 long 与该点一起存储在数据库中。然后,在对每一行运行三角函数之前,您可以过滤结果以消除明显超出范围的点。

于 2012-07-28T18:34:59.077 回答
0

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

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

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

如果你得到你的坐标和它在那个盒子外面,你可以确定它也不会在圆圈内,因为盒子比圆圈大。

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

于 2012-07-28T18:28:34.887 回答