从GPS坐标获取区域

时间:2018-04-05 07:41:47

标签: java gps

所以,我有一个方法返回由其点定义的形状区域(以CCW或CW顺序给出,它并不重要)。我用一些形状对它进行了测试,它似乎正在起作用。

问题是,我想将这种方法与GPS坐标一起使用,我希望以平方米或km²的形式返回结果,但这绝对不会发生什么。事实上,当我使用这种坐标时,我甚至不知道结果是哪个单位。

所以问题是,如何将我的结果转换为m²或km²?我尝试了一些东西,但要么它不起作用,要么不准确。

如果你想检查一下,这是我的方法:

public static double getArea(List<Vector2D> points) {

    double firstSum = 0, secondSum = 0;

    for (int i = 0 ; i < points.size()-1 ; i++) {
        firstSum += points.get(i).x * points.get(i+1).y;
        secondSum += points.get(i).y * points.get(i+1).x;
    }
    firstSum += points.get( points.size()-1 ).x * points.get(0).y;
    secondSum += points.get( points.size()-1 ).y * points.get(0).x;

    return Math.abs((firstSum-secondSum)/2);

}

Vector2D是我用于积分的类,其中x为纬度,y为经度

1 个答案:

答案 0 :(得分:0)

问题是你没有考虑到地球的(近似)球形特性。首先,您需要考虑地球的半径 - 您可以在较小(或较大)的行星上拥有相同的纬度和经度列表,但半径会有所不同,因此面积也会不同

您可以使用in this question方法。将它转换为Java是非常简单的:

public static double CalculatePolygonArea(List<Vector2D> coordinates)
{
    double area = 0;

    if (coordinates.size() > 2)
    {
        for (int i = 0; i < coordinates.size()-1; i++)
        {
            Vector2D p1, p2;
            p1 = coordinates.get(i);
            p2 = coordinates.get(i + 1);
            area += Math.toRadians(p2.x - p1.x) * (2 + Math.sin(Math.toRadians(p1.y))
               + Math.sin(Math.toRadians(p2.y)));

        }
        area = area * R * R / 2;
    }

    return Math.abs(area);
}

(假设Vector2D.x是经度而Vector2D.y是纬度)。

R是地球的半径。使用您想要区域结果的单位中的值(例如,平方米为6_371_000米,平方公里为6_371千米,平方英里为3_959英里......)