Как использовать BNA-файл

Андрей Колесов
(декабрь 1999 года)


Наш читатель Игорь Гончаров из Томска прислал письмо, где обратил внимание на такую проблему:

"Прочитал в вашей статье, что Surfer 6.0 позволяет использовать файлы формата [.BNA] (Atlas Boundary) для ввода данных при расчете GRID. Но все мои попытки запустить на интерполяцию подготовленный векторизатором файл изолиний в формате .BNA не увенчались успехом. Как же тут быть?"

По-видимому, мы не очень точно описали возможности использования BNA-файлов. Эти файлы применяются для описания векторных данных (точек и линий) и имеют следующий формат для описания одного объекта:


"Pname", "Sname", Type/Length, x1, y2, ...xn, yn

где Pname и Sname — два идентификатора объекта, а Type/Length определяет тип объекта и число пар последующих за ним точек (x,y):

В стандартном варианте BNA-файл может использоваться только для обозначения линейных границ (то есть в том же качестве, что и BLN-файлы — традиционный формат Golden Software для описания границ) или для нанесения точечных изображений в POST-картах.

В то же время BNA-формат используют многие программы-векторизаторы для хранения данных о точечном считывании координат с помощью дигитайзеров. В частности, это могут быть координаты изолиний, которые хотелось бы использовать для получения GRID-файла.

Surfer не позволяет напрямую преобразовывать такой BNA-файл в формат DAT. Но для решения этой задачи можно использовать простую утилиту, код которой на Basic приведен на листинге 1. Этот код можно использовать как в Visaul Basic, так и в QBasic/DOS, который входит в состав всех операционных систем Windows (кроме NT).

Эта программа позволяет преобразовывать данные об изолиниях, представленные в форматах BNA (кроме объектов-эллипсов, которые в этом случае просто не нужны) в DAT-файлы. Обратите внимание, что для хранения величины параметра изолинии в утилите используется Pname (первый идентификатор объекта). Очевидно, что достаточно просто написать аналогичную программу для преобразования BLN-файлов.

Листинг 1. Утилита Line-Dat и пример преобразования форматов


DEFINT I-N
   ' Утилита Line-Dat.exe (вариант для MS DOS, QBasic)
   '
   ' Преобразование файлов BNA в формат DAT
   ' ===========================
   ' Подразумечается, что файлы BNA содержат
   ' информацию о значениях функции в виде описания изолиний.
   ' Каждая изолиния представлена в виде отдельного объекта и
   ' значение параметра (число) записано
   ' в качестве первого имени объекта
   ' ===================
   '
   ' Обращение к утилите: LINE-DAT.EXE LineFile [.BNA]
   ' Результат записывается в файл LineFile.DAT
   '
   FileInp$ = COMMAND$: IF FileInp$ = "" THEN STOP
   Ins = INSTR(FileInp$, ".")
   FileOut$ = LEFT$(FileInp$, Ins) + "dat"
   OPEN "i", #1, FileInp$
   OPEN "o", #2, FileOut$
   '
   DO WHILE NOT EOF(1)
     INPUT #1, Pname$: IF EOF(1) THEN EXIT DO
     INPUT #1, Sname$: IF EOF(1) THEN EXIT DO
     INPUT #1, iTypeLength
     IF iTypeLength = 2 THEN
       PRINT "Ошибка! В BNA-файле нельзя использовать эллипсы!"
       STOP
     END IF
     Yr = VAL(Pname$): iCount = ABS(iTypeLength)
     FOR i = 1 TO iCount
       INPUT #1, x, y: PRINT #2, x; y; Yr
     NEXT
   LOOP
   CLOSE
END

Пример преобразования данных

В начало статьи