nmea to wgs84
От: k732  
Дата: 05.08.09 13:07
Оценка:
GPS отдает координаты по протоколу NMEA

1. Как перевести их nmea в wgs84 ?
2. Как перевести их nmea в градусы/минуты/секунды ?
2. Как перевести их wgs84 в градусы/минуты/секунды ?
Re: gdal?
От: gok Россия  
Дата: 05.08.09 13:17
Оценка:
Здравствуйте, k732, Вы писали:
...
ogr2ogr
gok
Re: nmea to wgs84
От: gok Россия  
Дата: 05.08.09 13:26
Оценка:
Здравствуйте, k732, Вы писали:

K>GPS отдает координаты по протоколу NMEA


NMEA(WGS-84) 5601.0318,N 01211.3503,E
Decimal format 56.01755 12.19302

Отсюда
Там же есть интересные измерения стабильности GPS приемника
Надо бы такое же проделать
gok
Re[2]: nmea to wgs84
От: k732  
Дата: 05.08.09 13:33
Оценка:
gok>NMEA(WGS-84) 5601.0318,N 01211.3503,E
gok>Decimal format 56.01755 12.19302

похоже не совсем разобрался.
именно нужно перевести 5601.0318 -> 56.01755

вроде это
    Private Function toDecimal(ByVal Pos As String) As Double
        'Pos="5601.0318"
        Dim PosDb As Double = CType(Replace(Pos, ".", ","), Double) 'Replace . with , (Used in danish doubles)
        Dim Deg As Double = Math.Floor(PosDb / 100)
        Dim DecPos As Double = Math.Round(Deg + ((PosDb - (Deg * 100)) / 60), 5)
        Return DecPos '=56.0172
    End Function


А вот как из NMEA и Decimal format перевести в градусы/мин/сек что-то не нашел.
Причем хотелось бы переводить из nmea сразу и из Decimal format (без промежуточных преобразований)

gok>Отсюда

gok>Там же есть интересные измерения стабильности GPS приемника
gok>Надо бы такое же проделать

что-то не понял о чем ?
Re[3]: nmea to wgs84
От: Ruslan.Yusupov Россия  
Дата: 05.08.09 15:10
Оценка:
Здравствуйте, k732, Вы писали:

gok>>NMEA(WGS-84) 5601.0318,N 01211.3503,E

gok>>Decimal format 56.01755 12.19302

K>похоже не совсем разобрался.

K>именно нужно перевести 5601.0318 -> 56.01755

K>вроде это

K>
K>    Private Function toDecimal(ByVal Pos As String) As Double
K>        'Pos="5601.0318"
K>        Dim PosDb As Double = CType(Replace(Pos, ".", ","), Double) 'Replace . with , (Used in danish doubles)
K>        Dim Deg As Double = Math.Floor(PosDb / 100)
K>        Dim DecPos As Double = Math.Round(Deg + ((PosDb - (Deg * 100)) / 60), 5)
K>        Return DecPos '=56.0172
K>    End Function
K>


K>А вот как из NMEA и Decimal format перевести в градусы/мин/сек что-то не нашел.

K>Причем хотелось бы переводить из nmea сразу и из Decimal format (без промежуточных преобразований)

gok>>Отсюда

gok>>Там же есть интересные измерения стабильности GPS приемника
gok>>Надо бы такое же проделать

K>что-то не понял о чем ?




k732> 1. Как перевести их nmea в wgs84 ?

k732> 2. Как перевести их nmea в градусы/минуты/секунды ?
k732> 2. Как перевести их wgs84 в градусы/минуты/секунды ?

Вопрос интересен, но опыта общения с GPS и NMEA нет
Беглый гуглинг наводит на мысли о безобразной дилемме в плане "перевода" NMEA->WGS...
Насколько я понял, "морские электроники" призывают пользователей устанавливать на девайсах датум WGS84, и ассоциируют его с понятием "NMEA standard".
Но производителей девайсов много и они тоже предоставляют возможность использовать другие датумы.
Например, здесь рекомендация для пользователей железа от Garmin:
Note that Garmin converts lat/lon coordinates to the datum chosen by the user when sending this data. This is indicated in the proprietary sentence PGRMM. This can help programs that use maps with other datums but is not an NMEA standard. Be sure and set your datum to WGS84 on Garmin units when communicating to other NMEA devices.

