Использование OpenGIS на практике
Спецификация 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 инструмент на самом деле удобный, а при правильном использовании индексов еще и быстрый.
