суббота, 16 июня 2007 г.

PostGIS: начинаем работу с модулем пространственных операций PostGIS для СУБД PostgreSQL

PostGIS добавляет поддержку геоданных в ОР (объектно-реляционную) СУБД PostgreSQL. таким образом, PostGIS делает возможным работу сервера PostgreSQL с пространственными данными, создавая таким образом прекрасное хранилище для GIS. Примечание: PostgreSQL самостоятельно поддерживает пространственные типы данных, так что на самом деле PostGIS предоставляет скорее удобный интерфейс управления, нежели просто возможность хранения данных. В этом случае становится возможным сохранение целых векторных слоев, а не просто точек или полигонов.

PostGIS/PostgreSQL включает следующие возможности:

  • Поддержку стандартов OpenGIS Consortium (OGC)

  • Поддержку текстовых и двоичных представлений геоинформационных объектов

  • Быстрое пространственное индексирование, используя GiST

  • Функции геоанализа

  • PostgreSQL JDBC доступ к геоданным

  • Поддержку функций доступа в соответствии со спецификацией OGC



Инициализация PostGIS

Включить поддержку языка PL/pgSQL:
create function plpgsql_call_handler() returns opaque as '/usr/lib/postgresql/lib/plpgsql.so' language 'c';
create language 'plpgsql' handler plpgsql_call_handler lancompiler 'PL/pgSQL';

Загрузить функции PostGIS:
psql -d template1 -f /usr/share/doc/postgis/postgis.sql
psql -d template1 -f /usr/share/doc/postgis/spatial_ref_sys.sql

Удалить функции PostGIS:
psql -d template1 -f /usr/share/doc/postgis/postgis_undef.sql

Загрузка шейпфайлов в PostgreSQL

Дано:
векторные карты в формате шейп-файлов
Требуется:
загрузить карты в СУБД PostgreSQL
Решение:
утилита /usr/lib/postgresql/bin/shp2pgsql позволяет создать SQL-код из содержимого шейпфайла
команда shp2pgsql ./rivers.shp rivers>rivers.sql создает sql-дамп таблицы rivers согласно шейпфайлу rivers.shp в файле rivers.sql
Осталось загрузить созданную таблицу в базу:
psql -d имя_базы -f ./rivers.sql

Принцип работы PostGIS лучше всего изложен в оригинальном мануале, добавить особо нечего, кроме, разве что, некоторых хитростей.

Что касается использования PostGIS:
==========================================
#database_init.sql
drop database map;
create database map with template="template0" encoding='koi8';

\c map

CREATE FUNCTION plpgsql_call_handler() RETURNS language_handler
AS '/usr/lib/postgresql/lib/plpgsql.so', 'plpgsql_call_handler'
LANGUAGE c;

CREATE PROCEDURAL LANGUAGE plpgsql HANDLER plpgsql_call_handler;

#!/bin/sh
# create & init databases
psql -d template1 -f ./database_init.sql

# init PostGIS functions
psql -d $MAP -f postgis.sql
psql -d $MAP -f spatial_ref_sys.sql

echo "making shapefiles list in directory $MAPDIR/$MAP"
tables=`ls $MAPDIR/$MAP/*.shp|sed 's/.shp//g'|awk -F"/" '{print $NF}'`

echo "creating sql reprezentation of selected shapefiles"
for loop in $tables
do
/usr/lib/postgresql/bin/shp2pgsql -d $MAPDIR/$MAP/$loop.shp $loop>$MAPDIR/$MAP/$loop.sql
echo "$loop.shp => $loop.sql"
done

echo "loadind geospatial tables into database $MAP"
for loop in $tables
do
psql -f $MAPDIR/$MAP/$loop.sql -d $MAP
echo "loaded $loop.sql"
done
==========================================

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

См. далее
Пространственный анализ в PostGIS с использованием множества координатных систем

1 комментарий:

alexrush комментирует...

IMHO слабенько. Тема не раскрыта вовсе, ссылки на оригинал мануала в таком контексте не приветствую, ибо даже в родном мануале еще много белых пятен; он и половины сути PostGIS не описывает.
Если говорить о win-пользователях, то для них материал будет скорее вреден, чем полезен, ибо начальная установка/настройка PostgreSQL/PostGIS под Win проще, чем набрать предложение в notepad'е.


(C) Alexey Pechnikov aka MBG, mobigroup.ru