Python mysql计算返回位置的距离
这不是以下内容的副本: 我尝试了该查询,但它不起作用,我得到了空数据集和0作为 答案是 看答案,这就是答案,我不知道为什么这个问题被标记为从阴影复制 我有一个具有以下结构的表:Python mysql计算返回位置的距离,python,mysql,mysql-5.7,mysql-spatial,Python,Mysql,Mysql 5.7,Mysql Spatial,这不是以下内容的副本: 我尝试了该查询,但它不起作用,我得到了空数据集和0作为 答案是 看答案,这就是答案,我不知道为什么这个问题被标记为从阴影复制 我有一个具有以下结构的表: table: distance id int(10) primary key lat float, lon float, time timestamp 我有一个android应用程序,它可以ping我的服务器,并在每次更改位置时添加一条记录 比如说 id:1, lat:40.753979, lon:-111.8817
table: distance
id int(10) primary key
lat float,
lon float,
time timestamp
我有一个android应用程序,它可以ping我的服务器,并在每次更改位置时添加一条记录
比如说
id:1, lat:40.753979, lon:-111.881721, time = 1571004620
id:2, lat:40.753979, lon:-111.883721, time = 1571004630
id:3, lat:40.753979, lon:-111.885721, time = 1571004640
如果我朝一个方向走,我可以计算总距离:
/* in my python script*/
startLat,startLon = select lat,lon from distance where time >= 1571004620 order by time limit 1;
endLat,endLon = select lat,lon from distance where time <= 1571004640 order by time desc limit limit 1;
那么我应该得到:0.008000
但是我得到了0,因为位置1与位置4相同,您可以利用MySQL空间支持,从5.7开始就可以在数据库中执行整个计算。函数可用于计算距离 实际上,您需要一个累积的距离总和,该距离是从MySQL 8.0开始提供的窗口函数所需的距离 考虑:
SELECT
id,
time,
SUM(
CASE WHEN lag_lat IS NULL
THEN 0
ELSE ST_Distance_Sphere(point(lag_lon, lag_lat), point(lon, lat))
END
) OVER (ORDER BY time) cumulative_distance
FROM (
SELECT
d.*,
LAG(lat) OVER(ORDER BY time) lag_lat,
LAG(lon) OVER(ORDER BY time) lag_lon
FROM distance d
) x
:
在MySQL的早期版本中,您需要模拟窗口功能:
LAG可以替换为具有NOT EXISTS条件的自左联接和ON条件中的相关子查询
变量可以模拟累积和
查询:
SELECT
id,
time,
@running_distance := @running_distance + CASE
WHEN lag_lat IS NULL THEN 0
ELSE ST_Distance_Sphere(point(lag_lon, lag_lat), point(lon, lat))
END running_distance
FROM (
SELECT
d.id,
d.time,
d.lat,
d.lon,
d_lag.lat lag_lat,
d_lag.lon lag_lon
FROM distance d
LEFT JOIN distance d_lag
ON d_lag.time < d.time
AND NOT EXISTS (
SELECT 1
FROM distance d1
WHERE d1.time < d.time AND d1.time > d_lag.time
)
ORDER BY d.time
) x
CROSS JOIN (SELECT @running_distance := 0) y
:与上述结果相同。您可以利用MySQL spatial支持,从5.7开始提供,在数据库中执行整个计算。函数可用于计算距离 实际上,您需要一个累积的距离总和,该距离是从MySQL 8.0开始提供的窗口函数所需的距离 考虑:
SELECT
id,
time,
SUM(
CASE WHEN lag_lat IS NULL
THEN 0
ELSE ST_Distance_Sphere(point(lag_lon, lag_lat), point(lon, lat))
END
) OVER (ORDER BY time) cumulative_distance
FROM (
SELECT
d.*,
LAG(lat) OVER(ORDER BY time) lag_lat,
LAG(lon) OVER(ORDER BY time) lag_lon
FROM distance d
) x
:
在MySQL的早期版本中,您需要模拟窗口功能:
LAG可以替换为具有NOT EXISTS条件的自左联接和ON条件中的相关子查询
变量可以模拟累积和
查询:
SELECT
id,
time,
@running_distance := @running_distance + CASE
WHEN lag_lat IS NULL THEN 0
ELSE ST_Distance_Sphere(point(lag_lon, lag_lat), point(lon, lat))
END running_distance
FROM (
SELECT
d.id,
d.time,
d.lat,
d.lon,
d_lag.lat lag_lat,
d_lag.lon lag_lon
FROM distance d
LEFT JOIN distance d_lag
ON d_lag.time < d.time
AND NOT EXISTS (
SELECT 1
FROM distance d1
WHERE d1.time < d.time AND d1.time > d_lag.time
)
ORDER BY d.time
) x
CROSS JOIN (SELECT @running_distance := 0) y
:与上面的结果相同。MySQL服务器版本,以获取正确的语法使用near'ORDER BY time您使用的是哪个版本的MySQL?我提到这使用了窗口功能,仅在8.0版本可用。我使用的版本是:5.7.27,我无法升级到v8@yenk:我用MySQL<8.0的解决方案更新了我的答案。它确保当前记录和加入的记录之间没有记录。换言之,它确保我们使用的是立即出现的record.MySQL服务器版本,以便使用near“ORDER BY time”的正确语法您使用的是哪个版本的MySQL?我提到这使用了窗口功能,仅在8.0版本可用。我使用的版本是:5.7.27,我无法升级到v8@yenk:我用MySQL<8.0的解决方案更新了我的答案。它确保当前记录和加入的记录之间没有记录。换言之,它确保我们加入到即时之前的记录中。考虑到您所说的问题的答案不重复确实有效,您确实应该解释您尝试了什么,以及您遇到了什么错误消息或意外行为。我运行了查询,但它没有返回预期结果,它适用于不退换货position@Shadow我得到:空集0.00秒作为第一个答案,我得到0秒作为第二个答案因为我不知道你在运行什么查询,我无法评论你的尝试出了什么问题。这就是为什么你应该在你的问题中包含这些尝试和确切的代码。考虑到你所说的问题的答案不重复,可能会出现重复,您确实应该解释您尝试了什么,以及您遇到了什么错误消息或意外行为。我运行了查询,但它没有返回预期结果,它适用于不返回position@Shadow我得到:空集0.00秒作为第一个答案,我得到0秒作为第二个答案因为我不知道你在运行什么查询,我无法评论你的尝试出了什么问题。这就是为什么你应该在你的问题中包含这些尝试的确切代码