Организация файлов цифровых карт

Напомним, что основными составляющими геопространственных данных являются геометрическая и атрибутивная характеристики. Геометрическая составляющая геопространственных данных хранится, как правило, в бинарном файле. Следует отметить, что общепринятого стандарта таких файлов не существует. С учётом того, что полностью универсальных ГИС не бывает, а многие ГИС разрабатываются под определённую задачу или узкий круг задач, вопрос о принятии единого стандарта файлов для хранения геометрической составляющей геопространственных данных представляется нецелесообразным. Любой разработчик может использовать собственный стандарт, причём если он сделает его открытым, то конвертировать данные в другой открытый стандарт не составит труда. Основное, что нужно учитывать при использовании различных форматов хранения данных – мобильность структуры, т.е. возможность свободной корректировки содержания и быстрый доступ к данным. Несмотря на то, что дефицит ёмкости носителей информации на сегодняшний день утратил свою актуальность, при разработке собственного стандарта следует так же обращать внимание на компактность записи данных и минимальное число пустых байтов в структуре файлов.

Для хранения атрибутивной составляющей геопространственных данных используются, как правило, базы данных. Причём в зависимости от уровня сложности ГИС могут использоваться как не связанные между собой таблицы (наиболее часто используемый формат dBASE), так и многоуровневые реляционные базы данных. Отметим так же, что некоторые ГИС используют таблицы для записи как атрибутивных, так и геометрических данных, однако это скорее исключение из общего правила.

В качестве примера рассмотрим способ организации записи данных в ГИС ArcView. ArcView создаёт следующие файлы:

.apr – файл проекта

.shp – файл пространственных данных

.shx – индексный файл к файлу пространственных данных

.dbf – файл формате dBASE для хранения атрибутивных таблиц

.sbn, .sbx – файлы, в которых храняться пространственные индексы. Эти файлы создаются в ходе некоторых операций с пространственными данными, например, при объединении слоев (тем);

.ain, .aih - файлы, в которых хранятся атрибутивные индексы активных полей таблицы или атрибутивной таблицы. Эти файлы создаются в ходе некоторых операций над таблицами, например, при объединении таблиц

В ГИС ArcView структура Карта хранится в файле .apr. Это обычный ASCII файл, т.е. текстовый файл, который можно редактировать в любом текстовом редакторе. В файле .apr хранится информация о названии проекта, размерах и расположении окон ArcView, масштабе и др. Основное, на что следует обратить внимание в этом файле – список тем, входящих в проект с их полными путями. При смене директории или логического диска, доступ к темам, входящим в проект теряется, и появляются сообщения об ошибках. В фале .apr хранятся также атрибуты тем: тип темы, цвет, стиль и т.д.

Структура Слой в ArcView хранится в так называемом шейпфайле (shapefile). Этот формат данных был введён в программном продукте ArcView GIS Version 2. Shapefiles не содержат топологической надстройки, они имеют ряд преимуществ перед другими источниками данных, например, более быстрая отрисовка и возможность редактирования. Shapefiles работают с объектами, которые могут перекрываться или совсем не соприкасаться. Они обычно требуют меньшей дисковой памяти и более просты при чтении и записи. Shapefiles работают с объектами в форме точек, линий и полигонов. Полигоны должны быть представлены в виде замкнутых фигур. Атрибутивные данные содержатся в формате dBase. Рассмотрим подробнее структуру shapefile.

Техническое описание shapefiles

Shapefiles ArcView GIS состоит из главного файла .shp, индексного файла .shx и таблицы dBase. Главный файл - это файл прямого доступа, содержащий записи переменной длинны, каждая из которых описывает объект при помощи списка вершин. В индексном файле каждая запись содержит смещение соответствующей записи в главном файле относительно начала главного файла. Таблица dBase содержит атрибуты объектов. Только одна строка таблицы соответствует только одному объекту в главном файле. Соответствие «один к одному» между атрибутами и объектами основывается на номере записи. Номер записи атрибутов в таблице dBase должен быть таким же, как и номер записи в главном файле. Главный файл, индексный файл и dBase-файл должны иметь одно и то же имя.

Shapefiles содержат числовые данные как integer (целое) и double precision (плавающее с двойной точностью)

Integer: 32-битное целое со знаком ( 4 байта)

Double: 64-битное IEEE плавающее с двойной точностью (8 байт).

