我正在谷歌地图上绘制折线。给定起点和终点(纬度,经度)坐标我如何得到' x'那条线上的点数?
我尝试应用数学概念,例如线y = mx + c或甚至(x-x1)/(x1-x2)=(y-y1)/(y1-y2)的等式,但这些方法做了不行。世界并不平坦。查找纬度/经度值的线性线中所有点的公式是什么?有没有人对此有任何想法?我相信我必须应用这个等式:https://en.wikipedia.org/wiki/Mercator_projection
修改 有人建议尝试将lat / lng转换为点,然后进行数学计算,然后转换回lat / lng。这样做时似乎有很大的余量或错误。纬度是准确的,但经度是完全关闭的。 TILE_SIZE = 256,Google为Google地图返回的图块大小
public GoogleMapsProjection2() {
this._pixelOrigin = new PointF(TILE_SIZE / 2.0, TILE_SIZE / 2.0);
this._pixelsPerLonDegree = TILE_SIZE / 360.0;
this._pixelsPerLonRadian = TILE_SIZE / (2 * Math.PI);
}
public PointF fromLatLngToPoint(double lat, double lng, int zoom) {
PointF point = new PointF(0, 0);
point.x = _pixelOrigin.x + lng * _pixelsPerLonDegree;
// Truncating to 0.9999 effectively limits latitude to 89.189. This is
// about a third of a tile past the edge of the world tile.
double siny = bound(Math.sin(degreesToRadians(lat)), -0.9999, 0.9999);
point.y = _pixelOrigin.y + 0.5 * Math.log((1 + siny) / (1 - siny)) * -_pixelsPerLonRadian;
int numTiles = 1 << zoom;
point.x = point.x * numTiles;
point.y = point.y * numTiles;
return point;
}
public PointF fromPointToLatLng(PointF point, int zoom) {
int numTiles = 1 << zoom;
point.x = point.x / numTiles;
point.y = point.y / numTiles;
double lng = (point.x - _pixelOrigin.x) / _pixelsPerLonDegree;
double latRadians = (point.y - _pixelOrigin.y) / -_pixelsPerLonRadian;
double lat = radiansToDegrees(2 * Math.atan(Math.exp(latRadians)) - Math.PI / 2);
return new PointF(lat, lng);
}
public final class PointF {
public double x;
public double y;
public PointF(double x, double y) {
this.x = x;
this.y = y;
}
}
答案 0 :(得分:1)
Google Maps polyline中的线段是测地线。在球形地球近似中,这是一个很大的圆。具有单个线段的折线(您的纬度/长坐标中的原点和目的地)使用投影渲染到2D地图上,但它仍然是测地线(大圆)。
GIS stack exchange有这个内插两个(纬度,经度)坐标来计算航路点的问题。答案建议使用GeographicLib, which has a java library,并提供JavaScript example。纬度/经度坐标中生成的航点是折线的输入。
最好在纬度/经度坐标系中执行插值,以避免投影或离散化时的放大误差。