これはこの質問のフォローアップです。
私はこれにこだわっているようです。基本的に、標準的な度数システムの座標を参照するように、または国際日付変更線に沿って南極から北への距離を測定し、次に日付のその時点から始まる東の距離を測定するために、前後に変換できる必要があります。ライン。これを行うために (およびいくつかのより一般的な距離測定のものと同様に)、2 つの緯度/経度ポイント間の距離を決定する 1 つの方法と、緯度/経度ポイント、方位、および距離を取得して返す別の方法があります。そのコースの終わりの緯度/経度ポイント。
私が定義した2つの静的メソッドは次のとおりです。
/* 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;
}
「終了」値は appx である必要があります。72.0 / 31.5。しかし、代わりに約 1.25 / 0.021 を得ています。
どこかで単位を変換するのを忘れたり、何か愚かなことを見逃しているに違いないと思います...どんな助けも大歓迎です!
更新 1:
メートルを返す距離関数を (正しく) 書きましたが、コメントに間違ってキロメートルを書いてしまいました... もちろん、今日戻ってきたときは混乱しました。とにかく、これで修正されました。endOfCourse メソッドの因数分解エラーを修正しました。また、そのメソッドでもラジアンから度数に戻すのを忘れていたことに気付きました。とにかく: 正しい緯度番号 (71.99...) を取得しているように見えますが、経度番号はかなりずれています (11.5 ではなく 3.54 になります)。
更新 2: 以下で説明するように、テストでタイプミスがありました。現在はコードで修正されています。ただし、経度の数値はまだ間違っています。現在、11.5 ではなく -11.34 になっています。これらの行に何か問題があるに違いないと思います:
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;