Ukázky geometrií

From Wikivyuka
Jump to: navigation, search

Příklad s geometriemi převzat z dokumentace ORACLE Several Two-Dimensional Geometry Types. Vizualizace všech vložených tvarů je předvedena na obrázku: Vložené geometrie.

Vytvoření jednoduché tabulky, kde i je identifikační číslo objektu, d obsahuje název objektu, g představuje tvar vkládané geometrie.

CREATE TABLE t1 (
 i NUMBER,
 d VARCHAR2(50),
 g SDO_GEOMETRY
);
Jednoduché geometrie

Vkládání bodu.

INSERT INTO t1 (i, d, g)
VALUES (1, 'Point',
 sdo_geometry (2001, null, null, sdo_elem_info_array (1,1,1), 
   sdo_ordinate_array (10,5))
);

Vložení jednoduché linie.

INSERT INTO t1 (i, d, g)
VALUES (2, 'Line segment',
 sdo_geometry (2002, null, null, sdo_elem_info_array (1,2,1), 
   sdo_ordinate_array (10,10, 20,10))
);

Vložení liniové křivky - vykresluje jako oblouk spojující tří zadané body.

INSERT INTO t1 (i, d, g)
VALUES (3, 'Arc segment',
 sdo_geometry (2002, null, null, sdo_elem_info_array (1,2,2), 
   sdo_ordinate_array (10,15, 15,20, 20,15))
);

Vložení třísegmentové linie.

INSERT INTO t1 (i, d, g)
VALUES (4, 'Line string',
 sdo_geometry (2002, null, null, sdo_elem_info_array (1,2,1), 
   sdo_ordinate_array (10,25, 20,30, 25,25, 30,30))
);

Vložení dvoukřivkové linie s napojením ve společném bodě.

INSERT INTO t1 (i, d, g)
VALUES (5, 'Arc string',
 sdo_geometry (2002, null, null, sdo_elem_info_array (1,2,2), 
   sdo_ordinate_array (10,35, 15,40, 20,35, 25,30, 30,35))
);

Vložení uzavřeného řetězce linií.

INSERT INTO t1 (i, d, g)
VALUES (7, 'Closed line string',
 sdo_geometry (2002, null, null, sdo_elem_info_array (1,2,1), 
   sdo_ordinate_array (10,55, 15,55, 20,60, 10,60, 10,55))
);

Vložení složeného prvku - dva oblouky se spolu dotýkají v koncových bodech. Geometrie má stejný tvar jako prvek s id=12.

INSERT INTO t1 (i, d, g)
VALUES (8, 'Closed arc string',
 sdo_geometry (2002, null, null, sdo_elem_info_array (1,2,2), 
   sdo_ordinate_array (15,65, 10,68, 15,70, 20,68, 15,65))
);

Vložení křížících se linií.

INSERT INTO t1 (i, d, g)
VALUES (10, 'Self-crossing line',
 sdo_geometry (2002, null, null, sdo_elem_info_array (1,2,1), 
   sdo_ordinate_array (10,85, 20,90, 20,85, 10,90, 10,85))
);

Vložení polygonu.

INSERT INTO t1 (i, d, g)
VALUES (11, 'Polygon',
 sdo_geometry (2003, null, null, sdo_elem_info_array (1,1003,1), 
   sdo_ordinate_array (10,105, 15,105, 20,110, 10,110, 10,105))
);

Vložení polygonu složeného ze dvou tříčtvrtěkruhů. Geometrie má stejný tvar jako prvek s id=8.

INSERT INTO t1 (i, d, g)
VALUES (12, 'Arc polygon',
 sdo_geometry (2003, null, null, sdo_elem_info_array (1,1003,2), 
   sdo_ordinate_array (15,115, 20,118, 15,120, 10,118, 15,115))
);

Hlavní stránka předmětu

Složené geometrie

Vložení složeného prvku - z rovných linií a oblouků, tvoří horizontální U.

INSERT INTO t1 (i, d, g)
VALUES (6, 'Compound line string',
 sdo_geometry (2002, null, null, 
   sdo_elem_info_array (1,4,3, 1,2,1, 3,2,2, 7,2,1), 
   sdo_ordinate_array (10,45, 20,45, 23,48, 20,51, 10,51))
);
INSERT INTO t1 (i, d, g)
VALUES (9, 'Closed mixed line',
 sdo_geometry (2002, null, null, sdo_elem_info_array (1,4,2, 1,2,1, 7,2,2), 
   sdo_ordinate_array (10,78, 10,75, 20,75, 20,78, 15,80, 10,78))
);

Vložení složeného polygonu.

INSERT INTO t1 (i, d, g)
VALUES (13,  'Compound polygon',
 sdo_geometry (2003, null, null, sdo_elem_info_array (1,1005,2, 1,2,1, 7,2,2), 
   sdo_ordinate_array (10,128, 10,125, 20,125, 20,128, 15,130, 10,128))
);

