E N D
PostGIS - открытое решение для хранения и обработки пространственных данных в базе данных Александр Клешнин Харьков, Intetics Co
Содержание • Теоретический обзор • Что такое PostGIS? • Стоимость/функциональность пространственных баз данных • Функции/возможности PostGIS • Практическая демонстрация • Установка PostgreSQL/PostGIS • Импорт данных в пространственную базу данных • Выполнение запросов расчета длины/площади • Пространственные индексы • Создание функции PostGIS • Выполнение запросов обновления атрибутивных данных в слое • Создание объектов через SQL запрос • Экспорт данных из пространственной базы данных
Open Geospatial Consortium (OGC) http://www.opengeospatial.org/
СУБД для пространственных данных • Проприетарные решения: • Oracle Spatial • MS SQL Server 2008 • Informix Spatial Blade • DB2 Spatial Extender • ArcSDE (SDE – Spatial Database Engine) • Свободные решения: • PostgreSQL/PostGIS • SQLite/SpatiaLite • MySQL/Spatial
Стоимость & функциональность Стоимость Функциональность
Что такое PostGIS? • PostGIS – расширение СУБД PostgreSQL для хранения в базе данных географических данных • экономически эффективная альтернатива Oracle Spatial & Locator, IBM DB2Spatial, Informix Spatial DataBlade, Microsoft SQL Server • PostGIS – GPL Open Source Project
PostGIS объекты • OpenGIS Simple Features for SQL Objects • POINT, LINESTRING, POLYGON, MULTIPOINT, MULTILINESTRING, MULTIPOLYGON, GEOMETRYCOLLECTION • OpenGIS Simple Features for SQL Representations • AsText( ) Well-Known Text • POINT(24) • MULTILINESTRING((-128 45,-128 46),(-130 50,-131 55)) • AsBinary( ) Well-Known Binary • 000000000140000000000000004010000000000000
Геопроцессинг с PostGIS PostGIS функции (~300)доступны посредством SQL • Функции управления • Функции геометрической связи • Функции обработки геометрии • Функции измерения • AddGeometryColumn • DropGeometryColumn • ST_SetSRID • ST_Distance • ST_DWithin • ST_Intersects • ST_Touches • ST_Crosses • ST_Within • ST_Buffer • ST_Intersection • ST_Union • ST_Centroid • ST_ConvexHull • ST_Difference • ST_Area • ST_Length • ST_Distance_Spheroid
Практическая работа: структура системы/ПО • Сервер БД • Пользователи
Установка PostgreSQL / PostGIS PostgreSQL PostGIS http://www.postgresql.org/ http://postgis.refractions.net/
pgAdmin – инструмент управления БД PostgreSQL/PostGIS SELECT version() || ' ' || postgis_full_version();
Созданиепользователей Administrator - admin User - gis -- Role: admin -- DROP ROLE admin; CREATE ROLE admin LOGIN ENCRYPTED PASSWORD 'md5f6fdffe48c908deb0f4c3bd36c032e72' SUPERUSER INHERIT CREATEDB CREATEROLE REPLICATION CONNECTION LIMIT 5; -- Role: gis -- DROP ROLE gis; CREATE ROLE gis LOGIN ENCRYPTED PASSWORD 'md5d1eac6a9b9835a37d71bac718a80a7ac' NOSUPERUSER INHERIT NOCREATEDB NOCREATEROLE NOREPLICATION CONNECTION LIMIT 100;
Созданиепространственной базы данных -- Database: template_postgis_20 -- DROP DATABASE template_postgis_20; CREATE DATABASE template_postgis_20 WITH OWNER = postgres ENCODING = 'UTF8' TABLESPACE = pg_default LC_COLLATE = 'Russian_Russia.1251' LC_CTYPE = 'Russian_Russia.1251' CONNECTION LIMIT = -1; ALTER DATABASE template_postgis_20 SET search_path = "$user", public, topology; База данных - database
Импорт shp-файлов в базу данных PostGIS • SQL команды • shp2pgsql // PostGIS 2.0 Shapefile and DBF Loader Exporter (GUI) • ogr2ogr • (OGR – свободная библиотека для работы с векторнымиданными) • SPIT (Quantum GIS Tool) • ESRI’s Data Interoperability extension ($) shp2pgsql -s 2964 lakes.shp lakes_new | psql gis_data ogr2ogr -f PostgreSQL PG:"host=localhost user=admin dbname=database password=admin" streets.shp;
Исходные данные http://gis-lab.info/qa/geosample.html
Исходные данные • admin • oopt • poi-osm • road-l-osm • settlements
pgAdmin – выделение прав • admin
Поле геометрии в таблицах • SELECT ST_AsText(the_geom) FROM "poi-osm";
SQL-window для пользовательских запросов
Вычисление длины линейных объектов --length in kilometers SELECT "NAME" AS name, ST_Length_Spheroid("road-l-osm".the_geom,'SPHEROID["WGS 84",6378137,298.257223563]')/1000 AS length FROM "road-l-osm"; --sum length in kilometers SELECT Sum(ST_Length_Spheroid("road-l-osm".the_geom,'SPHEROID["WGS 84",6378137,298.257223563]')/1000) AS sum_length FROM "road-l-osm";
Вычисление длины линейных объектов по АТД SELECT m."NAME", sum(ST_Length_Spheroid(r.the_geom,'SPHEROID["WGS 84",6378137,298.257223563]'))/1000 AS roads_km FROM "road-l-osm" AS r, "admin" AS m WHERE ST_Intersects(m.the_geom, r.the_geom) GROUP BY m."NAME" ORDER BY m."NAME"
Пространственные индексы • B-Tree • R-Tree • GiST CREATE INDEX [indexname] ON [tablename] USING GIST ( [geometryfield] );
Вычисление длины линейных объектов по АТД + GiST -- Index: "sidx_road-l-osm_the_geom« -- DROP INDEX "sidx_road-l-osm_the_geom"; CREATE INDEX "sidx_road-l-osm_the_geom" ON "road-l-osm" USING gist (the_geom);
Создание колонки и запись значений площади
Таблица атрибутов слоя с площадями для объектов
Создание пространственной таблицы “poi” -- Table: poi CREATE TABLE "poi" ( gid serial NOT NULL, "NAME" character varying(64), the_geom geometry(Point,4326), CONSTRAINT "poi_pkey" PRIMARY KEY (gid) ) WITH ( OIDS=FALSE ); ALTER TABLE "poi" OWNER TO admin; GRANT ALL ON TABLE "poi" TO admin; GRANT ALL ON TABLE "poi" TO public; -- Sequence: poi_gid_seq ALTER TABLE "poi_gid_seq" OWNER TO admin; GRANT ALL ON TABLE "poi_gid_seq" TO admin; GRANT ALL ON TABLE "poi_gid_seq" TO public;