2013-02-06 9 views
-1

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

Я видел How to convert Distance(miles) to degrees?, но предложения там не работают.

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

+0

посмотреть [ответ] (http://stackoverflow.com/questions/1253499/simple-calculations-for-working-with-lat-lon-km-distance/1253545#1253545) – TheWhiteRabbit

+0

что вы подразумеваете под «десятичным расстоянием»? –

+0

Я не говорю «десятичное расстояние», а «десятичные градусы». И вот что я имею в виду: http://en.wikipedia.org/wiki/Decimal_degrees – WillyRobert

ответ

1

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

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

Что я использую (в C, а не Java) для вычисления FIX-лучевых расстояние:

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);} 

 Смежные вопросы

  • Нет связанных вопросов^_^