Difference between revisions of "Ukázky geometrií"

From Wikivyuka
Jump to: navigation, search
m
m (Validace geometrií a jejich vizualizace)
 
(18 intermediate revisions by the same user not shown)
Line 1: Line 1:
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.
+
Příklad s geometriemi převzat z dokumentace ORACLE [http://docs.oracle.com/cd/B28359_01/appdev.111/b28400/sdo_objrelschema.htm#BGHDGCCE Several Two-Dimensional Geometry Types]. Vizualizace všech vložených tvarů je předvedena na obrázku: [[Media:SeveralGeometries.png | 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.
 
Vytvoření jednoduché tabulky, kde ''i'' je identifikační číslo objektu, ''d'' obsahuje název objektu, ''g'' představuje tvar vkládané geometrie.
Line 9: Line 9:
 
  );
 
  );
  
 +
=====Jednoduché geometrie=====
 
Vkládání bodu.
 
Vkládání bodu.
 
  INSERT INTO t1 (i, d, g)
 
  INSERT INTO t1 (i, d, g)
Line 43: Line 44:
 
     sdo_ordinate_array (10,35, 15,40, 20,35, 25,30, 30,35))
 
     sdo_ordinate_array (10,35, 15,40, 20,35, 25,30, 30,35))
 
  );
 
  );
 
=====Složené geometrie=====
 
  
Vložení složeného prvku - z rovných linií a oblouků, tvoří horizontální U.
+
Vložení uzavřeného řetězce linií.
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))
 
);
 
 
Vložení složeného prvku - uzavřeného řetězce linií.
 
 
  INSERT INTO t1 (i, d, g)
 
  INSERT INTO t1 (i, d, g)
 
  VALUES (7, 'Closed line string',
 
  VALUES (7, 'Closed line string',
Line 66: Line 57:
 
   sdo_geometry (2002, null, null, sdo_elem_info_array (1,2,2),  
 
   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))
 
     sdo_ordinate_array (15,65, 10,68, 15,70, 20,68, 15,65))
);
 
 
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))
 
 
  );
 
  );
  
Line 93: Line 78:
 
   sdo_geometry (2003, null, null, sdo_elem_info_array (1,1003,2),  
 
   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))
 
     sdo_ordinate_array (15,115, 20,118, 15,120, 10,118, 15,115))
 +
);
 +
 +
[http://gis.vsb.cz/wikivyuka/index.php/Prostorov%C3%A9_datab%C3%A1ze_-_cvi%C4%8Den%C3%AD 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))
 
  );
 
  );
  
Line 191: Line 194:
 
  );
 
  );
  
 +
Vložení "rámečku." Nejprve je zadán polygon s externí hranicí, poté s interní.
 
  INSERT INTO t1 (i, d, g)
 
  INSERT INTO t1 (i, d, g)
 
  VALUES (27, 'Polygon with void',
 
  VALUES (27, 'Polygon with void',
Line 197: Line 201:
 
  );
 
  );
  
 +
Vložení rámečku "naopak." Nejprve je zadán polygon s interní hranicí, poté externí.
 
  INSERT INTO t1 (i, d, g)
 
  INSERT INTO t1 (i, d, g)
 
  VALUES (28, 'Polygon with void - reverse',
 
  VALUES (28, 'Polygon with void - reverse',
Line 203: Line 208:
 
  );
 
  );
  
 +
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 [http://docs.oracle.com/cd/B28359_01/appdev.111/b28400/sdo_objgeom.htm#BGHFDDBF Popis validace geometrií].
 
  INSERT INTO t1 (i, d, g)
 
  INSERT INTO t1 (i, d, g)
 
  VALUES (29, 'Crescent (straight lines) * INVALID 13349',
 
  VALUES (29, 'Crescent (straight lines) * INVALID 13349',
Line 210: Line 216:
 
  );
 
  );
 
   
 
   
 +
Vložení geometrií s chybou - obdoba předchozího případu.
 
  INSERT INTO t1 (i, d, g)
 
  INSERT INTO t1 (i, d, g)
 
  VALUES (30, 'Crescent (arcs) * INVALID 13349',
 
  VALUES (30, 'Crescent (arcs) * INVALID 13349',
Line 217: Line 224:
 
  );
 
  );
  
 +
Vložení kolekce různorodých prvků - bodu, linie, polygonu.
 
  INSERT INTO t1 (i, d, g)
 
  INSERT INTO t1 (i, d, g)
 
  VALUES (31, 'Heterogeneous collection',
 
  VALUES (31, 'Heterogeneous collection',
Line 224: Line 232:
 
  );
 
  );
  
 +
Vložení kolekce polygonů s "ostrovem" dotýkající se "břehu". Viz obrázek [[Media:CompoundElementsWithTouch.png | Kolekce polygonů]].
 
  INSERT INTO t1 (i, d, g)
 
  INSERT INTO t1 (i, d, g)
 
  VALUES (32, 'Polygon+void+island touch',
 
  VALUES (32, 'Polygon+void+island touch',
Line 233: Line 242:
 
  );
 
  );
  
COMMIT;
+
[http://gis.vsb.cz/wikivyuka/index.php/Prostorov%C3%A9_datab%C3%A1ze_-_cvi%C4%8Den%C3%AD 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.
  
Příklad s geometriemi převzat z dokumentace ORACLE [http://docs.oracle.com/cd/B28359_01/appdev.111/b28400/sdo_objrelschema.htm#BGHDGCCE Several Two-Dimensional Geometry Types]. Vizualizace všech vložených tvarů je předvedena na obrázku: [[Media:SeveralGeometries.png | Vložené geometrie]].
+
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>]
  
SELECT i, d, SDO_GEOM.VALIDATE_GEOMETRY_WITH_CONTEXT (g, 0.5) FROM t1;
+
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
 +
);
  
insert into user_sdo_geom_metadata VALUES ('t1', 'g',
+
Po vytvoření prostorového indexu
SDO_DIM_ARRAY(sdo_dim_element('X',0,100,0.05),
+
CREATE INDEX sp_t1_idx on t1(g) INDEXTYPE is mdsys.spatial_index;
sdo_dim_element('Y',0,200,0.05)),
+
jsme schopni v prostředí GeoRaptoru zobrazit všechny geometrie.
NULL
 
);
 
  
create index sp_t1_idx on t1(g) indextype is mdsys.spatial_index;
+
[http://gis.vsb.cz/wikivyuka/index.php/Prostorov%C3%A9_datab%C3%A1ze_-_cvi%C4%8Den%C3%AD Hlavní stránka předmětu]

Latest revision as of 17:08, 1 August 2014

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