Отсюда такая дилемма — NMEA=WGS84 или NMEA=(смотреть надо...).
В любом случае, Вы ведь работаете со строкой определенного формата (NMEA sentence).
Как я понял, в некоторых из них указывается, какой датум используется.
Думаю было бы корректно попытаться выяснить название датума.
Если это WGS84 или неизвестно что (если выяснить не удалось), то проецирование NMEA в WGS84 можно со спокойной совестью считать бессмысленными .
Если же это датум, отличный от WGS84, то по-хорошему надо честно проецировать координаты из одной СК в другую. Для этого придется разбираться с GDAL (это где ogr2ogr) или другими библиотеками, позволяющими перепроецировать пространственные данные. Но начать, наверное, можно с сообщения "Датум не поддерживается".

Я надеюсь, пока я писал пост, Вы уже научились переводить десятичную дробь минуты в ее шестидесятые части?
Но все равно вставлю код — раз уж написал

// Допустим такая NMEA-строка:
// $GPRMC,125504.049,A,5542.2389,N,03741.6063,E,0.06,25.82,200906,,*3B
// Соответственно, координаты (широта, долгота) — "5542.2389,N,03741.6063,E".
// Предположим, что каким-то чудом распарсили строку
// по паттерну $GPRMC,hhmmss.ss,A,GGMM.MM,P,gggmm.mm,J,v.v,b.b,ddmmyy,x.x,n,m*hh<CR><LF>
// см. http://ru.wikipedia.org/wiki/NMEA

// Т.к. формат "позиционный", я предпочту использовать стрОки для представления фрагментов.
// Обратите внимание, что в этом NMEA-предложении дробная часть не фиксированной длины, а от точки до запятой.
string NMEA_Lat = "5542.2389"; // GGMM.MM
string NMEA_Lon = "03741.6063"; // gggmm.mm

// преобразование NMEA->градусы/минуты/секунды рассмотрим на примере широты:
// 5542.2389 -> 55° градусов 42.2389" минуты = 55°42"(0.2389 * 60)' = 55°42"14.334'
// с градусами и минутами всё очевидно;
// чтобы получить секунды, нужно дробную часть минут умножить на 60.

int latDegrees = Convert.ToInt32( NMEA_Lat.Substring( 0, 2 ) );
int latMinutes = Convert.ToInt32( NMEA_Lat.Substring( 2, 2 ) );
double latMinutesFraction = Convert.ToDouble( NMEA_Lat.Substring( 4 ), CultureInfo.InvariantCulture );
double latSeconds = latMinutesFraction * 60;

// аналогичные вычисления для долготы, только для градусов здесь три знака
int lonDegrees = Convert.ToInt32( NMEA_Lon.Substring( 0, 3 ) );
int lonMinutes = Convert.ToInt32( NMEA_Lon.Substring( 3, 2 ) );
double lonMinutesFraction = Convert.ToDouble( NMEA_Lon.Substring( 5 ), CultureInfo.InvariantCulture );
double lonSeconds = lonMinutesFraction * 60;

Удачи!
Re: nmea to wgs84
От: Шебеко Евгений  
Дата: 05.08.09 16:17
Оценка:
K>1. Как перевести их nmea в wgs84 ?
K>2. Как перевести их nmea в градусы/минуты/секунды ?
K>2. Как перевести их wgs84 в градусы/минуты/секунды ?

Да не смущайте человека.
NMEA отдаёт координаты в тех же градусах.
Только градусы эти выражены в ГГММ.ММММ

ГГ — градусы
ММ — минуты [0-59]
.ММММ — доли минут [0.0-1.0)


У всех GPS приёмников по умолчанию геоид установлен в wgs84.
Только некоторые геодезические приёмники позволяют менять геоид.
Это интересно только геодезистам, т.к. с их миллиметровой точностью имеет значение какой геоид установлен.

NMEA<->ГГ.ГГГГ

