Преобразование расстояния (морских миль) в градусы (широта / долгота)

У меня есть объекты в симуляции, чьи начальные местоположения и пути являются кодом с использованием Java в десятичных градусах. Мне нужно масштабировать радиус датчика (в морских милях) и скорость (морские мили / час), чтобы соответствовать десятичным градусам. Цель состоит в том, чтобы визуализировать сима в OpenMap и Google Earth.

Я видел, как преобразовать расстояние (миль) в градусы? Но предложения там не работают.

Любая помощь приветствуется! Я думаю, что это будет связано с использованием великолепных формул расстояния по кругу... но я не совсем понимаю.

1 ответ

Решение

Формула авиации Эда Уильямса http://williams.best.vwh.net/avform.htm - хорошее и доступное место для начала. И я часто ссылаюсь на http://movable-type.co.uk/scripts/latlong.html.

Я предполагаю, что вам нужен какой-то вектор (ваш вопрос немного неясен).

То, что я использую (в C, а не в Java) для вычисления фиксированного радиального расстояния:

void polarToLatLong(double lat, double lon, double dist, double radial,
   double *outlat, double *outlon) {
   if (!dist) { // distance zero, so just return the point
      *outlat = lat;
      *outlon = lon;
   }
   else if (lat > 89.9999) { // North Pole singularity. Dist is in NM.
      *outlat = 90 - dist / 60;
      *outlon = fmod(radial + 180) - 180;
   }
   else { // normal case
      double sinlat, coslon;
      dist /= 3442; // = Earth's radius in nm (not WGS84!)
      sinlat = Sin(lat) * cos(dist) + Cos(lat) * sin(dist) * Cos(radial);
      *outlat = Arcsin(sinlat);
      coslon = (cos(dist) - Sin(lat) * sinlat) / (Cos(lat) * Cos(*outlat));
      *outlon = lon + (Sin(radial) >= 0 : -1 : 1) * Arccos(coslon);
   }
}

В приведенном выше коде Sin()в верхнем регистре S, это просто обертка sin() для степеней:

#define CLAMP(a,x,b) MIN(MAX(a, x), b) // GTK+ GLib version slightly different
double Sin(double deg)   {return sin(deg * (PI / 180));} // wrappers for degrees
double Cos(double deg)   {return cos(deg * (PI / 180));}
double Arcsin(double x)  {return asin(CLAMP(-1, x, 1)) * (180 / PI);}
double Arccos(double x)  {return acos(CLAMP(-1, x, 1)) * (180 / PI);}
Другие вопросы по тегам