Android - 如何使用Helmert Transformation在CUSTOM MAP上将gps转换为屏幕XY

时间:2013-03-19 22:47:03

标签: android gps customization

我已经构建了一个活动,该活动采用我用于地图的自定义图像,然后知道左上角和右下角的gps我在地图顶部绘制了一个gps。它工作得很好,但我想提高准确性。我知道它是关闭的,因为当我记录设备位置并将其插入谷歌地图时,它实际上比我在自定义地图上表示的更准确。

所以......因为我有地图的左上角和右下角gps并将它们映射到相应的像素坐标,我如何使用Helmert变换精确地将设备gps精确地绘制成像素。

编辑:

我目前正在使用此功能将设备的gps绘制到屏幕上。

public double getCurrentPixelY(Location upperLeft, Location lowerRight, Location current) {
    double hypotenuse = upperLeft.distanceTo(current);
    double bearing = upperLeft.bearingTo(current);
    double currentDistanceY = Math.cos(bearing * Math.PI / OneEightyDeg) * hypotenuse;
    //                           "percentage to mark the position"
    double totalHypotenuse = upperLeft.distanceTo(lowerRight);
    double totalDistanceY = totalHypotenuse * Math.cos(upperLeft.bearingTo(lowerRight) * Math.PI / OneEightyDeg);
    double currentPixelY = currentDistanceY / totalDistanceY * ImageSizeH;

    return currentPixelY;
}

public double getCurrentPixelX(Location upperLeft, Location lowerRight, Location current) {
    double hypotenuse = upperLeft.distanceTo(current);
    double bearing = upperLeft.bearingTo(current);
    double currentDistanceX = Math.sin(bearing * Math.PI / OneEightyDeg) * hypotenuse;
    //                           "percentage to mark the position"
    double totalHypotenuse = upperLeft.distanceTo(lowerRight);
    double totalDistanceX = totalHypotenuse * Math.sin(upperLeft.bearingTo(lowerRight) * Math.PI / OneEightyDeg);
    double currentPixelX = currentDistanceX / totalDistanceX * ImageSizeW;

    return currentPixelX;
}

我知道我需要在某处进行调整,但是看看helmert转换,我无法用现有的代码开始实现它。

编辑:

在网上查看更多内容后,我可以看到使用大圈公式可能有所帮助。下面是我正在考虑实施的链接

http://introcs.cs.princeton.edu/java/12types/GreatCircle.java.html

1 个答案:

答案 0 :(得分:1)

以下是计算helmert系数的源代码:

http://helmparms3d.sourceforge.net/

也许有一种更简单的方法(对于小地图也有所谓的2d头盔变换,如你的图片)

使用该代码得到helmert系数,这些系数是3x3矩阵。所以你需要能够将向量与矩阵相乘的代码 3d图形例程具有这样的矩阵乘法。