Mysql 按接近度排序结果(带坐标和半径)

Mysql 按接近度排序结果(带坐标和半径),mysql,sql,postgresql,geolocation,neo4j,Mysql,Sql,Postgresql,Geolocation,Neo4j,给定一个包含4个圆的数据库,其中每个圆都有一个半径和一个地理定位中心: id | radius | latitude | longitude ---+--------+----------+---------- 1 | 3 | 40.71 | 100.23 2 | 10 | 50.13 | 100.23 3 | 12 | 39.92 | 100.23 4 | 4 | 80.99 | 100.23 注意:

给定一个包含4个圆的数据库,其中每个圆都有一个半径和一个地理定位中心:

id | radius | latitude | longitude
---+--------+----------+----------
 1 |      3 |    40.71 |    100.23
 2 |     10 |    50.13 |    100.23
 3 |     12 |    39.92 |    100.23
 4 |      4 |    80.99 |    100.23
注意:为了简单起见,每个圆的经度都是相同的

假设我们在圆2上,我想根据
纬度
/
经度
坐标和每个圆的
半径
找到附近的每个圆

例如,根据纬度/经度坐标,我们有以下顺序:


  • 第1圈(由于距离较近:
    9.42我建议查看PostGIS地理数据类型及其相关功能(例如:
    ST_Distance
    ),而不是重新发明轮子

    我建议您:

    创建1个表格,用于计算相对于起始圆的相对距离

    例如:

    id | calc1  | calc2    
    ---+--------+----------
     1 |  9.42  |    1.97
     3 |  10.21 |    6.42
     4 |  30.86 |   62.86
    
    Calc1是不带半径的计算 calc2是带半径的计算

    然后创建一个存储过程,该过程在运行时首先删除表,然后用正确的数据填充表,然后从目标表读取结果


    postgresql的contrib中提供的
    立方体
    地球距离
    扩展可以处理这一问题,以产生至少近似的答案。具体地说,他们假设地球是一个简单的球体,这使得数学计算更加容易

    通过这些延伸,可以生成圆2和其他圆之间的距离,如下所示:

    select circle.id,
           earth_distance(ll_to_earth(circle.latitude, circle.longitude),
                          ll_to_earth(x.latitude, x.longitude))
     from circle,
          circle x
     where x.id = 2 and circle.id <> x.id
     order by 2;
    
    然后使用一些相当繁琐的函数来删除/插入
    circle\u distance
    中的相关行,这些函数由
    circle
    上的触发器调用。这意味着您可以执行以下操作:

    select b_id from earth_distance where a_id = $circle_id order by earth_distance limit $n
    

    此查询将能够在
    上使用该索引(a\u id,earth\u distance)
    进行快速扫描。

    在neo4j中,您可以查看neo4j Spatial对不同操作的测试,其中也包括邻近搜索,例如,

    您想在MySQL或PostgreSQL中执行此操作吗?我更喜欢使用PostgreSQL。但即使使用MySQL,我也会很高兴;)您打算如何准确地计算这些的顺序?既然你认为半径是重要的,你不仅关心圆中心之间的距离,所以请扩大。你的意思是中心之间的GC距离除以被考虑的圆的半径吗?(不太确定该计算是否有用,但它产生了您要求的顺序)实际上,该顺序将根据我们圆的地理定位中心与我们要列出的其他圆之间的距离(根据半径)来计算。所以我们可以说:cercles周长和所考虑的圆之间的gc距离。谢谢这个提示。然而,我在Heroku上,该插件目前正在进行私有测试()。如果我们能从头开始,那就太好了……我不确定你的半径与纬度值的关系。它们是不同的测量值,所以我不确定你是否可以在纬度上加上/减去半径,并且有意义…当然,如果经度保持不变,答案很简单。。。选择t1.*from#t t1,(选择纬度作为lat from#t其中id=@id)v其中id@idabs订购(lat-case when latitudi想知道我们是否可以分两步来做:首先我们得到
    calc1
    ,感谢一个子查询,然后我们找到
    calc2
    ,以便对结果进行排序。ofc calc2只是calc1中的一个数学问题,但我喜欢aproch,因为它不需要对结果端进行太多计算,因为这样你就需要对每个输出都进行排序,然后你给我我不想让某个noob程序员去做,他把它搞砸了,然后每个输出都不一样,但这是我在我的工作中习惯的。谢谢你的工作,@araqnid。我将学习PostgreSQL,以便能够使用你令人敬畏的解决方案。问候。
    select b_id from earth_distance where a_id = $circle_id order by earth_distance limit $n