Применение смещений к широте / долготе приводит к большим ошибкам расстояния - PullRequest
1 голос
/ 12 июля 2020

Я пытаюсь разработать алгоритм «разделяй и властвуй» для определения квадратов широты и долготы.

Я буду sh для начала с квадрата 800 х 800 миль вокруг Великобритании. Затем разделите это на четыре квадрата и затем рекурсивно повторяйте этот процесс, пока квадраты не станут 25 квадратных миль. Затем это будет использоваться для фильтрации нежелательных результатов поиска близости в базе данных местоположений.

Однако алгоритм, который у меня есть, который применяет смещение к широте / долготе (см. Код ниже), дает мне проблемы. Я пробовал и другие, но с такими же результатами. Я думаю, что это может быть мое понимание применения системы координат к сфере.

Я ожидал, что с начальной точкой, двигаясь на восток на 800 миль, а затем на запад на 800 миль, мы вернемся к (приблизительно) там же. Однако это не так:

var coord = 
{
    lat : 60.678413562308236, 
    lng : -12.5
};

// Apply a distance and bearing to a set of coords.
var addOffset = function(coord, distance, angle)
{
    // Earth Radius 
  //var radius = 6378.14; // KM
    var radius = 3958.8; // Miles

  // Degrees to Radians
  var lat = coord.lat * (Math.PI/180);
  var lng = coord.lng * (Math.PI/180);
  var bearing = angle * (Math.PI/180);

  var lat2 = Math.asin(Math.sin(lat)*Math.cos(distance/radius) + Math.cos(lat)*Math.sin(distance/radius)*Math.cos(bearing));
  var lng2 = lng + Math.atan2(Math.sin(bearing)*Math.sin(distance/radius)*Math.cos(lat), Math.cos(distance/radius)-Math.sin(lat)*Math.sin(lat2));

  // back to degrees
  lat2 = lat2 * (180/Math.PI);
  lng2 = lng2 * (180/Math.PI);

   return { lat : lat2, lng : lng2};
}

console.log("start");
console.log(coord);
console.log("Move 800 miles east");
coord = addOffset(coord, 800, 90.0) // East
console.log(coord);
console.log("Move 800 miles west");
coord = addOffset(coord, 800, 270.0) // West
console.log(coord);

Кроме того, когда я «гуляю» по площади 800 миль вокруг Великобритании и нанося точки на карту Google, я получаю большие проблемы! Приведенный ниже рисунок начинается с северо-запада, идет на юг 800 миль, затем идет на восток 800 миль, затем на север 800 миль, затем на запад 800 миль. Как видите, все пошло совсем не так:

Google Maps

Here's a fiddle (couldn't work out how to get the map working on a code snippet here):

https://jsfiddle.net/leetaylor/aoxnsqeu/6/

Может ли кто-нибудь объяснить, в чем я ошибаюсь? Можно ли разделить географию на квадраты с помощью широты / долготы?

1 Ответ

1 голос
/ 14 июля 2020

Проблема в том, что ваш addOffset не делает то, что вы думаете. Цитирование исходного участка

Учитывая начальную точку, начальный азимут и расстояние, это вычислит точку назначения и конечный азимут , путешествуя по (кратчайшему) большому расстоянию. круг ар c.

Мой акцент. Поэтому, когда вы говорите, что хотите сначала пеленг на восток, вы не рассчитываете, где вы окажетесь, если вы go восток; вместо этого вы рассчитываете, где вы окажетесь, если последуете по большому кругу, идущему на восток , чтобы начать с . Если вы начнете с точки в северном полушарии и направитесь на восток или запад, используя это правило, вы изогнетесь на юг к экватору, как вы можете видеть на своей карте. Линии юга идеальны, потому что линии долготы - большие круги. долгота. Это означает, что верхний и нижний края каждого «квадрата» на самом деле не будут одинаковой длины, но в умеренных широтах, таких как Великобритания, это не должно быть так уж плохо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...