29
05/2009

Использование OpenGIS на практике

The English version of this post

Спецификация OpenGIS на практике оказывается не так уж и сложна. К ее недостаткам, пожалуй, можно приписать только то, что нужно потратить час на ее изучение.

Покажу на примере, как ее использовать с применением PostGIS. Допустим, нам нужно хранить простую политическую карту России (области и города) и предоставлять некоторый функционал работы с этой картой.

Создадим пространственно-совместимую БД на базе предоставляемого с PostGIS шаблона.

postgres=# CREATE DATABASE my_spatial_db TEMPLATE=template_postgis;  

Создадим таблицы хранения областей и городов.

CREATE TABLE region ( id integer PRIMARY KEY, title character varying(255) NOT NULL ); 
CREATE TABLE city ( id integer PRIMARY KEY, title character varying(255) NOT NULL );

Добавим пространственные столбцы с помощью функции OpenGIS «AddGeometryColumn». Города для простоты сделаны точками.

SELECT AddGeometryColumn('region', 'coords', 128, 'POLYGON', 2 ); 
SELECT AddGeometryColumn('city', 'coords', 128, 'POINT', 2 );

Первый параметр – название таблицы, второй – название столбца, третий – уникальный идентификатор системы координат (Spatial Referencing System, SRS) в пределах базы данных, четвертый – тип геометрического объекта, пятый – количество измерений.

Далее заполняем таблицы тестовыми данными, и собственно все :)

Попробуем извлечь что-нибудь интересное:

1.  Все города Саратовской области

SELECT city.title FROM city WHERE ST_Within(city.coords, 
    (SELECT region.coords FROM region WHERE region.title = 'Саратовская область'));

2. Области, граничащие с Саратовской областью

SELECT r1.title FROM region r1 WHERE ST_Touches(r1.coords, 
    (SELECT r2.coords FROM region r2 WHERE r2.title = 'Саратовская область'));

3. Расстояние между 2-мя городами

SELECT ST_Distance(
    (SELECT c1.coords FROM city c1 WHERE c1.title = 'Москва'),
    (SELECT c2.coords FROM city c2 WHERE c2.title = 'Санкт-Петербург'));

4. Все города в пределах указанного расстояния от Москвы

SELECT c1.title FROM city c1 WHERE ST_DWithin(c1.coords, 
    (SELECT c2.coords FROM city c2 WHERE c2.title = 'Москва'), 500);

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

OpenGIS инструмент на самом деле удобный, а при правильном использовании индексов еще и быстрый.  

Оставить comment
Показать другие цифры

В тексте комментария можно использовать теги <b><i><u><s><sup><code><pre>.
Адреса сайтов автоматически становятся ссылками.

_