Здравствуйте, 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;
Удачи!