【问题标题】:An exact method of area calculation using UTM coordinates使用 UTM 坐标计算面积的精确方法
【发布时间】:2012-06-09 22:45:53
【问题描述】:

我有一个纬度/经度坐标列表,我想用它来计算多边形的面积。在很多情况下我可以得到准确的结果,但是多边形越大,出错的机会就越大。

我首先使用 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

感谢 cmets。 这是我获取该区域的代码(IBM 链接上面列出了 CoordinateConversion 代码):

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 服务器中,我得到 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 英亩。

【问题讨论】:

  • 多边形的面积会随着世界海拔的波动而变化吗?堪萨斯这样的地方每公顷的“面积”比瑞士这样的地方要少。
  • 我认为这会影响它,但这是我没有尝试过的。我尝试过的最大海拔差异在 300 米和 1200 米之间,我在两者上都得到了准确的结果,但在两个高度上都不准确。这确实提出了一个很好的观点,因为我有数千个这样的多边形,我会看看我是否能找到一个押韵或理由。
  • 你能上传以下表格的例子吗? 1.一组坐标(或几个)。 2. 计算面积所执行的所有代码。 3. 执行代码时得到的面积 4. 从SQL Server 和ArcGIS 得到的面积。我无权访问其中任何一个,但我仍然想尝试解决这个问题。
  • @JohnWatts 我编辑了问题以举例说明问题以及正确的测量值与返回的测量值。
  • @JimGarrison 我认为您可能是正确的,我会看看我是否可以对此进行挖掘。我猜想在 UTM 中有这些点会给我很好的面积测量结果。

标签: java polygon area utm


【解决方案1】:

事实证明,UTM 无法获得我一直在寻找的极端准确度。将投影系统切换到更精确的投影系统(如 Albers 或 State Plane)可提供更准确的计算。

【讨论】:

    【解决方案2】:

    您使用的面积公式仅在平面上有效。随着多边形变大,地球的曲率开始产生影响,使面积大于您使用此公式计算的面积。您需要找到一个适用于球体表面的公式。

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

    【讨论】:

    • 我正在使用您发布的链接中的公式,但似乎没有得到预期的结果。不过,我会仔细检查我的代码。
    猜你喜欢
    • 2015-04-13
    • 1970-01-01
    • 2016-09-30
    • 2018-02-19
    • 2017-04-16
    • 1970-01-01
    • 2014-08-19
    • 1970-01-01
    相关资源
    最近更新 更多