Главный файл содержит заголовок файла фиксированной длины, за которым следуют записи переменной длины. Каждая запись переменной длины состоит из заголовка записи фиксированной длины, за которым следует содержимое строки переменной длины. Рис. 1 иллюстрирует организацию главного файла.

Рис.1 Организация главного файла

Заголовок Файла
Заголовок Файла Содержимое строки
Заголовок Файла Содержимое строки
Заголовок Файла Содержимое строки
Заголовок Файла Содержимое строки
...  
...  
Заголовок Файла Содержимое строки

Порядок байтов в integers и double-precision integers, составляющих описание данных в заголовке файла (определенном выше) и в содержимом строк в главном файле, - малый. Порядок байтов в integers и double-precision integers, из которых состоит остаток файла, - большой.

(Прим.: Большой порядок байтов - порядок байтов слева направо в целых словах. Малый порядок байтов - порядок байтов справа налево в целых словах.)

Заголовок главного файла

Длина заголовка главного файла - 100 байт. В Таблице 1 показаны поля, их положение в байтах относительно начала файла, и порядок байтов.

Таблица 1 Описание заголовка главного файла

Позиция Поле Значение Тип Порядок байтов
         
Байт 0 Код файла Integer Большой
Байт 4 Не исполь. Integer Большой
Байт 8 Не исполь. Integer Большой
Байт 12 Не исполь. Integer Большой
Байт 16 Не исполь. Integer Большой
Байт 20 Не исполь. Integer Большой
Байт 24 Длина файла Длина файла Integer Большой
Байт 28 Версия Integer Малый
Байт 32 Тип объекта Тип объекта Integer Малый
Байт 36 Границы Xmin Double Малый
Байт 44 Границы Ymin Double Малый
Байт 52 Границы Xmax Double Малый
Байт 60 Границы Ymax Double Малый
Байт 68 Не исполь. Integer Большой
... ... ... ... ...
... ... ... ... ...
Байт 0 Не исполь. Integer Большой
         

Значение длины файла есть общая длина файла, измеренная в 16-битных словах (включая 50 16-битных слов, которые составляют заголовок).

Все объекты в shapefile должны быть одного и того же типа. Величины типов должны быть такими:

Величина Тип Объекта
Точка
Дуга
Полигон
Набор точек
   

Заголовок записи

Заголовок для каждой записи содержит номер записи и длину содержимого записи. Заголовок записи имеет фиксированную длину 8 байт. В Таблице 2 показаны поля заголовка записи, их позиции относительно начала файла, величины и порядок байтов.

Таблица 2. Описание заголовка Записей главного файла

Позиция   Поле Значение   Тип     Порядок байтов
               
Байт 0   Номер записи Номер записи     Integer   Большой
               
Байт 4     Длина содерж. Длина содерж.     Integer   Большой
         

Номера записей начинаются с 1.

Длина содержимого записи измеряется в 16-битных словах. Каждая запись, следовательно, составляет (4 + длина содержимого) 16-битных слов, и такие записи расположены вплоть до конца файла, длина которого хранится в 24-м байте заголовка файла.

Содержимое записи shapefile состоит из типа объекта, за которым следуют геометрические данные объекта. Длина содержимого записи зависит от количества частей и вершин объекта. Для каждого типа объекта мы сначала опишем сам объект, а затем его соотношение с содержимым записи на диске. В Таблицах 3-6 позиция относится к началу содержимого записи.

Точка

Точка состоит из пары чисел double-precision в порядке X, Y.

Point

{

Double X //Координата X

Double Y //Координата Y

}

Таблица 3. Содержимое записи Точка

Позиция Поле Значение Тип Кол-во Порядок байтов
           
Байт 0 Тип Объекта Integer Малый
           
Байт 4 X X Double Малый
           
Байт 12 Y Y Double Малый
           

Набор точек

Набор точек представляет собой:

MultiPoint

{

Double[4] Box//Граничный прямоуг.

Integer NumPoints //Количество точек

Point[NumPoints] Points //Точки в наборе

}

(Прим.: NumPoints - количество пар X, Y, содержащихся в shape (в объекте ))

Граничный прямоугольник записывается в следующем порядке: Xmin, Ymin, Xmax, Ymax.

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

Таблица 4 Содержимое записи Набор точек

Позиция Поле Значение Тип Кол-во     Порядок байтов
             
Байт 0 Тип Объекта Integer   Малый
             
Байт 4 Box Box Double   Малый
Байт 36 NumPoints NumPoints Integer   Малый
Байт 40 Points Points Points NumPoints   Малый

