使用从笛卡尔空间和世界文件生成的纬度和经度计算多边形区域

Hea*_*ley 5 geocoding map area latitude-longitude

给定一系列GPS坐标对,我需要计算多边形的面积(n-gon).这相对较小(不大于50,000平方英尺).通过对来自世界文件的数据应用仿射变换来创建地理编码.

我试图通过将地理编码转换为笛卡尔坐标来使用两步法:

double xPos = (lon-lonAnchor)*( Math.toRadians( 6378137 ) )*Math.cos( latAnchor );
double yPos = (lat-latAnchor)*( Math.toRadians( 6378137 ) );
Run Code Online (Sandbox Code Playgroud)

然后我使用叉积计算来确定面积.

问题是结果的准确性有点偏差(约1%).我有什么可以改进的吗?

谢谢.

Ris*_*hak 8

我在互联网上检查了各种多边形面积公式(或代码),但没有找到任何好的或易于实现的。

现在我已经编写了代码片段来计算在地球表面绘制的多边形的面积。多边形可以有 n 个顶点,每个顶点都有自己的纬度经度。

几个要点

  1. 此函数的数组输入将具有“n + 1”个元素。最后一个元素将具有与第一个元素相同的值。
  2. 我已经编写了非常基本的 C# 代码,以便人们也可以将其改写为其他语言。
  3. 6378137 是以米为单位的地球半径值。
  4. 输出面积将以平方米为单位

    private static double CalculatePolygonArea(IList<MapPoint> coordinates)
    {
        double area = 0;
    
        if (coordinates.Count > 2)
        {
            for (var i = 0; i < coordinates.Count - 1; i++)
            {
                MapPoint p1 = coordinates[i];
                MapPoint p2 = coordinates[i + 1];
                area += ConvertToRadian(p2.Longitude - p1.Longitude) * (2 + Math.Sin(ConvertToRadian(p1.Latitude)) + Math.Sin(ConvertToRadian(p2.Latitude)));
            }
    
            area = area * 6378137 * 6378137 / 2;
        }
    
        return Math.Abs(area);
    }
    
    private static double ConvertToRadian(double input)
    {
        return input * Math.PI / 180;
    }
    
    Run Code Online (Sandbox Code Playgroud)


Ron*_*lic 1

由于您的近似值,1% 的误差似乎有点高。您是与实际测量值还是理想计算值进行比较?请记住,GPS 也可能存在误差。

如果你想要一个更准确的方法来做到这一点,这个问题有一个很好的答案。如果您想要更快的方法,您可以使用 WGS84 大地水准面而不是参考球体来转换为笛卡尔坐标 (ECEF)。这是该转换的wiki 链接。