gpt4 book ai didi

google-polyline - 折线编码在解码后得到错误的纬度/经度

转载 作者:行者123 更新时间:2023-12-03 22:39:21 25 4
gpt4 key购买 nike

我们正在使用谷歌的折线解码算法来解码我们的坐标。但在我们的例子中,大多数坐标在解码后都是错误的。我们还以更深的精度测试了该过程。

这是我们的代码,也是我们用来测试坐标错误的日志:

let coordinates = [ [lat, lng], [...], ...];
console.log(coordinates[13347]); // Output: [ 13.44668, 52.47429 ]
let encoded = Polyline.encode(coordinates);
let decoded = Polyline.decode(encoded);
console.log(decoded[13347]); // Output: [ 13.44671, 52.47445 ]
console.log(coordinates.length == decoded.length)// true

在这种情况下,距离是 20 米,这是很多。其他点的距离为 150 米甚至更长。

在我的坐标数组中大约有 250.000 个我们想要解码的坐标。

我是否遗漏了一些东西,所以解码/编码过程如此困难?

最佳答案

TL;博士
coordinates 的声明之后添加以下几行多变的:

coordinates = coordinates.map(
pair => { return [pair[0].toFixed(5), pair[1].toFixed(5)]; }
);

完整答案

看起来您正在处理浮点舍入错误。可能您使用的库对 Polyline encoding algorithm 的实现不正确.

在算法的描述中,我们读到算法生成的编码字符串使用固定精度数字(小数点后 5 位)存储连续坐标之间的差异。因此,将纬度和经度四舍五入到小数点后 5 位很重要 之前 计算差异。如果没有这一步,舍入误差可能会累积。在最坏的情况下,对于编码列表中的每个后续项目,错误可能会增加大约 0.000005 度。

该算法的官方实现并没有引入累积舍入误差。但是,在 NPM ( package polyline ) 中找到的实现给出了不正确的结果,表明数字的舍入无效。

请看下面的例子:

示例 1. 使用算法的官方实现对折线进行编码

(使用来自 Google Maps JavaScript API 的 google.maps.geometry.encoding.encodePath)

originalList = [];
for (var i = 0; i < 100; ++i)
originalList.push(
new google.maps.LatLng(6 * i / 1000000, 0)
);
// originalList looks like: [[0.000000,0],[0.000006,0],[0.000012,0],[0.000018,0], ..., [0.000594,0]];
// (but with LatLng objects instead of 2-element arrays)

console.log(originalList[99].lat()) // 0.000594

var encodedList = google.maps.geometry.encoding.encodePath(originalList)
var decodedList = google.maps.geometry.encoding.decodePath(encodedList)

console.log(decodedList[99].lat()) // 0.00059

示例 2. 使用 package polyline from NPM 编码多段线

let Polyline = require('polyline');

var originalList = [];
for (var i = 0; i < 100; ++i)
originalList.push(
[6 * i / 1000000, 0]
);
// again: originalList == [[0.000000,0],[0.000006,0],[0.000012,0],[0.000018,0], ..., [0.000594,0]];

console.log(originalList[99][0]) // 0.000594

var encodedList = Polyline.encode(originalList);
var decodedList = Polyline.decode(encodedList);

console.log(decodedList[99][0]) // 0.00099

无效结果 :值 0.000594 和 0.00099 相差超过 0.000005。

可能的修复

您使用的库在计算差异之前可能不会对坐标进行四舍五入。
例如,当两个连续点的纬度为 0.000000 时和 0.000006 ,区别是 0.000006并四舍五入为 0.00001给出 0.000004 的错误.
在将坐标传递给 Polyline.encode() 之前,您可能希望手动对坐标进行四舍五入。 ,例如。使用函数 .toFixed(5) :

let Polyline = require('polyline');

var originalList = [];
for (var i = 0; i < 100; ++i)
originalList.push(
[(6 * i / 1000000).toFixed(5), 0]
);
// before rounding: [[ 0.000000,0],[ 0.000006,0],[ 0.000012,0],[ 0.000018,0], ..., [ 0.000594,0]];
// after rounding: [['0.00000',0],['0.00001',0],['0.00001',0],['0.00002',0], ..., ['0.00059',0]];

console.log(originalList[99][0]) // 0.00059

var encodedList = Polyline.encode(originalList);
var decodedList = Polyline.decode(encodedList);

console.log(decodedList[99][0]) // 0.00059

关于google-polyline - 折线编码在解码后得到错误的纬度/经度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39247286/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com