如何计算一条线上的x个点数?

时间:2018-02-23 17:38:48

标签: android latitude-longitude polyline

我正在谷歌地图上绘制折线。给定起点和终点(纬度,经度)坐标我如何得到' 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;
    }
}

1 个答案:

答案 0 :(得分:1)

Google Maps polyline中的线段是测地线。在球形地球近似中,这是一个很大的圆。具有单个线段的折线(您的纬度/长坐标中的原点和目的地)使用投影渲染到2D地图上,但它仍然是测地线(大圆)。

GIS stack exchange有这个内插两个(纬度,经度)坐标来计算航路点的问题。答案建议使用GeographicLib, which has a java library,并提供JavaScript example。纬度/经度坐标中生成的航点是折线的输入。

最好在纬度/经度坐标系中执行插值,以避免投影或离散化时的放大误差。