我有一组纬度/经度坐标,想要用它们来计算一个多边形的面积。在许多情况下我可以得到精确结果,但是当多边形变大时,出现误差的可能性就越高。
首先,我使用http://www.ibm.com/developerworks/java/library/j-coordconvert/将这些坐标转换为UTM。
然后,我使用http://www.mathopenref.com/coordpolygonarea2.html来计算UTM坐标的面积。
我将把这些区域与我输入到Microsoft SQL server和ArcGIS中的相同坐标进行比较,但似乎并不总是完全匹配。有人知道比这更精确的方法吗?
提前感谢。
编辑1:
谢谢您的评论。 以下是我获取面积的代码(CoordinateConversion代码在IBM链接中列出):
在ArcGIS和MS SQL Server中,我得到了90847.0英亩。使用上述代码,我得到了90817.4英亩。
另一个点列表的例子:
在ArcGIS和MS SQL服务器中,我得到了15732.9英亩。 使用上面的代码,我得到了15731.9英亩。
首先,我使用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英亩。