Дуга

Дуга Shapefile может состоять из набора полилиний, которые не обязательно стыкуются друг с другом. Полилиния есть упорядоченный набор вершин. Каждая полилиния является частью дуги.

Arc

{

Double[4] Box //Граничный прямоуг.

Integer NumParts //Количество частей

Integer NumPoints //Общее кол-во точек

Integer[NumParts] Parts //Индекс первой точки в части

Point[NumPoints] Points //Точки для всех частей

}

Поля дуги детально описаны ниже:

Box Граничный прямоугольник для дуги, записанный в порядке Xmin, Ymin, Xmax, Ymax.
NumParts: Количество полилиний в дуге
NumPoints: Общее количество точек для всех полилиний.
Parts: Массив длиной NumParts. содержит индекс первой точки в массиве точек для каждой полилинии. Массив индексов начинается с 0.
Points: Массив длиной NumPoints. Точки каждой полилинии в дуге хранятся друг за другом. Точки полилинии 2 следуют за точками полилинии 1 и так далее. Массив частей (Parts) содержит индекс начальной точки для каждой полилинии. Нет никакого разделителя в массиве точек между полилиниями.

Таблица 5 Содержимое записи Дуга

Позиция Поле   Значение   Тип Кол-во     Порядок байтов
Байт 0 Тип Объекта       Integer   Малый
Байт 4 Box   Box   Double   Малый
Байт 36 NumPoints   NumPoints   Integer   Малый
Байт 40 NumPoints   NumPoints   Integer   Малый
Байт X Points   Points   Point NumPoints    
Примечание: X = 44 + 4 * NumParts        
                       

Полигон

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

Структура полигона идентична структуре дуги:

Polygon

{

Double[4] Box //Граничный прямоуг.

Integer NumParts //Количество частей

Integer NumPoints //Общее кол-во точек

Integer[NumParts] Parts //Индекс первой//Точки в части

Point[NumPoints] Points //Точки для всех частей

}

Поля для Полигона детально описаны ниже:

Box: Граничный прямоугольник для полигона, записанный в порядке Xmin, Ymin, Xmax, Ymax.
NumParts: Количество контуров в полигоне
NumPoints: Общее количество точек для всех контуров
Parts: Массив длиной NumParts. содержит индекс первой точки в массиве точек для каждого контура . Массив индексов начинается с 0.
Points: Массив длиной NumPoints. Точки каждого контура в полигоне хранятся друг за другом. Точки контура 2 следуют за точками контура 1 и так далее. Массив частей (parts) содержит индекс начальной точки для каждого контура. Нет никакого разделителя в массиве точек между контурами.

Таблица 6 Содержимое записи Полигон

Позиция Поле Значение Тип   Кол-во Порядок байтов
             
Байт 0 Тип Объекта Integer   Малый
             
Байт 4 Box Box Double   Малый
Байт 36 NumParts NumParts Integer   Малый
Байт 40 NumPoints NumPoints Integer   Малый
Байт X Points Points Point   NumPoints  
           
Примечание: X = 44 + 4 * NumParts      
                   

Организация индексного файла

Индексный файл содержит 100-байтный заголовок, за которым следуют 8-байтные записи фиксированной длины. Рис. 3 иллюстрирует организацию индексного файла

Рис. 3 Организация индексного файла

Заголовок файла
Запись  
Запись  
Запись  
Запись  
...  
...  
Запись  

Заголовок индексного файла

Заголовок индексного файла идентичен по организации заголовку главного файла, описанному выше. Длина файла, хранящаяся в заголовке файла, есть общая длина индексного файла, измеренная в 16-битных словах. (Пятьдесят 16-битных слов самого заголовка плюс 4 умножить на количество строк).

Записи индексного файла

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

Таблица 7. Описание заголовка Записей главного файла

Позиция Поле Значение Тип     Порядок байтов
           
Байт 0 Номер записи Номер записи Integer   Большой
           
Байт 4 Длина содерж. Длина содерж. Integer   Большой

Смещение записи в главном файле есть количество 16-битных слов от начала главного файла до первого байта заголовка записи для этой записи. Таким образом, смещение первой записи главного файла равно 50, что есть 100-байтный заголовок файла Содержимое записи, хранимое в записи индексного файла, имеет ту же величину, что и содержимое записи, хранимое в заголовке записи главного файла.

Наши рекомендации