Stackoverflowで次の答えを見つけました。
私が理解していることから、これはそれを行うための適切な方法ではありません。計算は線形ですが、座標は球面にマッピングされます。それで、それを行う適切な方法は何ですか?
中点を計算する関数がありますが、パーセンテージをパラメーターとして受け入れるように中点を変更するにはどうすればよいですか。言い換えると、ポイント1と2の間にあり、ポイント1からパーセンテージ離れた中点を見つけます...
middle_point(lat1, long1, lat2, long2) {
// Longitude difference.
var d_long = (long2 - long1) * Math.PI / 180;
// Convert to radians.
lat1 = lat1 * Math.PI / 180;
lat2 = lat2 * Math.PI / 180;
long1 = long1 * Math.PI / 180;
var b_x = Math.cos(lat2) * Math.cos(d_long);
var b_y = Math.cos(lat2) * Math.sin(d_long);
var lat3 = Math.atan2(Math.sin(lat1) + Math.sin(lat2), Math.sqrt((Math.cos(lat1) + b_x) * (Math.cos(lat1) + b_x) + b_y * b_y));
var long3 = long1 + Math.atan2(b_y, Math.cos(lat1) + b_x);
// Return result.
return [long3 * 180/Math.PI, lat3 * 180/Math.PI];
}
答えはここにあります:http://www.movable-type.co.uk/scripts/latlong.htmlそしてここに:http://www.edwilliams.org/avform.htm#Intermediate
必要な関数は次のとおりです。「perc」は0〜100です。
intermediate_point(lat1, long1, lat2, long2, perc) {
// Normalize percentage
perc = perc / 100;
// Convert to radians.
lat1 = lat1 * Math.PI / 180;
lat2 = lat2 * Math.PI / 180;
long1 = long1 * Math.PI / 180;
long2 = long2 * Math.PI / 180;
// get angular distance between points
var d_lat = lat2 - lat1;
var d_lon = long2 - long1;
var a = Math.sin(d_lat/2) * Math.sin(d_lat/2) + Math.cos(lat1) *
Math.cos(lat2) * Math.sin(d_lon/2) * Math.sin(d_lat/2);
var d = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));
var A = Math.sin((1-perc)*d) / Math.sin(d);
var B = Math.sin(perc*d) / Math.sin(d);
var x = A * Math.cos(lat1) * Math.cos(long1) + B * cos(lat2) * cos(long2);
var y = A * Math.cos(lat1) * Math.sin(long1) + B * cos(lat2) * sin(long2);
var z = A * Math.sin(lat1) + B * Math.sin(lat2);
var lat3 = Math.atan2(z, Math.sqrt(x*x + y*y));
var long3 = Math.atan2(y, x);
// Return result, normalising longitude to -180°...+180°
return [long3 * 180/Math.PI, (lat3 * 180/Math.PI + 540)%360-180];
}
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加