首页 > 解决方案 > 如何找到沿折线Mysql的最近距离

问题描述

我正在构建一个拼车应用程序。

该应用程序具有搜索驱动程序的功能。

司机(工作中心的员工)可以从应用程序中选择前往目的地的路线。

同样属于工作中心并且在路线内的乘客可以加入他们的行程。

这是在用户在应用程序中输入目的地后通过搜索功能完成的。

这是游乐设施的表结构

id  driver_id path
 1     1       BLOB 

driver id是驱动程序的ID,path是从驱动程序源到目的地的行字符串。为简单起见,我不会包含其他字段

我的任务是找到所有经过我的位置且匹配率达到 85% 或以上的司机

在查看了 Mysql spatial Types https://dev.mysql.com/doc/refman/8.0/en/spatial-types.html之后,我编写了一个自己的查询,看起来部分还可以,请参阅下面的查询

set @g1=ST_GeomFromText('LINESTRING(10.013059 76.363075,10.0168011
 76.34592529999999,10.0161831
 76.34368020000001,10.0118 76.3218,9.99848 76.311936,9.9771685 76.2773228
)');
SET @g2 = ST_GeomFromText('Point(10.0141713 76.33320359999999
)');
 
 SELECT MBRCovers(@g1,@g2)

工作正常Point(10.0141713 76.33320359999999)介于Point(10.013059 76.363075) and point(9.9771685 76.2773228)

但这行不通

 set @g1=ST_GeomFromText('LINESTRING(10.013059 76.363075,10.0168011
 76.34592529999999,10.0161831
 76.34368020000001,10.0118 76.3218,9.99848 76.311936,9.9771685 76.2773228
)');
SET @g2 = ST_GeomFromText('Point(10.0185876 76.3439941
)');
 
 SELECT MBRCovers(@g1,@g2)

Point(10.0185876 76.3439941)也在之间Point(10.013059 76.363075) and point(9.9771685 76.2773228)

我想我需要为上面的内容添加一些覆盖距离point才能返回我不知道的真值。

我预计骑行匹配率超过 85%。

我的意思是用户不必属于驱动程序选择的线串,允许小公差。

我正在使用 mysql 版本 8。

请帮忙。

标签: mysqlmysql-spatial

解决方案


set @g1=ST_GeomFromText('LINESTRING(10.013059  76.363075,
                                    10.0168011 76.34592529999999,
                                    10.0161831 76.34368020000001,
                                    10.0118    76.3218,
                                    9.99848    76.311936,
                                    9.9771685  76.2773228)', 4326);
SET @g2 = ST_GeomFromText('Point(10.0141713 76.33320359999999)', 4326);
SELECT ST_Distance(@g1, @g2, 'metre');
| ST_Distance(@g1, @g2, '米') |
| -----------------------------------------: |
| 9.402168864952756 |
set @g1=ST_GeomFromText('LINESTRING(10.013059  76.363075,
                                    10.0168011 76.34592529999999,
                                    10.0161831 76.34368020000001,
                                    10.0118    76.3218,
                                    9.99848    76.311936,
                                    9.9771685  76.2773228)', 4326);
SET @g2 = ST_GeomFromText('Point(10.0185876 76.3439941)', 4326);
SELECT ST_Distance(@g1, @g2, 'metre');
| ST_Distance(@g1, @g2, '米') |
| -----------------------------------------: |
| 247.0472114965831 |

db<>在这里摆弄


推荐阅读