协调数据库中的比较

时间:2014-03-13 18:27:10

标签: java mysql spring coordinates geospatial

我正在开发一个Spring应用程序,它必须使用GPS坐标搜索人员。 对于DB中的每个人,我都有自己的纬度和经度。客户端向服务器传递一个点和一个最大距离,该服务器必须在此距离内返回此点周围的所有客户端。

问题在于数据库包含大约30万人,因此如果他们接近这一点,那么让所有人和遍历此列表进行查看非常慢。

有任何想法加快搜索速度吗?

2 个答案:

答案 0 :(得分:1)

处理邻近搜索的最佳方法是从某种边界矩形近似开始,然后从那里开始到人与人之间的实际大圆距离。

只要您的纬度不太靠近两极,两点之间的距离就是一个草率但可行的近似值(在SQLish中):

GREATEST(ABS(lat1-lat2),ABS(long1-long2))

如果你想更精确,并且你知道你只关心在里面的人,比如说10公里,你可以使用像这样的边界矩形搜索。

WHERE latitude_from_table
    BETWEEN latpoint  - (10.0 / 111.045)
        AND latpoint  + (10.0 / 111.045)
  AND longitude_from_table
    BETWEEN longpoint - (10.0 / (111.045 * COS(RADIANS(latpoint))))
        AND longpoint + (10.0 / (111.045 * COS(RADIANS(latpoint))))

这是因为在一个纬度范围内有111.045公里。经度界限中的余弦项代表了当你接近极点时纬度线更紧密的事实。这使您可以在latitude_from_table和longitude_from_table列上利用MySQL索引。

一旦你有一个边界框接近,你可以应用一个很大的圆距离公式。以下是此背景。 http://www.plumislandmedia.net/mysql/haversine-mysql-nearest-loc/

对于您正在考虑的应用类型,32位IEEE-488浮点对于您的坐标来说具有足够的精度。如果您正在观察的点非常接近(小于一公里左右),您希望使用Vincenty公式(http://www.plumislandmedia.net/mysql/vicenty-great-circle-distance-formula/)而不是更常见的所谓的半正式公式(http://www.plumislandmedia.net/mysql/stored-function-haversine-distance-computation/

如果您的人数远远超过300K,您可能需要考虑使用MySQL地理空间索引方案。它仅适用于MyISAM表,但在进行边界矩形搜索时非常。看这里。 http://www.plumislandmedia.net/mysql/haversine-mysql-nearest-loc/

答案 1 :(得分:0)

您可以使用执行数学运算的存储过程并仅返回正确的记录吗?这比通过网络提取所有数据要快得多。