Difference between revisions of "Nahrnuto"
m |
m (→Podpora indexu typu GiST v PostGISu) |
||
(4 intermediate revisions by the same user not shown) | |||
Line 1: | Line 1: | ||
Prevzato z http://postgres.cz/wiki/PostGIS_pro_v%C3%BDvoj%C3%A1%C5%99e | Prevzato z http://postgres.cz/wiki/PostGIS_pro_v%C3%BDvoj%C3%A1%C5%99e | ||
+ | |||
Tabulky spatial_ref_sys a geometry_columns. | Tabulky spatial_ref_sys a geometry_columns. | ||
− | 01 ------------------------------------------------------------------- | + | 01 ------------------------------------------------------------------- |
− | 02 -- SPATIAL_REF_SYS | + | 02 -- SPATIAL_REF_SYS |
− | 03 ------------------------------------------------------------------- | + | 03 ------------------------------------------------------------------- |
− | 04 CREATE TABLE spatial_ref_sys ( | + | 04 CREATE TABLE spatial_ref_sys ( |
− | 05 srid integer not null primary key, | + | 05 srid integer not null primary key, |
− | 06 auth_name varchar(256), | + | 06 auth_name varchar(256), |
− | 07 auth_srid integer, | + | 07 auth_srid integer, |
− | 08 srtext varchar(2048), | + | 08 srtext varchar(2048), |
− | 09 proj4text varchar(2048) | + | 09 proj4text varchar(2048) |
− | 10 ); | + | 10 ); |
− | 11 | + | 11 |
− | 12 ------------------------------------------------------------------- | + | 12 ------------------------------------------------------------------- |
− | 13 -- GEOMETRY_COLUMNS | + | 13 -- GEOMETRY_COLUMNS |
− | 14 ------------------------------------------------------------------- | + | 14 ------------------------------------------------------------------- |
− | 15 CREATE TABLE geometry_columns ( | + | 15 CREATE TABLE geometry_columns ( |
− | 16 f_table_catalog varchar(256) not null, | + | 16 f_table_catalog varchar(256) not null, |
− | 17 f_table_schema varchar(256) not null, | + | 17 f_table_schema varchar(256) not null, |
− | 18 f_table_name varchar(256) not null, | + | 18 f_table_name varchar(256) not null, |
− | 19 f_geometry_column varchar(256) not null, | + | 19 f_geometry_column varchar(256) not null, |
− | 20 coord_dimension integer not null, | + | 20 coord_dimension integer not null, |
− | 21 srid integer not null, | + | 21 srid integer not null, |
− | 22 type varchar(30) not null, | + | 22 type varchar(30) not null, |
− | 23 CONSTRAINT geometry_columns_pk primary key ( | + | 23 CONSTRAINT geometry_columns_pk primary key ( |
− | 24 f_table_catalog, | + | 24 f_table_catalog, |
− | 25 f_table_schema, | + | 25 f_table_schema, |
− | 26 f_table_name, | + | 26 f_table_name, |
− | 27 f_geometry_column ) | + | 27 f_geometry_column ) |
− | 28 ) WITH OIDS; | + | 28 ) WITH OIDS; |
+ | |||
+ | ==Podpora indexu typu GiST v PostGISu== | ||
+ | |||
+ | Indexy typu R-tree jsou specifické právě pro prostorová vícedimenzionální data (a pro ně byly navrženy). Aktuální verze PostgreSQL nabízí již další generaci této třídy databázových indexů a to tzv. GiST (Generalized Search Tree) indexy. Jejich princip je stejný, širší je ale jejich uplatnění. GiST indexy se v PostgreSQL používají pro fulltext, indexování obsahu polí, vlastní podporu hiearchických dat a také samozřejmě pro geometrické typy. | ||
+ | |||
+ | Jak již bylo zmíněno, R-tree index předpokládá, že indexovaná data budou mít minimálně dvě dimenze. Index má stromovou strukturu, a každý nekoncový uzel obsahuje jednak odkaz na své potomky a hlavně geometrii nejmenšího pravoúhlého n-rozměrného tělesa obsahujícího všechny potomky. | ||
+ | |||
+ | GiST je aplikační rozhraní, které umožňuje implementaci libovolného typu indexu: B-tree, R-tree. Výhodou GiST indexů je možnost vytvoření doménově specifických indexů vázaných na vlastní typy vývojářům znalým doménové oblasti bez toho, aby se nutně staly databázovými specialisty (Rozhodně ale implementace GiST indexu nepatří mezi triviální programování). Ukázkovým příkladem je použití GiST indexu v PostGISu. Kritériem, které se použije pro rozhodování, zda-li použít B-tree index nebo GiST index jsou operace, které chceme urychlit indexem. Pokud nám postačuje množina binárních operátorů <, =, >, pak je na místě uvažovat o B-tree indexu. V opačném případě nezbývá než použít GiST index, který je obecnější než B-tree index. | ||
+ | |||
+ | Prostorové indexy se dají použít i pro klasická data. Jednodimenionální data se ale musí předtím převést na vícedimenzionální. Ukázkovým případem selhání jednodimenzionálního případu je následující příklad. Mějme databázi událostí popsanou časem zahájení (start_time) a časem ukončení (end_time). Pokud budeme chtít vypsat události, které probíhaly v určitém čase napíšeme dotaz s podmínkou | ||
+ | |||
+ | ==Tvorba bodových dat== | ||
+ | |||
+ | --create language 'plpgsql'; | ||
+ | drop function createPosition(); | ||
+ | create function createPosition() returns integer AS | ||
+ | $$ | ||
+ | DECLARE | ||
+ | updated INTEGER = 0; | ||
+ | row_data src_pos%ROWTYPE; | ||
+ | BEGIN | ||
+ | FOR row_data IN SELECT * FROM src_pos | ||
+ | LOOP | ||
+ | INSERT INTO dest_pos (coord) VALUES (ST_GeomFromText('POINT(row_data.longitude row_data.latitude row_data.altitude)', 4326)); | ||
+ | updated := updated + 1; | ||
+ | END LOOP; | ||
+ | RETURN updated; | ||
+ | END; | ||
+ | $$ | ||
+ | LANGUAGE 'plpgsql'; | ||
+ | |||
+ | ST_GeomFromText('POINT(' || row_data.longitude || ' ' || row_data.latitude || ' ' || row_data.altitude || ')', 4326) | ||
+ | |||
+ | |||
+ | [http://gis.vsb.cz/wikivyuka/index.php/Prostorov%C3%A9_datab%C3%A1ze_-_cvi%C4%8Den%C3%AD#PostgreSQL_a_PostGIS Zpět na postgis] |
Latest revision as of 15:45, 8 February 2015
Prevzato z http://postgres.cz/wiki/PostGIS_pro_v%C3%BDvoj%C3%A1%C5%99e
Tabulky spatial_ref_sys a geometry_columns.
01 ------------------------------------------------------------------- 02 -- SPATIAL_REF_SYS 03 ------------------------------------------------------------------- 04 CREATE TABLE spatial_ref_sys ( 05 srid integer not null primary key, 06 auth_name varchar(256), 07 auth_srid integer, 08 srtext varchar(2048), 09 proj4text varchar(2048) 10 ); 11 12 ------------------------------------------------------------------- 13 -- GEOMETRY_COLUMNS 14 ------------------------------------------------------------------- 15 CREATE TABLE geometry_columns ( 16 f_table_catalog varchar(256) not null, 17 f_table_schema varchar(256) not null, 18 f_table_name varchar(256) not null, 19 f_geometry_column varchar(256) not null, 20 coord_dimension integer not null, 21 srid integer not null, 22 type varchar(30) not null, 23 CONSTRAINT geometry_columns_pk primary key ( 24 f_table_catalog, 25 f_table_schema, 26 f_table_name, 27 f_geometry_column ) 28 ) WITH OIDS;
Podpora indexu typu GiST v PostGISu
Indexy typu R-tree jsou specifické právě pro prostorová vícedimenzionální data (a pro ně byly navrženy). Aktuální verze PostgreSQL nabízí již další generaci této třídy databázových indexů a to tzv. GiST (Generalized Search Tree) indexy. Jejich princip je stejný, širší je ale jejich uplatnění. GiST indexy se v PostgreSQL používají pro fulltext, indexování obsahu polí, vlastní podporu hiearchických dat a také samozřejmě pro geometrické typy.
Jak již bylo zmíněno, R-tree index předpokládá, že indexovaná data budou mít minimálně dvě dimenze. Index má stromovou strukturu, a každý nekoncový uzel obsahuje jednak odkaz na své potomky a hlavně geometrii nejmenšího pravoúhlého n-rozměrného tělesa obsahujícího všechny potomky.
GiST je aplikační rozhraní, které umožňuje implementaci libovolného typu indexu: B-tree, R-tree. Výhodou GiST indexů je možnost vytvoření doménově specifických indexů vázaných na vlastní typy vývojářům znalým doménové oblasti bez toho, aby se nutně staly databázovými specialisty (Rozhodně ale implementace GiST indexu nepatří mezi triviální programování). Ukázkovým příkladem je použití GiST indexu v PostGISu. Kritériem, které se použije pro rozhodování, zda-li použít B-tree index nebo GiST index jsou operace, které chceme urychlit indexem. Pokud nám postačuje množina binárních operátorů <, =, >, pak je na místě uvažovat o B-tree indexu. V opačném případě nezbývá než použít GiST index, který je obecnější než B-tree index.
Prostorové indexy se dají použít i pro klasická data. Jednodimenionální data se ale musí předtím převést na vícedimenzionální. Ukázkovým případem selhání jednodimenzionálního případu je následující příklad. Mějme databázi událostí popsanou časem zahájení (start_time) a časem ukončení (end_time). Pokud budeme chtít vypsat události, které probíhaly v určitém čase napíšeme dotaz s podmínkou
Tvorba bodových dat
--create language 'plpgsql'; drop function createPosition(); create function createPosition() returns integer AS $$ DECLARE updated INTEGER = 0; row_data src_pos%ROWTYPE; BEGIN FOR row_data IN SELECT * FROM src_pos LOOP INSERT INTO dest_pos (coord) VALUES (ST_GeomFromText('POINT(row_data.longitude row_data.latitude row_data.altitude)', 4326)); updated := updated + 1; END LOOP; RETURN updated; END; $$ LANGUAGE 'plpgsql';
ST_GeomFromText('POINT(' || row_data.longitude || ' ' || row_data.latitude || ' ' || row_data.altitude || ')', 4326)