Так, в медицине речь пойдет о человеческом теле, в сельском хозяйстве — о плодородных угодьях и т.д. Различаются обычно лишь число измерений (сравним, к примеру, трехмерные игры и план квартиры), требования к качеству и динамика описываемой модели.
Метеорологу понадобится более сложная и распределенная система, чем те инструменты, которыми пользуется специалист по застройке. Но все эти задачи базируются на СУПБД (Система управления пространственными базами данных).
Такие известные их поставщики, как IBM и Oracle, давно уже предоставили необходимые программные расширения к своим коммерческим СУБД, которые позволяют эффективно хранить и обрабатывать пространственную информацию. Но есть и специализированное ПО, изначально созданное и оптимизированное для решения конкретных пространственных задач. В данной статье будет рассмотрено решение на базе самой продвинутой из бесплатных СУБД — PostgreSQL.
Поддержка пространственных моделей на уровне СУБД обеспечивает возможность оперировать такими объектами, как точки, линии и многоугольники, а также определять расстояния и пересечения. И как всегда, при работе с большими массивами данных может потребоваться индексация каких-то параметров.
Давайте сначала разберемся со стандартами и терминологией. Ведущие производители программного обеспечения, для того чтобы выработать единый промышленный стандарт для географических информационных систем (ГИС), основали в 1994 г. консорциум открытых ГИС-технологий (Open Geospatial Consortium, OGC). Выработанный к 2004 г. стандарт получил название OpenGIS. Требования к функционалу, взятые из этого стандарта и заложенные в архитектуру пространственных расширений СУБД, — это только часть правил, касающихся серверной стороны решений.
Спецификации, разработанные OGC, делятся на две группы: абстрактную (Abstract Specification), описывающую фундаментальные принципы построения ГИС, и детальные, предназначенные для разработки программного обеспечения (Implementation Specification). При ознакомлении с ними нельзя не заметить, что OpenGIS, в значительной степени ориентированный на веб-решения, охватывает все технологические уровни, связанные с обработкой, хранением, транспортировкой и представлением пространственных данных (http://www.opengeospatial.org/).
Модель, предложенная консорциумом, состоит из базового класса GEOMETRY, от которого порождаются четыре основных класса: Point (простые 0-мерные объекты), Curve (простые 1-мерные объекты), Surface (простые 2-мерные объекты) и GeometryCollection (составные объекты). Эти классы позволяют проводить различные операции со своими экземплярами. Большинство распространенных в настоящее время реляционных СУБД (например, PostgreSQL, MySQL, Oracle и MSSQL) в той или иной мере поддерживают указанные стандарты.
PostGIS — объектно-реляционное расширение для СУБД PostgreSQL (http://postgis.refractions.net/) . Как PostGIS, так и PostgreSQL — программное обеспечение, распространяемое с открытым исходным кодом. Использование PostgreSQL/PostGIS позволяет хранить данные в виде пространственных объектов, делать пространственные запросы и применять пространственные индексы (http://gis-lab.info/qa/postgis-compare.html).
PostgreSQL будет хорошо себя чувствовать в среде и Mandriva, и Vista, но мы для простоты установим это хозяйство в среде Windows XP. Сейчас в Сети легко найти рекомендации по установке PostgreSQL на базе пакета postgresql-8.3.7-1.zip, но проект постоянно развивается, и другие варианты инсталляции впоследствии могут оказаться более актуальными.
Исчерпывающая информация об установке PostGIS имеется на тематическом сайте http://gis-lab.info/.
Там дана пошаговая инструкция, однако не беспокойтесь, если какие-то шаги не будут соответствовать вашему варианту развития событий. Основная интрига при установке PostGIS — обязательное добавление в операционную систему отдельного пользователя непосредственно для самого PostgreSQL.
Для инсталляции PostGIS можно воспользоваться входящей в пакет утилитой Stack Builder, и тогда после нескольких «кликов» на вашем компьютере появится полноценный инструментарий для разработчика пространственных решений, включающий и пространственную базу данных postgis. Попробуем сохранить в нее какую-нибудь информацию. Сначала создадим обычную таблицу:
CRE
ATE TABLE gtest
(ID int4, name varchar(20));
Мы не станем указывать для таблицы первичный ключ.
А теперь добавим не совсем обычный столбец:
SEL
ECT AddGeometryColumn
('', 'gtest', 'geom', -1, 'LINESTRING', 2);
В запросе укажем имя базы данных (пустые кавычки означают, что используется текущая база), имя таблицы (gtest), имя нового столбца (geom), уникальный идентификатор системы координат в пределах базы данных, тип пространственного объекта (LINESTRING) и пространственную размерность столбца (два, три или четыре измерения). После этого добавим в нашу таблицу первую запись о пространственном объекте:
INSERT INTO gtest
(ID, NAME, GEOM)VALUES(
1, 'Первая геометрия',
Geom
FromText('LINESTRING
(2 3,4 5,6 5,7 8)',-1));
Linestring — это одномерный объект, представляющий собой последовательность точек и соединяющих их линейных сегментов. Такой объект может быть сформирован как минимум двумя разными точками, что легко проверить на опыте. В стандарте OGC этот класс (подкласс класса Curve) имеет еще два подкласса: Line (ломаная из одного звена, т. е. отрезок) и LinearRing (замкнутая ломаная без самопересечений).
Извлечем имеющуюся в таблице информацию:
SEL
ECT id, name, AsText(geom)
AS geom FROM gtest;
Вместо функции AsText() можно написать AsBinary(), и в результате на выходе получим не языковое представление, а более экзотический вариант.
При работе с пространственными объектами могут возникнуть различные задачи:
-
поиск каких-либо объектов, попавших в нужную область пространства;
-
поиск объектов, пересекаемых лучом;
-
поиск ближайшего объекта, пересекаемого заданным лучом;
-
поиск точки касания объектов;
-
поиск числа объектов, ближайших к заданному.
Как обычно, при больших массивах данных метод простого перебора оказывается неэффективным, вследствие чего возникает задача индексации. Речь идет о так называемых пространственных индексах (spatial index). В контексте обсуждаемого примера создание подобного индекса может выглядеть так:
CRE
ATE INDEX gtest_idx
ON gtest USING btree
(geom btree_geometry_ops);
Стоит уделить определенное внимание и средствам создания клиентских приложений. Если ваша цель — графическое отображение пространственной информации, то вам нужно реализовать два программных уровня: механизм работы с пространственными данными, хранящимися в базе, и само средство отображения этих данных. Когда автор статьи попытался найти готовые (коммерческие и некоммерческие) решения для клиентской поддержки PostGIS в среде Windows, то у него сразу возникли проблемы.
Дело в том, что средств для прямого доступа к пространственным данным обнаружить практически не удалось. На форумах программисты советуют использовать для доступа к PostGIS обычные виртуальные таблицы View, чтобы еще на уровне сервера преобразовывать данные формата PostGIS в простейшие типы данных. Конечно же, это напоминает изобретение колеса. Кажется, будто вся технология «заточена» только на MapServer (http://gis-lab.info/qa/postgis-mapserver.html), т. е. на среду визуализации пространственных данных для Web. Тем не менее на sourceforge.net можно отыскать примеры работы в PostGIS на Java, Visual Basic и PHP, а на www.codeproject.com есть реализации провайдера для .NET на C# c примером его использования.
Впрочем, результаты нашего труда не вызвали удовлетворения — их почти не видно! В таком случае можно воспользоваться мощной и одновременно простой в работе утилитой Quantum GIS, собранной на базе кросс-платформенной библиотеки Qt. Эта программа, распространяющаяся на основе бесплатной лицензии (GNU), позволяет работать и обмениваться растровой и векторной пространственной информацией, расположенной на локальном диске, в базе данных и в Сети. Но самое интересное заключается в том, что такая утилита как раз и создана для работы с базами формата PostGIS.
Теперь попробуем визуализировать наш пространственный Hello World! — на выходе у нас должны получиться каракули. Предварительно проверим настройку на базу данных: Добавить слой PostGIS•Изменить•Проверить соединение.
Затем жмем на кнопку «Подключить» и вводим пароль на нашу пространственную базу данных. Если у нас действительно есть эта база и мы не ошиблись с паролем, то после совершенных действий в списке аплета «Добавить таблицы PostGIS», в котором мы настраивали путь к базе, появляется перечень доступных из базы таблиц. В данном случае это будет gtest.
Стоит заметить, что интерфейс программы составлен максимально дружелюбно — она сама анализирует, какие столбцы таблицы имеют геометрические типы, а на следующем шаге (щелкаем мышью на единственной подсвеченной строке с полем геометрии — geom) появляются элементы визуального построителя SQL-запроса. Но сейчас это не нужно, и потому жмем на «Добавить», чтобы получить в рабочем пространстве программы Quantum GIS геометрический объект в виде ломаной линии.
Если будут ошибки, не удивляйтесь: к этому времени к таблице gtest надо было добавить первичный ключ J.
В заключение следует отметить такую замечательную возможность программы Quantum GIS, как импорт SHP-файлов, хранящих пространственную информацию. И все это можно комбинировать со слоями из разных источников данных.
Чтобы не создалось впечатления, будто речь идет об игре в одни ворота, сразу нужно отметить существование утилиты shp2pgsql (http://postgis.refractions.net/documentation/manual-1.3/ch04.html), умеющей импортировать SHP-файл прямо в базу данных. Аналогичные утилиты имеются и для других СУБД.
Последняя проверка настройки на базу перед долгожданной визуализацией