0

有两个点和一个距离,我试图计算方位角,然后重新计算其中一个点。

但是计算点到原点的距离超过50米,误差很大。

这是代码:

 public static void main(String[] args) {

 double startLongitude = -5.1085;
 double startLatitude = 40.6682667;
 double endLongitude = -4.000597497067124;
 double endLatitude = 41.49682079962159;
 double distance = 130947.51;

 try {
 CoordinateReferenceSystem crs = CRS.decode("EPSG:4326");
 GeodeticCalculator calculator = new GeodeticCalculator(crs);

 calculator.setStartingGeographicPoint(startLongitude, startLatitude);
 calculator.setDestinationGeographicPoint(endLongitude, endLatitude);
 double azimuth = calculator.getAzimuth();
 System.out.println("Azimuth=" + azimuth);

 calculator = new GeodeticCalculator(crs);
 calculator.setStartingGeographicPoint(startLongitude, startLatitude);
 calculator.setDirection(azimuth, distance);
 Point2D computedEndPoint = calculator.getDestinationGeographicPoint();
 System.out.println("computedEndPoint=" + computedEndPoint);

 calculator = new GeodeticCalculator(crs);
 calculator.setStartingGeographicPoint(endLongitude, endLatitude);
 calculator.setDestinationGeographicPoint(computedEndPoint);
 distance = calculator.getOrthodromicDistance();
 System.out.println("Distance=" + distance);

 } catch (FactoryException e) {
 e.printStackTrace();
 }

}

输出是:

方位角=44.97189638988797

computedEndPoint=Point2D.Double[-4.00014170719737, 41.49715519864095]

距离=53.17698966547863

我希望 computedEndPoint 从一开始就与声明的终点非常相似(如果不完全一样)。并且这两点之间的距离要接近于零。

现在我的问题是:我做错了什么?或者 GeodedicCalculator 中是否存在一些错误?

4

1 回答 1

0

50m 超过 130km 是 0.04% 的误差 - 这对于迭代数值方法的往返非常好。

您正在使用GeodedicCalculator它使用地球形状的近似值进行计算。GeoTools使用CFF Karney的GeographicLib实现,测地线算法,J. Geodesy 87, 43–55 (2013),它解释了用于解决问题的近似值。

gis.stackexchange.com上的这个答案解释了在使用纬度和经度时,您可以从各种小数位数中获得的准确度水平也总结在这个XKCD 卡通中:

在此处输入图像描述

您的最低精度点是 4DP,因此您不能期望从其余的计算中得到比 10 米更好的结果。即使在航空领域,您也不太可能获得优于 5 DP 的实际测量结果,并且更有可能使用 3DP 和 10s-100s 米的精度。

更新

进一步调查表明,您原来的距离值是错误的。

  calculator.setStartingGeographicPoint(startLongitude, startLatitude);
  calculator.setDestinationGeographicPoint(endLongitude, endLatitude);
  double azimuth = calculator.getAzimuth();
  System.out.println("Azimuth=" + azimuth);
  double fullDistance = calculator.getOrthodromicDistance();
  System.out.println("distance " + fullDistance);
  System.out.println("% error " + (Math.abs(fullDistance - distance) / fullDistance) * 100);
  calculator = new GeodeticCalculator(crs);
  calculator.setStartingGeographicPoint(startLongitude, startLatitude);
  calculator.setDirection(azimuth, fullDistance);
  Point2D computedEndPoint = calculator.getDestinationGeographicPoint();
  System.out.println("computedEndPoint=" + computedEndPoint);

  calculator = new GeodeticCalculator(crs);
  calculator.setStartingGeographicPoint(endLongitude, endLatitude);
  calculator.setDestinationGeographicPoint(computedEndPoint);
  distance = calculator.getOrthodromicDistance();
  System.out.println("Distance=" + distance);
  System.out.println("% error " + ((distance / fullDistance) * 100));

给我:

Azimuth=44.971973670068415
distance 130893.86215735915
% error 0.04098575880994952
computedEndPoint=Point2D.Double[-4.000599999999989, 41.49682]
Distance=9.64120596409175E-10
% error 7.365666964965247E-13

正如您所看到的,所有错误都出现在第一次计算中,正向/反向行程给出了相同的点和 9e-10m 的距离误差。这对任何域都应该没问题。

于 2020-03-01T11:12:49.680 回答