根据百分比计算两个坐标之间的点

时间:2015-11-25 01:58:52

标签: javascript coordinates geocoding

我正在寻找一个在两点之间返回一个点(lat,long)的函数(我也指定它们的lat,long),并且该点基于距离百分比。

所以,我在函数上指定Lat1,Lon1,Lat2,Lon2和%,它返回一个点,例如,从第一个点到第二个点的距离为20%。

3 个答案:

答案 0 :(得分:11)

假设坐标是十进制数。你可以使用这个等式。

function midpoint(lat1, long1, lat2, long2, per) {
     return [lat1 + (lat2 - lat1) * per, long1 + (long2 - long1) * per];
}

根据百分比(例如per = 0.2,20%)返回[lat,long]的新坐标。

答案 1 :(得分:2)

这是一个有用的参考资料(查看底部)

http://www.movable-type.co.uk/scripts/latlong.html

中间点

也可以计算两点之间沿大圆路径的任何分数的中间点。

公式:

<input id="yellow" onkeydown="keyD()" onkeyup="keyU()" style="background:yellow;height:300px;width:300px;" value="Click at me first. and press a key to see the event" />

function keyD() {
    document.getElementById("yellow").style.backgroundColor = "blue";
}

function keyU() {
    document.getElementById("yellow").style.backgroundColor = "green";
}

其中 f 是沿大圆路线的分数( f = 0 是第1点, f = 1 是第2点),δ是两点之间的角距离 d / R

答案 2 :(得分:0)

这两个答案对特定用户可能有用,但是我想指出一些问题。

lguiel的解决方案适用于游戏或短距离比赛,但不适用于地球上地球的几何计算。

呼吸描记器的答案是正确的,但由于从理论上讲,它可能太难编程了。

我将第二个答案翻译为实用的编程语言,以便您可以将其用于自己的项目。

Full code | Run online

// Original calculation from https://www.movable-type.co.uk/scripts/latlong.html
LatLng calculateIntermediatePoint(LatLng point1, LatLng point2, double perc) {
  //const φ1 = this.lat.toRadians(), λ1 = this.lon.toRadians();
  //const φ2 = point.lat.toRadians(), λ2 = point.lon.toRadians();
  double lat1 = degreesToRadians(point1.latitude);
  double lng1 = degreesToRadians(point1.longitude);
  double lat2 = degreesToRadians(point2.latitude);
  double lng2 = degreesToRadians(point2.longitude);

  //const Δφ = φ2 - φ1;
  //const Δλ = λ2 - λ1;
  double deltaLat = lat2 - lat1;
  double deltaLng = lng2 - lng1;

  //const a = Math.sin(Δφ/2) * Math.sin(Δφ/2) + Math.cos(φ1) * Math.cos(φ2) * Math.sin(Δλ/2) * Math.sin(Δλ/2);
  //const δ = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));
  double calcA = sin(deltaLat / 2) * sin(deltaLat / 2) +
      cos(lat1) * cos(lat2) * sin(deltaLng / 2) * sin(deltaLng / 2);
  double calcB = 2 * atan2(sqrt(calcA), sqrt(1 - calcA));

  //const A = Math.sin((1-fraction)*δ) / Math.sin(δ);
  //const B = Math.sin(fraction*δ) / Math.sin(δ);
  double A = sin((1 - perc) * calcB) / sin(calcB);
  double B = sin(perc * calcB) / sin(calcB);

  //const x = A * Math.cos(φ1) * Math.cos(λ1) + B * Math.cos(φ2) * Math.cos(λ2);
  //const y = A * Math.cos(φ1) * Math.sin(λ1) + B * Math.cos(φ2) * Math.sin(λ2);
  //const z = A * Math.sin(φ1) + B * Math.sin(φ2);
  double x = A * cos(lat1) * cos(lng1) + B * cos(lat2) * cos(lng2);
  double y = A * cos(lat1) * sin(lng1) + B * cos(lat2) * sin(lng2);
  double z = A * sin(lat1) + B * sin(lat2);

  //const φ3 = Math.atan2(z, Math.sqrt(x*x + y*y));
  //const λ3 = Math.atan2(y, x);
  double lat3 = atan2(z, sqrt(x * x + y * y));
  double lng3 = atan2(y, x);

  //const lat = φ3.toDegrees();
  //const lon = λ3.toDegrees();
  return LatLng(radiansToDegrees(lat3), radiansToDegrees(lng3));
}