gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-11-01 03:54:57 24 4
gpt4 key购买 nike

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

我首先使用 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 Server 中,我获得了 15732.9 英亩的土地。使用上面的代码,我得到了 15731.9 英亩。

最佳答案

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

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

关于java - 使用UTM坐标计算面积的精确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10905401/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com