【问题标题】:Getting area from GPS coordinates从 GPS 坐标获取区域
【发布时间】:2018-04-05 07:41:46
【问题描述】:

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

问题是,我想将此方法与 GPS 坐标一起使用,并且我想以 m² 或 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 为经度)

【问题讨论】:

  • @AndyTurner 你确定它是重复的吗? “重复”大约是google-maps
  • 如果您想要以 m² 或 km² 为单位的结果,您首先必须将您的 GPS 坐标(可能是 lon/lat)转换为某个公制坐标参考系统。
  • 哦,你是对的,对不起。我会删除这个问题。顺便谢谢!
  • 我觉得这个问题还可以。
  • 还是重复的吗?

标签: java gps


【解决方案1】:

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

您可以使用方法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 英里代表平方英里......)

【讨论】:

  • 是的,自从你提到另一个问题以来,我一直在这样做,我目前正在用我的价值观进行测试
猜你喜欢
  • 2011-09-19
  • 1970-01-01
  • 2023-03-22
  • 2012-10-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多