Vložení obdélníka - je definován dvěmi diagonálními vrcholy.

INSERT INTO t1 (i, d, g)
VALUES (14, 'Rectangle',
 sdo_geometry (2003, null, null, sdo_elem_info_array (1,1003,3), 
   sdo_ordinate_array (10,135, 20,140))
);

Vložení kruhu.

INSERT INTO t1 (i, d, g)
VALUES (15, 'Circle',
 sdo_geometry (2003, null, null, sdo_elem_info_array (1,1003,4), 
   sdo_ordinate_array (15,145, 10,150, 20,150))
);

Vložení mračna bodů. Vizuální tvar je stejný jako u prvku s id=17.

INSERT INTO t1 (i, d, g)
VALUES (16, 'Point cluster',
 sdo_geometry (2005, null, null, sdo_elem_info_array (1,1,3), 
   sdo_ordinate_array (50,5, 55,7, 60,5))
);

Vložení složeného elementu z několika bodů. Vizuální tvar je stejný jako u prvku s id=16.

INSERT INTO t1 (i, d, g)
VALUES ( 17, 'Multipoint',
 sdo_geometry (2005, null, null, sdo_elem_info_array (1,1,1, 3,1,1, 5,1,1), 
   sdo_ordinate_array (65,5, 70,7, 75,5))
);

Vložení složeného elementu - ze dvou linií.

INSERT INTO t1 (i, d, g)
VALUES (18, 'Multiline',
 sdo_geometry (2006, null, null, sdo_elem_info_array (1,2,1, 5,2,1), 
   sdo_ordinate_array (50,15, 55,15, 60,15, 65,15))
);

Vložení složených elementů - ze dvou křížících se linií, dvou oblouků, uzavřených řetězců linií, dotýkajících se oblouků.

INSERT INTO t1 (i, d, g)
VALUES (19, 'Multiline - crossing',
 sdo_geometry (2006, null, null, sdo_elem_info_array (1,2,1, 5,2,1), 
   sdo_ordinate_array (50,22, 60,22, 55,20, 55,25))
);
INSERT INTO t1 (i, d, g)
VALUES (20, 'Multiarc',
 sdo_geometry (2006, null, null, sdo_elem_info_array (1,2,2, 7,2,2), 
   sdo_ordinate_array (50,35, 55,40, 60,35, 65,35, 70,30, 75,35))
);
INSERT INTO t1 (i, d, g)
VALUES (21, 'Multiline - closed',
 sdo_geometry (2006, null, null, sdo_elem_info_array (1,2,1, 9,2,1), 
   sdo_ordinate_array (50,55, 50,60, 55,58, 50,55, 56,58, 60,55, 60,60, 56,58))
);
INSERT INTO t1 (i, d, g)
VALUES ( 22,  'Multiarc - touching',
 sdo_geometry (2006, null, null, sdo_elem_info_array (1,2,2, 7,2,2), 
   sdo_ordinate_array (50,65, 50,70, 55,68, 55,68, 60,65, 60,70))
);

Vložení složeného elementu - dvou navzájem disjunktních polygonů.

INSERT INTO t1 (i, d, g)
VALUES (23, 'Multipolygon - disjoint',
 sdo_geometry (2007, null, null, sdo_elem_info_array (1,1003,1, 11,1003,3), 
   sdo_ordinate_array (50,105, 55,105, 60,110, 50,110, 50,105, 62,108, 65,112))
);

Vložení složeného elementu - dvou ve vrcholu se dotýkajících polygonů.

INSERT INTO t1 (i, d, g)
VALUES (24, 'Multipolygon - touching',
 sdo_geometry (2007, null, null, sdo_elem_info_array (1,1003,3, 5,1003,3), 
   sdo_ordinate_array (50,115, 55,120, 55,120, 58,122)) 
);

Vložení složeného elementu - dvou dotýkajících se polygonů - překryv je část společné hranice. Při kontrole validity geometrie je považováno za chybu. Viz použití metody SDO_GEOM.VALIDATE_GEOMETRY_WITH_CONTEXT.

INSERT INTO t1 (i, d, g)
VALUES (25, 'Multipolygon - tangent * INVALID 13351',
 sdo_geometry (2007, null, null, sdo_elem_info_array (1,1003,3, 5,1003,3), 
   sdo_ordinate_array (50,125, 55,130, 55,128, 60,132))
);

Vložení složeného elementu - dvou dotýkajících se polygonů - vrcholy jednoho jsou body na hranicích druhého.

INSERT INTO t1 (i, d, g)
VALUES (26, 'Multipolygon - multi-touch',
 sdo_geometry (2007, null, null, sdo_elem_info_array (1,1003,1, 17,1003,1), 
   sdo_ordinate_array (50,95, 55,95, 53,96, 55,97, 53,98, 55,99, 50,99, 50,95, 
     55,100, 55,95, 60,95, 60,100, 55,100))
);

