从 GPS 坐标获取区域
Getting area from GPS coordinates
所以,我有一个方法可以 return 由点定义的形状面积(以 CCW 或 CW 顺序给出,这并不重要)。我用一些形状测试了它,它似乎可以工作。
问题是,我想将此方法与 GPS 坐标一起使用,并且我想 return 结果以 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
是我用来表示点的 class,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 公里代表平方公里,3_959 英里代表平方英里...)
所以,我有一个方法可以 return 由点定义的形状面积(以 CCW 或 CW 顺序给出,这并不重要)。我用一些形状测试了它,它似乎可以工作。
问题是,我想将此方法与 GPS 坐标一起使用,并且我想 return 结果以 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
是我用来表示点的 class,x
是纬度,y
是经度)
问题是您没有考虑地球的(近似)球形特性。首先,您需要考虑地球的半径——您可以在更小(或更大)的行星上拥有相同的经纬度列表,但半径会不同,因此面积也会不同.
您可以使用方法
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 公里代表平方公里,3_959 英里代表平方英里...)