![](/img/trans.png)
[英]Primefaces geocode getting 0.0, 0.0 gps coordinates from backing bean
[英]Getting area from GPS coordinates
因此,我有一个方法可以返回由其点定义的形状区域(按CCW或CW顺序,这并不重要)。 我用一些形状对其进行了测试,它似乎可以正常工作。
问题是,我想将此方法与GPS坐标一起使用,并且我想以m²或km²为单位返回结果,但是绝对不会发生这种情况。 实际上,我什至不知道将这种方法与那种坐标一起使用时的结果是哪个单位。
所以问题是,如何将我得到的结果转换为m²或km²? 我尝试了一些方法,但是它不起作用或不正确。
这是我的方法,如果您要检查:
public static double getArea(List<Vector2D> points) {
double firstSum = 0, secondSum = 0;
for (int i = 0 ; i < points.size()-1 ; i++) {
firstSum += points.get(i).x * points.get(i+1).y;
secondSum += points.get(i).y * points.get(i+1).x;
}
firstSum += points.get( points.size()-1 ).x * points.get(0).y;
secondSum += points.get( points.size()-1 ).y * points.get(0).x;
return Math.abs((firstSum-secondSum)/2);
}
( Vector2D
是我用于点的类,其中x
为纬度, y
为经度)
问题在于您没有考虑地球的(近似)球形性质。 首先,您需要考虑地球的半径-在较小(或较大)的行星上可以具有相同的纬度和经度列表,但是半径会有所不同,因此面积也将有所不同。
您可以在此问题中使用该方法。 将其转换为Java很简单:
public static double CalculatePolygonArea(List<Vector2D> coordinates)
{
double area = 0;
if (coordinates.size() > 2)
{
for (int i = 0; i < coordinates.size()-1; i++)
{
Vector2D p1, p2;
p1 = coordinates.get(i);
p2 = coordinates.get(i + 1);
area += Math.toRadians(p2.x - p1.x) * (2 + Math.sin(Math.toRadians(p1.y))
+ Math.sin(Math.toRadians(p2.y)));
}
area = area * R * R / 2;
}
return Math.abs(area);
}
(假设Vector2D.x
是经度, Vector2D.y
是纬度)。
R
是地球的半径。 在您要面积结果使用的单位中使用一个值(例如,6_371_000米为平方米,6_371 km为平方公里,3_959英里为平方英里...)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.