1

Как сконвертировать обатно в .wln?

Тема: Как сконвертировать обатно в .wln?

При переносе объекта ошиблись и выгрузили сообщения в Ozi .plt
теперь не может его импортировать. Не смог найти нигде конвертора чтобы превратить его в читаемый Виалоном формат обратно на импорт.

Как победить этот формат? Базовый объект уже удален..

2

Как сконвертировать обатно в .wln?

Re: Как сконвертировать обатно в .wln?

wln -- внутренний формат, поэтому конвертеров нет. Надо писать свой с учетом структуры plt:
https://www.oziexplorer4.com/eng/help/fileformats.html

Field 1 : Latitude - decimal degrees.
Field 2 : Longitude - decimal degrees.
Field 3 : Code - 0 if normal, 1 if break in track line
Field 4 : Altitude in feet (-777 if not valid)
Field 5 : Date - see Date Format below, if blank a preset date will be used
Field 6 : Date as a string
Field 7 : Time as a string
Note that OziExplorer reads the Date/Time from field 5, the date and time in fields 6 & 7 are ignored.

Example
-27.350436, 153.055540,1,-777,36169.6307194, 09-Jan-99, 3:08:14
-27.348610, 153.055867,0,-777,36169.6307194, 09-Jan-99, 3:08:14

This is the record structure of an trackpoint variable used within OziExplorer

TrackRecord = record
   Latitude:double;
   Longitude:double;
   Code:integer;
   Altitude:integer;
   Date1:TDateTime;   
   GpsObject:Tobject;
   end;

В таком файле еще и дата в формате MJD, а в wln время в unix:

  • Как сконвертировать обатно в .wln?
3

Как сконвертировать обатно в .wln?

Re: Как сконвертировать обатно в .wln?

pach пишет:

В таком файле еще и дата в формате MJD, а в wln время в unix:

Ошибся, формат даты не MJD, похоже это serial date. Сделал скрипт на баше:

+ открыть спойлер
#!/bin/bash

# Function to convert Excel serial date to Unix timestamp in seconds
serial_to_unix() {
    serial_date="$1"
    # Excel date starts from 1-Jan-1900, while Unix date starts from 1-Jan-1970
    excel_epoch=25569  # Number of days between 1-Jan-1900 and 1-Jan-1970
    seconds_per_day=86400

    # Convert the serial date to Unix timestamp and ensure integer value
    unix_time=$(echo "($serial_date - $excel_epoch) * $seconds_per_day / 1" | bc)
    echo "$unix_time"
}

# Function to convert Unix timestamp to nanoseconds (WLNTMNS)
unix_to_nanoseconds() {
    unix_time="$1"
    # Convert Unix timestamp to nanoseconds
    nanoseconds=$(echo "$unix_time * 1000000000" | bc)
    echo "$nanoseconds"
}

# Prompt user for the .plt file name
read -p "Enter the .plt file name (including extension): " plt_file

# Check if file exists
if [[ ! -f "$plt_file" ]]; then
    echo "File not found!"
    exit 1
fi

# Create output file name with .wln extension
output_file="${plt_file%.*}.wln"

# Ensure the output file is empty or created
: > "$output_file"

# Reading each line of the plt file and saving output to the .wln file
while IFS=',' read -r lat lon third altitude serial_date; do
    # Strip any leading/trailing whitespace and remove carriage return
    lat=$(echo "$lat" | tr -d '\r' | xargs)
    lon=$(echo "$lon" | tr -d '\r' | xargs)
    altitude=$(echo "$altitude" | tr -d '\r' | xargs)
    serial_date=$(echo "$serial_date" | tr -d '\r' | xargs)

    # Debugging output
    echo "Processing line: lat=$lat, lon=$lon, altitude=$altitude, serial_date=$serial_date"

    # Check if the line contains valid numeric fields for lat, lon, altitude, and serial_date
    if [[ "$lat" =~ ^-?[0-9]+(\.[0-9]+)?$ ]] && [[ "$lon" =~ ^-?[0-9]+(\.[0-9]+)?$ ]] && [[ "$altitude" =~ ^-?[0-9]+(\.[0-9]+)?$ ]] && [[ "$serial_date" =~ ^-?[0-9]+(\.[0-9]+)?$ ]]; then
        # Convert serial date to Unix timestamp
        unix_time=$(serial_to_unix "$serial_date")

        # Ensure the Unix time is not empty and is an integer
        if [[ -z "$unix_time" ]] || ! [[ "$unix_time" =~ ^[0-9]+$ ]]; then
            echo "Error converting serial date $serial_date to Unix timestamp."
            continue
        fi

        # Convert Unix timestamp to nanoseconds (WLNTMNS)
        nanoseconds=$(unix_to_nanoseconds "$unix_time")

        # Format the line and append to the output file
        echo "REG;$unix_time;$lon;$lat;0;0;ALT:$altitude;SATS:5;;WLNTMNS:$nanoseconds;;" >> "$output_file"
    else
        echo "Skipping line: lat=$lat, lon=$lon, altitude=$altitude, serial_date=$serial_date"
    fi
done < "$plt_file"

echo "Conversion completed. Output saved to $output_file."

Проверил на WH и WL 2204, конвертирует, данные импортируются успешно.

Следует учитывать, что PLT не содержит практически никакой информации кроме координат и высоты над уровнем моря. Нет там ни датчиков, ни скорости, ни направления движения. Высоту не переводил из футов (по доке Ozi футы по дефолту) в метры, это также следует учитывать.