如何按给定点的距离对行进行排序,mysql?

时间:2010-06-21 16:25:34

标签: mysql geospatial distance spatial

我正试图从我的桌子上获得100分,并且到达给定点的距离最短。

我正在使用

SELECT *, GLENGTH(
            LINESTRINGFROMWKB(
              LINESTRING(
                ASBINARY(
                  POINTFROMTEXT("POINT(40.4495 -79.988)")
                ),
                ASBINARY(pt)
              )
            )
          )
 AS `distance` FROM `ip_group_city` ORDER BY distance LIMIT 100

(是的,这很痛苦。我只是用谷歌搜索它。我不知道如何正确测量MySQL中的距离)

执行需要很长时间。 EXPLAIN表示没有possible_keys

我在SPATIAL列上创建了pt索引:

CREATE SPATIAL INDEX sp_index ON  ip_group_city (pt);

虽然我真的不知道如何正确使用它。你能帮我吗?

3 个答案:

答案 0 :(得分:6)

因为您没有WHERE子句因此没有受影响的索引。我认为你应该通过使用MBR_(MySQL 5.0或更高版本)或ST_函数(MySQL 5.6或更高版本)添加来改进此查询。 类似的东西:

SELECT *, GLENGTH(
            LINESTRINGFROMWKB(
              LINESTRING(
                ASBINARY(
                  POINTFROMTEXT("POINT(40.4495 -79.988)")
                ),
                ASBINARY(pt)
              )
            )
          )
 AS `distance` 
FROM `ip_group_city` 
WHERE
MBRWithin(
        pt, -- your point
        GeomFromText('Polygon( -- your line (in polygon format) from pt to target point 
                        (
                            #{bound.ne.lat} #{bound.ne.lng}, --North East Lat - North East Long
                            #{bound.ne.lat} #{bound.sw.lng}, --North East Lat - South West Long
                            #{bound.sw.lat} #{bound.sw.lng}, --
                            #{bound.sw.lat} #{bound.ne.lng},
                            #{bound.ne.lat} #{bound.ne.lng}
                        )
                    )')
      )
ORDER BY distance LIMIT 100

答案 1 :(得分:0)

我过去曾使用great circle equation进行这些类型的计算。我不确定性能如何比较,但可能值得尝试和比较。

Here是一个很好的SO帖子,它将讨论如何在MySQL中完成它。

答案 2 :(得分:-1)