亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

mysql計算返回位置的距離

mysql計算返回位置的距離

慕娘9325324 2022-06-22 18:52:11
這不是重復的: Find distance between two points using latitude and longitude in mysql我嘗試了查詢,但它不起作用,我得到空數據集和 0 作為答案。查看答案,這就是解決方案,我不知道為什么這個問題被標記為來自 Shadow 的重復我有一個具有以下結構的表:table: distanceid int(10) primary keylat float,lon float,time timestamp我有一個 android 應用程序,可以 ping 我的服務器并在每次更改位置時添加一條記錄。例如id:1, lat:40.753979, lon:-111.881721, time = 1571004620id:2, lat:40.753979, lon:-111.883721, time = 1571004630id: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.004000的經度距離問題:如果我添加:id:4, lat:40.753979, lon:-111.881721, time = 1571004650那么我應該得到:0.008000但我得到 0 因為位置 1 與位置 4 相同
查看完整描述

1 回答

?
慕容森

TA貢獻1853條經驗 獲得超18個贊

您可以利用自 5.7 起提供的 MySQL 空間支持在數據庫中執行整個計算。函數ST_Distance_Sphere()可用于計算距離。


您實際上需要距離的累積總和(這需要窗口函數,自 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

DB Fiddle 上的演示:


| id  | time       | cumulative_distance |

| --- | ---------- | ------------------- |

| 1   | 1571004620 | 0                   |

| 2   | 1571004630 | 168.37177423236415  |

| 3   | 1571004640 | 336.7435484657999   |

| 4   | 1571004650 | 673.4870969097663   |

在早期版本的 MySQL 中,您需要模擬窗口函數:


LAG()可以替換為LEFT JOIN帶有條件的self-和條件NOT EXISTS中的相關子查詢ON


變量可以模擬累積SUM


詢問:


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


查看完整回答
反對 回復 2022-06-22
  • 1 回答
  • 0 關注
  • 129 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號