Vložení "rámečku." Nejprve je zadán polygon s externí hranicí, poté s interní.

INSERT INTO t1 (i, d, g)
VALUES (27, 'Polygon with void',
 sdo_geometry (2003, null, null, sdo_elem_info_array (1,1003,3, 5,2003,3), 
   sdo_ordinate_array (50,135, 60,140, 51,136, 59,139))
);

Vložení rámečku "naopak." Nejprve je zadán polygon s interní hranicí, poté externí.

INSERT INTO t1 (i, d, g)
VALUES (28, 'Polygon with void - reverse',
 sdo_geometry (2003, null, null, sdo_elem_info_array (1,2003,3, 5,1003,3), 
   sdo_ordinate_array (51,146, 59,149, 50,145, 60,150))
);

Vložení geometrií s chybou, kterou je schopna najít metoda SDO_GEOM.VALIDATE_GEOMETRY_WITH_CONTEXT. Více o kontrolách chyb v geometriích viz dokumentace Oracle Popis validace geometrií.

INSERT INTO t1 (i, d, g)
VALUES (29, 'Crescent (straight lines) * INVALID 13349',
 sdo_geometry (2003, null, null, sdo_elem_info_array (1,1003,1), 
   sdo_ordinate_array (10,175, 10,165, 20,165, 15,170, 25,170, 20,165, 
     30,165, 30,175, 10,175))
);

Vložení geometrií s chybou - obdoba předchozího případu.

INSERT INTO t1 (i, d, g)
VALUES (30, 'Crescent (arcs) * INVALID 13349',
 sdo_geometry (2003, null, null, sdo_elem_info_array (1,1003,2), 
   sdo_ordinate_array (14,180, 10,184, 14,188, 18,184, 14,180, 16,182, 
     14,184, 12,182, 14,180))
);

Vložení kolekce různorodých prvků - bodu, linie, polygonu.

INSERT INTO t1 (i, d, g)
VALUES (31, 'Heterogeneous collection',
 sdo_geometry (2004, null, null, sdo_elem_info_array (1,1,1, 3,2,1, 7,1003,1), 
   sdo_ordinate_array (10,5, 10,10, 20,10, 10,105, 15,105, 20,110, 10,110,
     10,105))
);

Vložení kolekce polygonů s "ostrovem" dotýkající se "břehu". Viz obrázek Kolekce polygonů.

INSERT INTO t1 (i, d, g)
VALUES (32, 'Polygon+void+island touch',
 sdo_geometry (2007, null, null, 
   sdo_elem_info_array (1,1003,1, 11,2003,1, 31,1003,1), 
   sdo_ordinate_array (50,168, 50,160, 55,160, 55,168, 50,168,  51,167,
     54,167, 54,161, 51,161, 51,162, 52,163, 51,164, 51,165, 51,166, 51,167, 
     52,166, 52,162, 53,162, 53,166, 52,166))
);

Hlavní stránka předmětu

Validace geometrií a jejich vizualizace

K ověření správnosti geometrií můžeme použít metodu VALIDATE_GEOMETRY_WITH_CONTEXT. Výsledky jsou ve tvaru TRUE - je-li vše v pořdáku, nebo je uvedena chyba s číselným označením a stručným popisem chyby.

SELECT i, d, SDO_GEOM.VALIDATE_GEOMETRY_WITH_CONTEXT (g, 0.5) FROM t1;

Ukázka výstupu příkazu, kde jsou patrny popisy chybně zadaných geometrických tvarů.

25 Multipolygon - tangent * INVALID 13351 13351 [Element <1>] [Ring <1>][Edge <2>] [Element <2>] [Ring <1>][Edge <4>]
26 Multipolygon - multi-touch	           TRUE
27 Polygon with void	                   TRUE
28 Polygon with void - reverse	           TRUE
29 Crescent(straight lines) INVALID 13349 13349 [Element <1>] [Ring <1>][Edge <2>][Edge <5>]
30 Crescent(arcs) INVALID 13349	   13349 [Element <1>] [Ring <1>][Edge <1>][Edge <3>]

Pro vizualizaci vložených geometrií je nutné vložit informace o tabulce T1 a sloupci s DT SDO_GEOMETRY do systémové tabulky USER_SDO_GEOM_METADATA.

INSERT INTO USER_SDO_GEOM_METADATA VALUES ('t1', 'g',
SDO_DIM_ARRAY(sdo_dim_element('X',0,100,0.05),
sdo_dim_element('Y',0,200,0.05)),
NULL
);

Po vytvoření prostorového indexu

CREATE INDEX sp_t1_idx on t1(g) INDEXTYPE is mdsys.spatial_index;

jsme schopni v prostředí GeoRaptoru zobrazit všechny geometrie.

Hlavní stránka předmětu