用点表从MySQL找到最近的点

时间:2016-03-16 04:37:06

标签: mysql algorithm geolocation location query-builder

我有这样的DB Schema(来自this tutorial by Google) -

DB Schema

因此,图表中的实际点就像这样 -

Physical Location

我想要的是在距离排序的点( point_id )附近找到点

  

(x,y)的位置是(point_xpoint_y)在数据库中

我想用MySQL解决它,因为我的数据库已经在MySQL中了。

更新 -

找到2点的距离就像这样容易 -

Finding distance

我想根据MySQL的距离进行排序。

重新 -

为了消除这些混淆,我想要稍后在圆圈内的点。但现在我只想找到排序点。

所以你可以忽略这些圈子。

我不知道该怎么做,有人可以帮忙吗?

2 个答案:

答案 0 :(得分:6)

我找到了比@ 1000111解决方案更好的解决方案。

MySQL中有自定义数据库类型,可以提供更好的性能。

OpenGIS in MySQL非常适合这一点。

功能 here

this StackOverflow question 中提供了一个说明性的定义。

我的解决方案是这样的 -

数据库表 -

CREATE TABLE geoTable
(
    id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(30) NOT NULL,
    geoPoint POINT NOT NULL,
    SPATIAL INDEX(geoPoint)
) ENGINE=MyISAM;


INSERT INTO geoTable (name, geoPoint)
VALUES
  ( "A", GeomFromText('POINT(0.1 -1.01)') ),
  ( "B", ST_GeomFromText('POINT(56.31 2.81)') ),
  ( "C", ST_GeomFromText('POINT(11.1 1.176)') ),
  ( "ui", ST_GeomFromText('POINT(9.1 2.1)') );

SQL查询 -

SELECT
  id,
  name,
  X(geoPoint) AS "latitude",
  Y(geoPoint) AS "longitude",
  (
    GLength(
      LineStringFromWKB(
        LineString(
          geoPoint, 
          GeomFromText('POINT(51.5177 -0.0968)')
        )
      )
    )
  )
  AS distance
FROM geoTable
  ORDER BY distance ASC;

示例SQL Fiddle给出了here

查看执行时间 -

enter image description here

150次入场,只有13ms。

答案 1 :(得分:1)

请尝试此查询[直接进场]:

假设您要查找具有point_id = 5

的点的最近20个点

SET @givent_point_id := 5;

SELECT 
P1.point_id,
P1.point_name,
P1.point_x,
P1.point_y,
(POW(ABS((P2.point_x - P1.point_x)),2) + POW(ABS((P2.point_y - P1.point_y)),2)) AS sqr_distance
FROM Point P1,
    (SELECT point_x,point_y FROM Point WHERE point_id = @givent_point_id) P2
WHERE P1.point_id <> @givent_point_id
ORDER BY sqr_distance
LIMIT 20;

Demo Here

更多:您可以查看MySQL SPATIAL DATATYPE

MySQL空间索引使用R-tree作为专门为空间访问方法设计的数据结构。

  

R-trees是用于空间访问方法的树数据结构,   即,用于索引诸如地理的多维信息   坐标,矩形或多边形。