在 Java 中平滑经度纬度点列表
Posted
技术标签:
【中文标题】在 Java 中平滑经度纬度点列表【英文标题】:Smoothing a list of Longitude Latitude Points in Java 【发布时间】:2018-09-07 05:44:03 【问题描述】:我试图弄清楚如何平滑经度纬度点的大列表我目前从点到点画一条线并在其间插入每个点但是当我改变方向时它会显示一个急转弯我想平滑这是一条整齐的曲线,但我不知道转弯的确切位置,所以我需要一个算法来平滑点的平均值。
我已经对此进行了一些研究,并查看了贝塞尔曲线,但没有像我预期的那样工作,我采用了我在这里找到的实现。 http://sourcecodesforfree.blogspot.co.uk/2013/05/33-bezier-curve.html
我真的找不到太多关于贝塞尔曲线算法如何工作的文档,或者至少没有完全理解它是如何工作的。
【问题讨论】:
请从此链接en.wikipedia.org/wiki/Interpolation#Linear_interpolation 找到一个算法,或者您可以使用 dt = (t - t0) / (t1 - t0) // t0 和 t1 px = p0 之间经过的时间分数。 x + ( dt * (p1.x - p0.x) ) // 点的 x 是 x0 和 x1 之间的相同分数 py = p0.y + ( dt * (p1.y - p0.y) ) // 同上, 是的。 您是在寻求 Bézier 曲线的替代方案,因为它们不能满足您的需求(为什么不呢?),还是需要帮助让您的 Bézier 代码工作?如果应该涵盖两者,这个问题就太宽泛了。 @ArndtJonasson 两者中的一点我真的无法判断我的贝塞尔代码是否正常工作,因为我得到了一些线条平滑但没有足够接近我需要的地方,所以也许另一种方法会有所帮助 【参考方案1】:function bspline(lats, lons)
var i, t, ax, ay, bx, by, cx, cy, dx, dy, lat, lon, points;
points = [];
// For every point
for (i = 2; i < lats.length - 2; i++)
for (t = 0; t < 1; t += 0.2)
ax = (-lats[i - 2] + 3 * lats[i - 1] - 3 * lats[i] + lats[i + 1]) / 6;
ay = (-lons[i - 2] + 3 * lons[i - 1] - 3 * lons[i] + lons[i + 1]) / 6;
bx = (lats[i - 2] - 2 * lats[i - 1] + lats[i]) / 2;
by = (lons[i - 2] - 2 * lons[i - 1] + lons[i]) / 2;
cx = (-lats[i - 2] + lats[i]) / 2;
cy = (-lons[i - 2] + lons[i]) / 2;
dx = (lats[i - 2] + 4 * lats[i - 1] + lats[i]) / 6;
dy = (lons[i - 2] + 4 * lons[i - 1] + lons[i]) / 6;
lat = ax * Math.pow(t + 0.1, 3) + bx * Math.pow(t + 0.1, 2) + cx * (t + 0.1) + dx;
lon = ay * Math.pow(t + 0.1, 3) + by * Math.pow(t + 0.1, 2) + cy * (t + 0.1) + dy;
points.push(new google.maps.LatLng(lat, lon));
return points;
javascript 中的上述代码其他逻辑相同,只需将位变量和方法更改为 JAVA,然后检查 要么 请从此链接 en.wikipedia.org/wiki/Interpolation#Linear_interpolation 找到算法
【讨论】:
刚刚用 Java 实现了这个,结果和以前一样,边缘仍然很锋利。以上是关于在 Java 中平滑经度纬度点列表的主要内容,如果未能解决你的问题,请参考以下文章
给定一个纬度/经度,从 c# 中的经度/经度列表中找到最近的经度/经度对