Difference between revisions of "Nahrnuto"

From Wikivyuka
Jump to: navigation, search
m
m (Podpora indexu typu GiST v PostGISu)
 
(2 intermediate revisions by the same user not shown)
Line 31: Line 31:
 
  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) 


Zpět na postgis