【问题标题】:Coordinates comparison in database数据库中的坐标比较
【发布时间】:2014-04-18 17:19:46
【问题描述】:

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

问题是数据库包含大约 300k 人,因此获取所有人员并遍历此列表以检查他们是否靠近该点真的很慢。

有什么想法可以加快搜索速度吗?

【问题讨论】:

    标签: java mysql spring coordinates geospatial


    【解决方案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/

    【讨论】:

    • 谢谢!这正是我想要的!
    【解决方案2】:

    你能使用一个存储过程来执行数学运算并只返回正确的记录吗?这比通过网络传输所有数据要快得多。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-12-06
      • 2010-09-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-26
      相关资源
      最近更新 更多