Ukázky geometrií

From Wikivyuka
Revision as of 16:42, 1 August 2014 by Dur30 (talk | contribs) (Složené geometrie)

Jump to: navigation, search

Pro vyjasnění kódů používaných v Spatial Oracle pro různé tvary geometrií použijeme příklad z dokumentace Oracle a prvky zobrazíme v prostředí Prohlížeče.

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))
);
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))
);

COMMIT;

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.

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

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 );

create index sp_t1_idx on t1(g) indextype is mdsys.spatial_index;