Хотите преобразовать файл .gp в .csv. Эти данные являются извлечением из GPS-устройства, которое постоянно отслеживает его положение с течением времени.
Кроме того, я хотел бы найти время и скорость во всем.
Вот пример вывода.
$GNRMC,020555.90,A,4828.05510,N,12318.87567,W,0.059,,170322,,,A*7E
$GNRMC,020556.00,A,4828.05509,N,12318.87569,W,0.030,,170322,,,A*7D
$GNRMC,020556.10,A,4828.05509,N,12318.87570,W,0.040,,170322,,,A*73
$GNRMC,020556.20,A,4828.05508,N,12318.87571,W,0.018,,170322,,,A*7D
$GNRMC,020556.30,A,4828.05508,N,12318.87572,W,0.043,,170322,,,A*71
$GNRMC,020556.40,A,4828.05508,N,12318.87573,W,0.058,,170322,,,A*7D
$GNRMC,020556.50,A,4828.05508,N,12318.87573,W,0.017,,170322,,,A*77
$GNRMC,020556.60,A,4828.05509,N,12318.87573,W,0.047,,170322,,,A*70
$GNRMC,020556.70,A,4828.05510,N,12318.87572,W,0.041,,170322,,,A*7E
$GNRMC,020556.80,A,4828.05510,N,12318.87573,W,0.075,,170322,,,A*77
$GNRMC,020556.90,A,4828.05511,N,12318.87572,W,0.066,,170322,,,A*74
dat <- read.csv(text=txt, head=FALSE)
dat
#--------------
V1 V2 V3 V4 V5 V6 V7 V8 V9 V10 V11 V12 V13
1 $GNRMC 20555.9 A 4828.055 N 12318.88 W 0.059 NA 170322 NA NA A*7E
2 $GNRMC 20556.0 A 4828.055 N 12318.88 W 0.030 NA 170322 NA NA A*7D
3 $GNRMC 20556.1 A 4828.055 N 12318.88 W 0.040 NA 170322 NA NA A*73
4 $GNRMC 20556.2 A 4828.055 N 12318.88 W 0.018 NA 170322 NA NA A*7D
5 $GNRMC 20556.3 A 4828.055 N 12318.88 W 0.043 NA 170322 NA NA A*71
6 $GNRMC 20556.4 A 4828.055 N 12318.88 W 0.058 NA 170322 NA NA A*7D
7 $GNRMC 20556.5 A 4828.055 N 12318.88 W 0.017 NA 170322 NA NA A*77
8 $GNRMC 20556.6 A 4828.055 N 12318.88 W 0.047 NA 170322 NA NA A*70
9 $GNRMC 20556.7 A 4828.055 N 12318.88 W 0.041 NA 170322 NA NA A*7E
10 $GNRMC 20556.8 A 4828.055 N 12318.88 W 0.075 NA 170322 NA NA A*77
11 $GNRMC 20556.9 A 4828.055 N 12318.88 W 0.066 NA 170322 NA NA A*74
Я нашел описание формата файла в https://docs.novatel.com/OEM7/Content/Logs/GPRMC.htm
Итак, время равно V2, а скорость в узлах равна V8:
dat$V8
# [1] 0.059 0.030 0.040 0.018 0.043 0.058 0.017 0.047 0.041 0.075 0.066
Приложение: Хотя я ответил на конкретные вопросы о времени и скорости, я остался озадачен кодированием широты и долготы. Я думаю, что это может быть закодировано как
Декабрь Мин. 3857.5634N09515.92890W ддмм.мммм дддмм.мммм
Таким образом, широта будет 48 градусов, 28,055 минут северной широты, а долгота 123 градуса 18,88 минут западной долготы, так что это будет недалеко от стадиона Сентенниал в Виктории, Британская Колумбия, Канада. См. https://www.earthpoint.us/convert.aspx для примеров других параметров формата lat long.
Эффектная находка формата, IRTFM, хорошая работа. Я согласен с вашей интерпретацией широты и долготы ... Я не могу сказать, что когда-либо видел это представление раньше, но оно имеет смысл и должно быть достаточно простым для обработки OP с операторами %/%
и %%
.
Стратегия поиска формата файла заключалась в том, чтобы включить «$ GNRMC» с GPS. Поиск форматов lat-long был немного более трудоемким. Не уверен, что понимаю предложение использовать операторы по модулю для анализа кодировки минут в градусах, поскольку на самом деле это не одиночные числа. Я бы представил себе использование gsub("^(\\d{2}", "\\1 ", lat)
и gsub("^(\\d{3}", "\\1 ", long)
это тоже может работать, предполагая, что либо (а) ничто не является однозначной степенью, либо (б) они 0-дополняют. В отсутствие этого, поскольку V4
и V6
кажутся numeric
, достаточно использовать lon = V6 %/% 100 + (V6 %% 100)/60
и аналогичные для lat
., что приводит к формату DD.DDDD
в десятичных градусах.
Но если они являются строковыми, а строковые операции предпочтительнее, то я, вероятно, извлеку выгоду из предположения, что всегда используются 2-значные целые минуты (плюс десятичные), и позволю градусам быть переменными, аля strcapture("^(.+)(..\\..*)", dat$V6, list(deg=0, min=0))
, а затем преобразовать в любой формат, который предпочтительнее для фактические расчеты.
Почти уверен, что они 0 pad.
Я думаю, что презумпция «строки», возможно, спорна, как если бы вы просто использовали для этого read.*
, R по умолчанию должен быть числовым, что делает менее эффективным использование регулярных выражений для его анализа, предпочитая операторы %/%
/%%
. В любом случае, хорошая находка.
ХОРОШО. Предполагалось, что вы используете базу 90 или 180. Простое использование базы 100 для выделения или удаления первых двух цифр может быть успешным, если вы находитесь достаточно далеко от экватора и Гринвича.
Я думаю, что у нас разные взгляды на формат DDMM.MMM
... я предполагаю, что если мы уберем DD
(или 0D
или DDD
) слева, то MM.MMM
будет просто десятичной минутой. Почему на это влияет близость к экватору/меридиану?
Я думал, что начальный 0 - это проблема, когда слишком близко к экватору или Гринвичу, а не к расчету минут. Проверив только сейчас, я понял, что это не так.
Я не вижу проблемы. Если V4 = c(4828.055, 828.055)
, то исходный V4 %/% 100 + (V4 %% 100)/60
производит то, что я предполагаю правильным: [1] 48.467583 8.467583
.
Теперь я согласен. Извините за шум. 0857.5634 %/% 100 [1] 8
Не проблема! Не шум. Подтверждение того, что я понял проблему (не то, чтобы мне нужно было решить ее как таковую). Возможно, ОП увидит эти комментарии и воспримет их как предложения о том, как продолжить использование данных для других нужд.
Отличные навыки гугления. Я вычислил приблизительную схему, но отказался от поиска точной спецификации после нескольких попыток, полагая, что если я не нашел ее сейчас, то это должен быть закрытый формат, который не был бы общедоступным.
@AllanCameron Похоже, существует множество возможных форматов: anavs.com/knowledgebase/nmea-format определяется начальным $-элементом
@IRTFM спасибо вам за это! мог бы сказать, что это были координаты, но не понял бы, что в этом формате файла скорость указывается в узлах. Большое тебе спасибо
Это является файл csv. Вам просто нужно выяснить, что означают разные поля. Я не думаю, что
.gp
является стандартным форматом файла. Я предполагаю, что первое поле — это устройство, второе — представление времени, четвертое — широта, шестое — долгота.