使用UTM坐标计算面积的精确方法

4
我有一组纬度/经度坐标,想要用它们来计算一个多边形的面积。在许多情况下我可以得到精确结果,但是当多边形变大时,出现误差的可能性就越高。
首先,我使用http://www.ibm.com/developerworks/java/library/j-coordconvert/将这些坐标转换为UTM。
然后,我使用http://www.mathopenref.com/coordpolygonarea2.html来计算UTM坐标的面积。
private Double polygonArea(int[] x, int[] y) {      
    Double area = 0.0;
    int j = x.length-1;
    for(int i = 0; i < x.length; i++) {
        area = area + (x[j]+x[i]) * (y[j]-y[i]);
        j = i;
    }
    area = area/2;
    if (area < 0)
        area = area * -1;
    return area;
}

我将把这些区域与我输入到Microsoft SQL server和ArcGIS中的相同坐标进行比较,但似乎并不总是完全匹配。有人知道比这更精确的方法吗?
提前感谢。
编辑1:
谢谢您的评论。 以下是我获取面积的代码(CoordinateConversion代码在IBM链接中列出):
private Map<Integer, GeoPoint> vertices;

private Double getArea() {
    List<Integer> xpoints = new ArrayList<Integer>();
    List<Integer> ypoints = new ArrayList<Integer>();
    CoordinateConversion cc = new CoordinateConversion();
    for(Entry<Integer, GeoPoint> itm : vertices.entrySet()) {
        GeoPoint pnt = itm.getValue();
        String temp = cc.latLon2MGRUTM(pnt.getLatitudeE6()/1E6, pnt.getLongitudeE6()/1E6);
        // Example return from CC: 02CNR0634657742
        String easting = temp.substring(5, 10);
        String northing = temp.substring(10, 15);
        xpoints.add(Integer.parseInt(easting));
        ypoints.add(Integer.parseInt(northing));
    }

    int[] x = toIntArray(xpoints);
    int[] y = toIntArray(ypoints); 
    return polygonArea(x,y);
}

这是一个例子列表:

44.80016800 -106.40808100
44.80016800 -106.72123800
44.75016800 -106.72123800
44.75016800 -106.80123800
44.56699100 -106.80123800

在ArcGIS和MS SQL Server中,我得到了90847.0英亩。使用上述代码,我得到了90817.4英亩。
另一个点列表的例子:
45.78412600 -108.51506700
45.78402600 -108.67972100
45.75512200 -108.67949400
45.75512200 -108.69962300
45.69795400 -108.69929400

在ArcGIS和MS SQL服务器中,我得到了15732.9英亩。 使用上面的代码,我得到了15731.9英亩。

您的多边形面积是否随着世界海拔的波动而变化?像堪萨斯这样的地方在公顷上的“面积”会比瑞士等地方少。 - sarnold
我认为这可能会影响它,但这是我没有尝试过的。我尝试过的最大高程差距是300米到1200米之间,而且在两种高程上都得到了精确的结果和不精确的结果。这确实提出了一个很好的问题,因为我有成千上万个这些多边形,我将看看是否能找到其中的规律或原因。 - Behr
你可以上传以下表格的示例吗? 1.一组坐标(或几个)。 2.计算面积所需执行的所有代码。 3.执行代码时得到的面积。 4.从SQL Server和ArcGIS中获取的面积。尽管我无法访问它们,但我仍想尝试理解这一问题。 - John Watts
@JohnWatts 我编辑了问题,提供了问题的示例以及正确的测量值与返回的测量值。 - Behr
@JimGarrison 我认为你可能是正确的,我会看看能否找到任何相关资料。我猜测在UTM中拥有这些点会给我良好的面积测量结果。 - Behr
2个回答

0
原来 UTM 投影系统无法达到我所寻求的极高精度。将投影系统切换到更准确的 Albers 或 State Plane,可以提供更准确的计算。

0

你正在使用的面积公式仅适用于平面。随着多边形变得更大,地球的曲率开始产生影响,使得面积比你用这个公式计算的要大。你需要找到一个适用于球面表面的公式。

在谷歌上简单搜索“球面多边形面积”会出现很多结果,其中最有趣的是 Wolfram MathWorld Spherical Polygon


我正在使用您发布链接中的公式,但似乎没有得到期望的结果。不过我会再次检查我的代码。 - Behr

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接