计算大量 GPS 坐标之间的成对路由距离

Posted

技术标签:

【中文标题】计算大量 GPS 坐标之间的成对路由距离【英文标题】:Calculating pairwise routing distances between a large number of GPS coordinates 【发布时间】:2018-08-08 08:17:48 【问题描述】:

我有一个 Web 应用程序,其中每个用户都有 GPS 坐标 (SqlGeography)。到目前为止,我使用Distance 函数将两个 GPS 坐标之间的距离计算为欧几里得距离。

一些用户要求我用更真实的距离替换近似距离(根据航线距离)。我正在考虑使用特定的路由 API(例如,来自 Google、Here 或 Azure)来获得更真实的距离,例如开车时。

目前,我有大约 5000 个不同的 GPS 坐标,我想计算并存储所有这些对的成对距离。这将导致 5000 * 5000 个查询/请求,这是非常昂贵的。有没有什么办法可以通过我没有想到的技巧来降低二次复杂度?

【问题讨论】:

【参考方案1】:

一些 API 可以选择在路线的起点和终点之间添加航路点/停靠点(即Sygic web API。

也许 Google 和 Co. 会做类似的事情。

响应包括legs 属性,表示从起点到航点1、wapoint1 到航点N、航点N 到航点结束...等的路线/持续时间。


    "routes": [
        
            "route": "oupjIaw|@^ErCUPELEf@@`A[nAjGlBnFfBtERl@~DdNdA~DdBjG|BhKfArELbAd@`EJdFKxF?rBVfKF~BFjH@jEChJC`DMtLCzEApB@bIRdOZlGdAtLr@tErAxGnIj\\fBnIrBxMr@|Gh@fHf@jJPvFDvAHxBBf@X|EA`Br@zLd@|Dz@hF`AzElBhIvClMnA|Ib@dGd@bKb@rYBbBJ|CDxGFjEx@tm@N`ID|CF`PStMI|B[`Hi@vIcA`KkC|PcBtIoBlIaF`RgN~c@oGpTqGrWaFtWyEd\\mAlKcBpQkBbX@~PcAlYG`CClAEdBAj@KdEe@z`@AlBCjDC|XJ~WTrTh@rWZ`Pf@tUTfK`@fQ|@d]v@|O|BpYhBpOrE`\\bC`RDZf@fEvBlULtBZfFJhBNxCBZn@xQ\\~TZb`@JxQ@jNO~PeAfa@mDzdAo@jOsArSmDx_@eAnKAlRs@zNg@rRChUB|ENzKZnR~B~tAvBthAv@nUtAdWbCl\\p[zbDrFhh@nDvZdB`Mb@~C|@xGrJ~n@fIzb@pBlJv@lDzAxGrDtOzEnQ|Rdr@|FzU|ArH|DfU~ArLx@xG^dDtBbQb@nDhAtIFf@\\`CZvBDXbAbHDXbBvKv@`E|BfJd@~BVlAJh@tA~Gb@tB\\~AtDbPrB~IxB~IzB`JvCdLzAdGjAvELb@Nn@|@xDR~@r@jDzAjI`@hCT~AhDbVF\\fAjIlBbOrAlKjAtIr@lFz@nG@JJv@v@`G`@|Cd@jDDhAJp@D^TzB@ZBpCStEYfB_@pAeAlCINo@~@oBbBoCrAaFfB_H`BsGhACh@gMrBBd@oAR_APyOlCwAVEdASF]JcErA_BXe@G]w@EsBNu@l@yBZe@j@]f@GjBTx@JXF@kApAc]ImEO_AWq@uAkAgAe@eCyA_CoDm@s@cA[eCM?mIYiBsAcEy@uBcAA]MeAGu@?e@VsEVw@Ho@JiBHwAEa@SaAKy@Cs@PuAlAc@r@sChECjFkA`DAbGIj@y@bEW`Ai@rAw@tA",
            "eta": 1531834797,
            "duration": 
                "value": 1713,
                "text": "28 minutes 33 seconds"
            ,
            "distance": 
                "value": 36430,
                "text": "36.43 km"
            ,
            "legs": [
                
                    "distance": 
                        "value": 36430,
                        "text": "36.43 km"
                    ,
                    "duration": 
                        "value": 1713,
                        "text": "28 minutes 33 seconds"
                    ,
                    "start_location": 
                        "latitude": 54.32168,
                        "longitude": 10.12193
                    ,
                    "end_location": 
                        "latitude": 54.30731,
                        "longitude": 9.66195
                    ,
                    "route": "oupjIaw|@^ErCUPELEf@@`A[nAjGlBnFfBtERl@~DdNdA~DdBjG|BhKfArELbAd@`EJdFKxF?rBVfKF~BFjH@jEChJC`DMtLCzEApB@bIRdOZlGdAtLr@tErAxGnIj\\fBnIrBxMr@|Gh@fHf@jJPvFDvAHxBBf@X|EA`Br@zLd@|Dz@hF`AzElBhIvClMnA|Ib@dGd@bKb@rYBbBJ|CDxGFjEx@tm@N`ID|CF`PStMI|B[`Hi@vIcA`KkC|PcBtIoBlIaF`RgN~c@oGpTqGrWaFtWyEd\\mAlKcBpQkBbX@~PcAlYG`CClAEdBAj@KdEe@z`@AlBCjDC|XJ~WTrTh@rWZ`Pf@tUTfK`@fQ|@d]v@|O|BpYhBpOrE`\\bC`RDZf@fEvBlULtBZfFJhBNxCBZn@xQ\\~TZb`@JxQ@jNO~PeAfa@mDzdAo@jOsArSmDx_@eAnKAlRs@zNg@rRChUB|ENzKZnR~B~tAvBthAv@nUtAdWbCl\\p[zbDrFhh@nDvZdB`Mb@~C|@xGrJ~n@fIzb@pBlJv@lDzAxGrDtOzEnQ|Rdr@|FzU|ArH|DfU~ArLx@xG^dDtBbQb@nDhAtIFf@\\`CZvBDXbAbHDXbBvKv@`E|BfJd@~BVlAJh@tA~Gb@tB\\~AtDbPrB~IxB~IzB`JvCdLzAdGjAvELb@Nn@|@xDR~@r@jDzAjI`@hCT~AhDbVF\\fAjIlBbOrAlKjAtIr@lFz@nG@JJv@v@`G`@|Cd@jDDhAJp@D^TzB@ZBpCStEYfB_@pAeAlCINo@~@oBbBoCrAaFfB_H`BsGhACh@gMrBBd@oAR_APyOlCwAVEdASF]JcErA_BXe@G]w@EsBNu@l@yBZe@j@]f@GjBTx@JXF@kApAc]ImEO_AWq@uAkAgAe@eCyA_CoDm@s@cA[eCM?mIYiBsAcEy@uBcAA]MeAGu@?e@VsEVw@Ho@JiBHwAEa@SaAKy@Cs@PuAlAc@r@sChECjFkA`DAbGIj@y@bEW`Ai@rAw@tA",
                    "eta": 1531834797
                
            ]
        
    ],
    "status": "OK",
    "copyright": "© 2018 Sygic a.s."

【讨论】:

以上是关于计算大量 GPS 坐标之间的成对路由距离的主要内容,如果未能解决你的问题,请参考以下文章

在 MATLAB 中有效计算加权距离

评估TensorFlow中多维输入之间的成对欧氏距离

数据框列中的字符串列表行之间的成对距离

使用 numpy 或 cython 进行高效的成对 DTW 计算

python中最快的成对距离度量

NumPy之计算两个矩阵的成对平方欧氏距离