Как рассчитать широту / долготу точки на определенном расстоянии от другой, используя Nodejs или javascript - PullRequest
0 голосов
/ 27 сентября 2018

Мне нужно найти квадратную область, используя широту и долготу (x, y), как показано на следующем рисунке

enter image description here

Мне нужно получить вседругие 3 угловых широты и долготы, добавив 10 км к каждой стороне.Я использую Node.js / javascript для реализации этого.

Ответы [ 2 ]

0 голосов
/ 27 сентября 2018

Что касается приведенной ниже геометрической диаграммы, единственная координата, которую вам нужно рассчитать, - - (x2, y2), а остальные две координаты, которые вы можете рассчитать, используя текущую длину, широту - (x1, y1) и вычисленную - (x2, y2)

enter image description here

Таким образом, в основном вам нужна функция, которая будет принимать текущий lat, long, то есть - (x1, y1), расстояние, которое в вашем примере составляет √2 * 10kmи угол опоры в точку (x2, y2), который при 135 градусах.

let llFromDistance = function(latitude, longitude, distance, bearing) {
  // taken from: https://stackoverflow.com/a/46410871/13549 
  // distance in KM, bearing in degrees

  const R = 6378.1; // Radius of the Earth
  const brng = bearing * Math.PI / 180; // Convert bearing to radian
  let lat = latitude * Math.PI / 180; // Current coords to radians
  let lon = longitude * Math.PI / 180;

  // Do the math magic
  lat = Math.asin(Math.sin(lat) * Math.cos(distance / R) + Math.cos(lat) * Math.sin(distance / R) * Math.cos(brng));
  lon += Math.atan2(Math.sin(brng) * Math.sin(distance / R) * Math.cos(lat), Math.cos(distance / R) - Math.sin(lat) * Math.sin(lat));

  // Coords back to degrees and return
  return [(lat * 180 / Math.PI), (lon * 180 / Math.PI)];

}

console.log(llFromDistance(19.0659115, 72.8574557, Math.sqrt(2)*10, 135))
0 голосов
/ 27 сентября 2018

Вот функция, которую я использовал - не уверен в ее полезности, когда рядом с полюсами, хотя

const fn = (latitude, longitude, distanceInKm, bearingInDegrees) => {
    const R = 6378.1;
    const dr = Math.PI / 180;
    const bearing = bearingInDegrees * dr;
    let lat = latitude * dr;
    let lon = longitude * dr;

    lat = Math.asin(Math.sin(lat) * Math.cos(distanceInKm / R) + Math.cos(lat) * Math.sin(distanceInKm / R) * Math.cos(bearing));
    lon += Math.atan2(
        Math.sin(bearing) * Math.sin(distanceInKm / R) * Math.cos(lat), 
        Math.cos(distanceInKm / R) - Math.sin(lat) * Math.sin(lat)
    );
    lat /= dr;
    lon /= dr;
    return {lat, lon};
}

, поэтому точки будут

fn(y, x, 10, 90), // top right
fn(y, x, 10 * Math.sqrt(2), 135), // bottom right (Pythagoras rules!)
fn(y, x, 10, 180) // bottom left
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...