PostGIS - open solution for storing and processing of spatial data in the databaseAlexander Kleshnin, Kharkiv, Intetics Co
Презентация с семинара "ГИС и заповедные территории - 2013" http://pzf.gis.kh.ua
Kleshnin A. PostGIS-open solution for spatial data-database
1. PostGIS - открытое решение для хранения и обработки
пространственных данных в базе данных
Александр Клешнин
Харьков, Intetics Co
2. Содержание
Теоретический обзор
Что такое PostGIS?
Стоимость/функциональность пространственных баз данных
Функции/возможности PostGIS
Практическая демонстрация
Установка PostgreSQL/PostGIS
Импорт данных в пространственную базу данных
Выполнение запросов расчета длины/площади
Пространственные индексы
Создание функции PostGIS
Выполнение запросов обновления атрибутивных данных в слое
Создание объектов через SQL запрос
Экспорт данных из пространственной базы данных
6. Что такое PostGIS?
PostGIS – расширение СУБД PostgreSQL для хранения в базе данных
географических данных
экономически эффективная альтернатива Oracle Spatial & Locator, IBM
DB2 Spatial, Informix Spatial DataBlade, Microsoft SQL Server
PostGIS – GPL Open Source Project
7. 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(2 4)
• MULTILINESTRING((-128 45,-128 46),(-130 50,-131 55))
AsBinary( ) Well-Known Binary
• 000000000140000000000000004010000000000000
8. Геопроцессинг с PostGIS
Функции управления
Функции геометрической связи
Функции обработки геометрии
Функции измерения
• ST_Distance
• ST_DWithin
• ST_Intersects
• ST_Area
• ST_Length
• ST_Distance_Spheroid
• ST_Buffer
• ST_Intersection
• ST_Union
• ST_Touches
• ST_Crosses
• ST_Within
• AddGeometryColumn
• DropGeometryColumn
• ST_SetSRID
PostGIS функции (~800) доступны посредством SQL
• ST_Centroid
• ST_ConvexHull
• ST_Difference
37. Вычисление длины линейных объектов
--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";
38. Вычисление длины линейных объектов по АТД
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"
40. Вычисление длины линейных объектов по АТД + 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);
47. Создание пространственной таблицы “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;
50. Обновление количества объектов “poi” в слое “oopt”
--ALTER TABLE "oopt" ADD COLUMN count INTEGER;
UPDATE "oopt" t
SET
count = calc.objectscount
FROM (
SELECT
m."NAME_PRT_R",
count(*) AS objectscount
FROM
"poi" AS r,
"oopt" AS m
WHERE ST_Intersects(m.the_geom, r.the_geom)
GROUP BY
m."NAME_PRT_R"
) calc
WHERE t."NAME_PRT_R" = calc."NAME_PRT_R";