void degree2nmea(fix_data& fix)
{
    double latitude=fix.latitude;
    double longitude=fix.longitude;

    fix.latitude=(long)latitude+(latitude-(long)latitude)/100*60;
    fix.longitude=(long)longitude+(longitude-(long)longitude)/100*60;
    fix.latitude*=100;
    fix.longitude*=100;
}

void nmea2degree(fix_data& fix)
{
    double latitude=fix.latitude;
    double longitude=fix.longitude;

    latitude/=100;
    longitude/=100;
    fix.latitude=(long)latitude+(latitude-(long)latitude)/60*100;
    fix.longitude=(long)longitude+(longitude-(long)longitude)/60*100;
}


Не могу похвастаться, что код идеальный, но вроде работает


ГГ.ГГГГ->ГГ.ММ.СС

    double d,m,s;
    d=floor(X);
    m=floor((X-d)*60.0);
    s=((X-d)*60.0-m)*60.0;
    sX.printf("%03d°%02d'%04.1lf''",(int)d,(int)m,s);

    d=floor(Y);
    m=floor((Y-d)*60.0);
    s=((Y-d)*60.0-m)*60.0;
    sY.printf("%03d°%02d'%04.1lf''",(int)d,(int)m,s);



Да, кстати, проекции wgs84 не существует. Есть куча проекций с датумом wgs84.
То что обычно говорят wgs84 — это широта\долгота с датумом wgs84.
Re[2]: nmea to wgs84
От: k732  
Дата: 05.08.09 17:08
Оценка:
Здравствуйте, Шебеко Евгений, Вы писали:

K>>1. Как перевести их nmea в wgs84 ?

K>>2. Как перевести их nmea в градусы/минуты/секунды ?
K>>2. Как перевести их wgs84 в градусы/минуты/секунды ?

ШЕ>Да не смущайте человека.

ШЕ>NMEA отдаёт координаты в тех же градусах.
ШЕ>Только градусы эти выражены в ГГММ.ММММ

ШЕ>ГГ — градусы

ШЕ>ММ — минуты [0-59]
ШЕ>.ММММ — доли минут [0.0-1.0)


ШЕ>У всех GPS приёмников по умолчанию геоид установлен в wgs84.

ШЕ>Только некоторые геодезические приёмники позволяют менять геоид.
ШЕ>Это интересно только геодезистам, т.к. с их миллиметровой точностью имеет значение какой геоид установлен.

ШЕ>NMEA<->ГГ.ГГГГ


ШЕ>
ШЕ>void degree2nmea(fix_data& fix)
ШЕ>{
ШЕ>    double latitude=fix.latitude;
ШЕ>    double longitude=fix.longitude;

ШЕ>    fix.latitude=(long)latitude+(latitude-(long)latitude)/100*60;
ШЕ>    fix.longitude=(long)longitude+(longitude-(long)longitude)/100*60;
ШЕ>    fix.latitude*=100;
ШЕ>    fix.longitude*=100;
ШЕ>}

ШЕ>void nmea2degree(fix_data& fix)
ШЕ>{
ШЕ>    double latitude=fix.latitude;
ШЕ>    double longitude=fix.longitude;

ШЕ>    latitude/=100;
ШЕ>    longitude/=100;
ШЕ>    fix.latitude=(long)latitude+(latitude-(long)latitude)/60*100;
ШЕ>    fix.longitude=(long)longitude+(longitude-(long)longitude)/60*100;
ШЕ>}

ШЕ>


ШЕ>Не могу похвастаться, что код идеальный, но вроде работает


то есть просто 5540.1234 => 55 + (40.1234 / 60) ?

а из nmea-> в градусы и decimal в градусы похоже так ?

        uint degree = ((uint)value / 100);
        uint minute    = ((uint)value % 100);
        float second= float((value - static_cast<uint>(value)) * 60.0);
Re[3]: nmea to wgs84
От: Шебеко Евгений  
Дата: 06.08.09 06:43
Оценка:
K>то есть просто 5540.1234 => 55 + (40.1234 / 60) ?
точно.

K>а из nmea-> в градусы и decimal в градусы похоже так ?


K>
K>        uint degree = ((uint)value / 100);
K>        uint minute    = ((uint)value % 100);
K>        float second= float((value - static_cast<uint>(value)) * 60.0);
K>

ну вроде так.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.