这是对这个问题的后续。
我好像陷入了困境。基本上,我需要能够在标准度系统和通过沿着国际日期线测量南极点向北的距离以及从该点开始向东的距离之间来回转换坐标。为此(以及进行一些更通用的测距),我有一个方法来确定两个lat/lon点之间的距离,以及另一个方法,它接受一个lat/lon点,一个方向和一个距离,并返回该课程结束时的lat/lon点。
这是我定义的两个静态方法:
/* Takes two lon/lat pairs and returns the distance between them in kilometers.
*/
public static double distance (double lat1, double lon1, double lat2, double lon2) {
double theta = toRadians(lon1-lon2);
lat1 = toRadians(lat1);
lon1 = toRadians(lon1);
lat2 = toRadians(lat2);
lon2 = toRadians(lon2);
double dist = sin(lat1)*sin(lat2) + cos(lat1)*cos(lat2)*cos(theta);
dist = toDegrees(acos(dist)) * 60 * 1.1515 * 1.609344 * 1000;
return dist;
}
/* endOfCourse takes a lat/lon pair, a heading (in degrees clockwise from north), and a distance (in kilometers), and returns
* the lat/lon pair that would be reached by traveling that distance in that direction from the given point.
*/
public static double[] endOfCourse (double lat1, double lon1, double tc, double dist) {
double pi = Math.PI;
lat1 = toRadians(lat1);
lon1 = toRadians(lon1);
tc = toRadians(tc);
double dist_radians = toRadians(dist / (60 * 1.1515 * 1.609344 * 1000));
double lat = asin(sin(lat1) * cos(dist_radians) + cos(lat1) * sin(dist_radians) * cos(tc));
double dlon = atan2(sin(tc) * sin(dist_radians) * cos(lat1), cos(dist_radians) - sin(lat1) * sin(lat));
double lon = ((lon1-dlon + pi) % (2*pi)) - pi;
double[] endPoint = new double[2];
endPoint[0] = lat; endPoint[1] = lon;
return endPoint;
}
这里是我正在使用来测试它的函数:
public static void main(String args[]) throws java.io.IOException, java.io.FileNotFoundException {
double distNorth = distance(0.0, 0.0, 72.0, 0.0);
double distEast = distance(72.0, 0.0, 72.0, 31.5);
double lat1 = endOfCourse(0.0, 0.0, 0.0, distNorth)[0];
double lon1 = endOfCourse(lat1, 0.0, 90.0, distEast)[1];
System.out.println("end at: " + lat1 + " / " + lon1);
return;
}
“结束点”应该是约72.0 / 31.5。但是实际上我得到的大约是1.25 / 0.021。我猜我一定是漏掉了什么愚蠢的东西,忘记在某个地方转换单位或者什么的......任何帮助都将不胜感激!
更新1:
我已经(正确地)编写了距离函数以返回米,但错误地在注释中写成了千米...... 当然,在今天回来时这让我感到困惑。无论如何,现在已经修复了这个问题,并且我也已经修正了endOfCourse方法中的因子错误,并且我还意识到我还忘记在那个方法中从弧度转换回度数。 无论如何:虽然看起来我现在得到了正确的纬度数字(71.99...),但是经度数字偏差很大(我得到的是3.54而不是11.5)。
更新2:
如下所述,我的测试中有一个错别字。现在它已在代码中修复。但是经度数字仍然是错误的:我现在得到的是-11.34而不是11.5。我认为这些行必须有问题:
double dlon = atan2(sin(tc) * sin(dist_radians) * cos(lat1), cos(dist_radians) - sin(lat1) * sin(lat));
double lon = ((lon1-dlon + pi) % (2*pi)) - pi;