Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python mysql计算返回位置的距离_Python_Mysql_Mysql 5.7_Mysql Spatial - Fatal编程技术网

Python mysql计算返回位置的距离

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

这不是以下内容的副本:

我尝试了该查询,但它不起作用,我得到了空数据集和0作为 答案是

看答案,这就是答案,我不知道为什么这个问题被标记为从阴影复制

我有一个具有以下结构的表:

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秒作为第二个答案因为我不知道你在运行什么查询,我无法评论你的尝试出了什么问题。这就是为什么你应该在你的问题中包含这些尝试的确切代码