用点表从MySQL找到最近的点

Abr*_*hin 6 mysql algorithm location geolocation query-builder

我有这样一个DB Schema(来自Google的这个教程) -

DB Schema

所以图中的实际点就像这样 -

物理位置

我想要的是找到靠近距离排序的给定点(by point_id)点附近的点

点的位置(x,y)是(point_x,point_y)在DB中

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


最新情况:

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

寻找距离

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


回覆-

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

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


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

Abr*_*hin 8

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

MySQL中有自定义数据库类型用于此类数据,可提供更好的性能.

MySQL中的OpenGIS非常适合这种情况.

这里给出功能.

StackOverflow问题给出了一个说明性的定义.

我的解决方案是这样的 -

数据库表 -

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)') );
Run Code Online (Sandbox Code Playgroud)

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;
Run Code Online (Sandbox Code Playgroud)

这里给出一个示例SQL Fiddle .

查看执行时间 -

在此输入图像描述

150次入场,仅13ms.