Escolar Documentos
Profissional Documentos
Cultura Documentos
editado e organizado por Clodoveu Davis, Gilberto Câmara, Marco Antônio Casanova, e
Gilberto Ribeiro de Queiroz
com a participação de Frederico Fonseca, Karine Reis Ferreira, Karla Borges, Taciana Dias
Apresentação
Este livro tem por objetivo oferecer um panorama geral da área de Bancos de Dados
Geográficos, para servir como obra de referência. Seu público-alvo são desenvolvedores de
sistemas de geoinformação que quiserem ter uma visão detalhada do funcionamento de um banco
de dados geográfico.
/ 0
1 " " &
& & & '
&
- & , $
! &
2 & 1
'
3 . '
- 1 /
4
& 5 0 & - 2 - 5 5
1-1
6 & & 7
8
- " & 9
)*' &
. /
& / 9
• % : $ )*'
6 &
• % : )*' &$ -
; < -
/ #
• % : )*'
$
=#
(
+ # )*'
" :
. - -
( - + -
)*'
&
2 - )*'
" <
/ 2 - - -
)*' $ /-
- "
- / , & &
!
"
1-2
2 2 )*)! ; )2 * 5 ; >? ' ' @5*
()*' +
%
)*' &
/ $
/ -
&$
& & )*' # &$
)*' & - "
2 - "
&
( + 1
)*' 9
• A
• 6 A
• & "
1 - " )*' -
< -
# .
" )*' 9
#$ % &
& ' () *+,+-.
# % &
" & '( / *+,0-.
#$ 1 2
'( 3 *+,,-.
#$ 2
%
'( / 4 *+,5-4
" )*' B
- " /-
1-3
-
/- / )*' 9
• * C & "
-
&
A
• & - " -
&
- C &
- & . )*'
9
• * A
• A
• 5 " A
• D A
• ( &
& +
/-
:, / 6 2
/- )*' -
( " &
7 + /- 8
&
2 " )*'
& / :
1-4
" )*'
" & $
, - 9
• E - B ' $ .; E(
+A
• E ) #
4FF FFF GFF FFF & E( 6 +
• E; C GH
)I E( 9 +
5 44
& )*' &$ -
& - )*'
Interface
Gerência Dados
Espaciais
Banco de Dados
Geográfico
5 44. ) * '
1-5
# & & ' (
" +
/ - &
& 9
7 - 8 (' D 4JJG+ 9
• - : ( -
A
• - ( +
A
• - -
"
A
• -
& "
3 /-
- 5 44
5 4K.# -
- '
- & '
# * ) & '
&
9
• - . 6
( &
/ +A
• - ( - .
( 7
1-6
% " & " +
(
+A
• -
- "
- $
" -
A
• -
- -
. ( -
- . + -
A
& - '
( . &$ .- + - .
7"
& )*' -
/- -
- /-
:, ,
- -
% ' -
/ : . A
&
1
' *) .
- '
&$
- -
1-7
E E : 0 9
/ &$ &
&$ ' *)
& - F 4
(F L 1 4L C + $ - , /
C (KM M° KN G° KO 4° +
/- /- -
- "
- " -
- -
/- $ $ & - "
1 : &
' *) & ) - (4JG4+ "
9 " &
/- & / C
& - P -
/- - -
- - (4
L K L : +
, " - - -
/- & .
&$ ,
. 9 &
- % / /- &
- -
. /- & -
$ &
( + (4L & , KL
M L + 2
, - - /-
% / /-
P
-
- . /-
& - & . C
1-8
, /- & C 9
7" " 7" & 4 /- -
1 &
& - - - Q.∞ F R ∞S
' T 1
" & / ! , 1
& U ,
- - /- - #
1 & - /- -
"
/- & 1
& # ,
& <
- &$ / - - 1
&
1-9
& V - # 1
& /-
" "
- &
- -
, "
& & - - -
< - / - -
/- - /-
! " # "
2 - &
, -
/ & -
4K ( - - + ,
% .
% &
- " # ,
& (
- - *#!% - + "
&
&
5 4M , )
/ & . (#*0 +
1-10
PIB Pop
País
(US$ bn) (milhões)
Brasil 350 159
Argentina 295 34
Chile 45 14
!% "
' E E "
9
• ) - C& A
• (& +A
• -
&$ ( 9 & 6
+ &
& - &
"
- 6 :9 &
, & : < ( +
" &
"
5 4N
1-11
Sub-estações
id label capacidade
22 Eng. Dentro 3.000 kVA
Postes
id label Transf.
2345 32-17-95 Classe 3
5 4N.
" : .
- &
( ; !+
- -
B &
:
&
.
(0 4JOW+9
( +
A
(&+ . $ & A
1-12
( + 6 - ,
& A
( + - - / / A
( + ( & - - +
% ; !
/ $
( ;+ & &
- - / / % , ; !
4G
" # $
!! "
& E E
( E , E+
- B
/ 5 4W
& M( + N (D +
G (D + !; .X ; ( ;+
# &$
- .
1-13
/ 9 C
& ( +
/ & -
( + /-
( + -
( +
1-14
!
( ") &
'
- " 9 % (Y & Z 4JJG+
, / /
& - 6 & -
& " # , - - &
/ & -
/
&$
- # ,
/ -
& * . .
. &$ &
# . . 9
4 & & "
/ A
K & /-
&
&
($ ) *+
*4*4 < 4
2 . < /
$
-
$
(
- + &$
1-15
(% , - "
*4*4 6 4
% . & - -
-
;C " 6
- - - t1 ,t 2 ,...,tN −1 2 .
/-
& & -
< - -
. 9
• ! ; @!* . <, 6
( , .
- $ [
& \+A
• %; 3 * . 6
- ( ,
+A
• 2 2 ]) ) ] ; ! .
%; 3 * & - &
( - - + /
5 4^ , .
Le
Li
Ls
Aq
- . /
1-16
(% , ./
*4=4 6> %
% . &$ C & .
C "
, &$ /-
1 - " 9
4 ) % 9 ? $ !
/
1
& -
. &$ # ,
6 $ % !; 49KGF FFF
" /
- A
K < 9 ?
& -- "
#
, . $ /
) # (
494 FFF FFF+ ( 494FF FFF+
. &$ ( , / ) I
+ " 9 /
D # / /
494FF FFFA
=4 @ A 9 9 "
&$ - "
K
- & A
# . 5 4O
& 6 <
& _ C
1 " &
K
% ; ,.% ))
1-17
1 id nome
Amazonas
Xingu
2 id nome
1 Yanomami
3 2 Waimiri
3 Kayapó
5 4O.# / &
" - "
. & # , .
& $ "
*#!% &
. $
"
# & . % 6
*4B4 > % 6
% &$ . &$ "
&$ . &
$ )*'
, ,
5 4J . . &$ 7 8
( + $. &
. &$ $ , &
"
% 6
1-18
fazendas
cadastro
0 12 12
"
- . /- "
B -
* -. "
9 # ) ! >? D ! * X # ) ! >? ; ! * * X
- &$
- /. , /- P
1 & 9
/
& :
& . : &
& &$
D "
& 9
• 9
- A
• 9
- &
& A
• 9
- 6 : &
& A
1-19
• 9
A
• 9
( + (
- 6 :+ / ( -
+
0 - " 1) &
C
C - &
-
"
/
& 5 4 4F
(
" +
3 + $ 4
-
- " <
& ,
1-20
-
&
: B 6 #
& &
# . , & : &
- / & .
1 :
# ) ! >? ' ; 3! * ; ! * * X
5 4 44
Representação
Matricial
parte-de parte-de
5 6
/- 9
• ' 2 ' %X 9 A
• *; ' ; ; ! ) 2 * ` 9 -
- -
A
1-21
• *; ' ; ! ; @!* 9 .
! ; @!* # ,
- K 75 &: 8A
• *; ' ; )* !3!* ( 2*5 2 +9
0$ - " 1) &
0$ " "
- 1 &$
, - ' *)9 2
& " - *
- & - $ &
$ B / !
$ "
; - ' *) &
2 ' *) - - -
&
& ,
- . 1
9 ( / + %
( ;-
. ( & + -
/ $
"
-.
$ & % polígono
C $ 1 :,
1-22
& -. & / - " 9
- ( +
, , vetores
& /
& " /
- &$ #
, . &$ ,
/ & - /
& # . & &$ /
#
7 8 ; $: :
1-23
/ - 9 &
/ ) & , :
: 6 &
. &$
$ : &
&
! & &$ -
&$ . &$
- &$ ,
& &$
- "
& -
6
- & - -
)$ &$ &$
, / $ 1
/ - 9 " :
0$% - & , 2
. : -
% :
" :
< # , .
5 4 4M &
- ( &.
+
1-24
7
0$ - & , 2 ,- & 3
. :. /
) &$ - -
: & .
:
.
- -
" 5 4 4N
, :
8 7 7
1-25
0$! 4 5 - " 16 " "
# " -
' *) -. - 9
C = : C : = :
/ 7
2 . 9
• 2 2 K2 . % K2 &$
( ;%+ ε A
• 2 2 M2 . % M2 &$
( ;% &+ ( ;%+ ε A
• # ! K2 . % K2 &$ &
- K2A
• X* a K2 . % K2 & $
K2A
• *) X* a . K2 -
( +A
• * ! 2 . K2
A
• b K2 . : K2 K2 ( ;+ ε X
K2 ( . ,
+A
• b 2 . : : K2
< . <
A
• b M2 . : M2 < M2
( ; &+ K2 ( . , 1
+A
• # Xc' . / K2
: K2 - ,
" /
% - - -
& " -
5 4 4G .
(7 . 8+ < (7 . 8+
1-26
$ < (7 . 8+
< (7 . 8+
Representação
é-um Vetorial é-um
é-um é-um é-um
é-um
Conj. Pontos Grafo Subdivisão Conjunto Grade Amostras
2D Orientado Planar 2D Isolinhas Triangular 3D
conj-de conj-de
conj-de conj-de
conj-de conj-de conj-de
conj-de conj-de
conj-de
Arco
Nó Rede Polígono Isolinha
Orientado
parte-de
parte-de lista-de
" 5 6
2 . - 9
• I% ! 2 # ! ) K2 . < $
K2 " ( ,
: +A
• I% ! 2 *) X* a ) . < $
A
• )% 02*D *)? #X . & -
$ / K2 :
K2A
• ' 5 * ! 2 . <
$ : $
K2A
• ' 2 ! * ' %X . < $ :
M2 $ X K2
A
1-27
• ; # # ! )M2 . < $
M ! . $ M2
# $
& -
- A - .
# "
- " &
& * 5
4 4W
% 9 /
! & 44 -
- -
- - 9
& - $
1-28
TABELA 1.1
% $ &
7 &
- 5 4 4^ #
. -
- -
. - -
-
" -
< I - - /
& / ( D +
1-29
- ! $ :* ; < 00"
/ !* ( 1 7 T H8+
- :6
/ - $ #
1 - <
(, Z+ & - -
)*' ; !
& . 2 Z
P ,
- / - -
/
. 5 4 4O /
1-30
= ! $ # :* ; < 00"
7% - 1) - " 16 "
- , -
1 <
-
,
# - - / " -
M2 /-
! & 4K -
-
1-31
' > ?
& -
&
$ C - ( +
$ - (- +
' $ ( ()
. & - (
C & , + C &$
$ 6
* )*' -
& . : - #
& .
: &$
- & -
& .
&$
&
, - $
) ' 0 2 ()' 02+ % )' 02
&
- - / .
1-32
: 1
9 . - A
8 . " - 8 .
-
&
# - -
. / M ,
% )*' )' 02
& - &$ (
& + - "
&$
/
& . )' 02
C : - :
- & . &
)' 02 5 4 4J
1-33
0 1 /$
5 4 4J , " : :
" & (
7 ! Xa ? + & &
:
, 9
& & A C&
- A -
-
- )' 02
"
&$ )' 02
" 1
" 1 & :
- - "
)' 02
- , &
U* 5 (; 4JJK+ ;' (* 4JJF+ )# * '
( < 4JJW+
1-34
-
' "
C - "
" - " B -
&
T # & &
" - $. 'd (4JJN+
% - -
,
" .
2
0
(4JJ^+ - V - (4JJO+ & -
- .
9 ( ,9 " E6 + / ( ,9 " < <F +
( ,9 " 2 +
B
" 9
• M2 - V .2 (0 Z 4J^G+
- "
$ A
• - () 4JJF+
#
()# )+
- A
• - . (' 4JON+
-
(0 H 4JJM+
# - ( /- +
! & 4N - ,
1-35
' > ? 8
@A 99 !BA *+G*@& * '9 E * &H 9 ! A ! + A ( A + ? A
Universo do mundo Universo Universo de Universo de
real conceitual representação implementação
Mapa de vegetação Geo-campo Matriz de inteiros Quad-tree
Temático Subdivisão Planar Linhas 2D (com R-
Tree)
Mapa altimétrico Geo-campo Grade regular Matriz 2D
Numérico Grade triangular Linhas 2D e Nós 3D
Conjunto Pontos 3D Pontos 3D (KD-tree)
Conjunto Isolinhas Linhas 2D
Lotes urbanos Geo-objetos Polígonos e Tabela Linhas 2D e Nós 2D
Rede elétrica Rede Grafo Orientado Linhas 2D (com R-
Tree)
1-36
((
1-37
NAMIKAWA, L. M. Um método de ajuste de superfície para grades triangulares
considerando linhas características. (Dissertação de Mestrado em
Computação Aplicada) - Instituto Nacional de Pesquisas Espaciais, São José
dos Campos, SP, Brasil, 1995.
SAMET, H. The Design and Analysis of Spatial Data Structures. Reading, Addison-
Wesley, 1990.
STEVENS,S. Handbook of Experimental Psychology. New York, Wiley, 1951.
WORBOYS, M.F. GIS: A Computing Perspective. London, Taylor and Francis, 1995.
1-38
! "
• # $ #
• # % # ! &
' (
• #) # ' !
! *
$ )
' , ' -
. ' / %
, - 01 ' 2 3 ( 4506 (
7) 8% - &
! 9
'- &
. ( /
. ' /
, - 51 &( '
' ( '
9
'- : ;
. ( /
. ''
/ & '
-
+++ .+ + + '/ 7 '
; !
9 !
;
;
. <( /
= -
" $ &
! > '
& ,
? , @ : &
! & '
' '
A
&( ;
' ! . /
' - . ;
! / A B ! : &
' ; ! -
&
- ! ( '
) % ! ;
' ' 7 '
! '
? # $ # &
' ' .
AC / . # #
D) 82 9+/
• ' .# #/
' 7
A %D
• E # # !
. 29?= 9
D) 82 9+ B 7C ) B 7 ?F / !
,
• F 9 *
, , ; %D D) 8 ?F 9
7D ? ; G ' B , *
7 H E ? EI H D) 82 9+
• = # $ #
9 B9% D ) E9
7 H E =H %9 J + DE% 2 ?K H 2 > < LE
7 LE
• '
9 B9%
• ( ( ' !
A '
D) 8 (5 7D ?
! "# ! ! $ % &' ! # ! (
? '
! &
' '
' . C%/ -
" . / ' , '
# $ # M .'/
' A ! &
C% = C%
9
' " C% # #
! ' & , A
# $ # # #
' & -
. 7/ % '
&
D ) E9 7 LE < LE % 7 '
%9 9 D H E' ?79
) ! ! ! $ % &' ' * ! ( ! !
= . / -
' ;
9 '' , & -
; . / ,
. A , / 9 -
' * ' '
&
' ;
N ' '' -
' 7 "
' '
- . 4 111 111 ' /"
• ) 4 . ! "/" 9 '
; '
' . /
.
/ .& O /
- & 9 '
? '
-
.#' > #/ 7
- -
-
! . &/
A F Q79 9
! !
( ) A
# B # 9 D B . > /
+B .+ ' B / *
+ ' '* ! , # #
? &
7 @
N -
' -
- 2 = EC )
B 7 CQ9) H 9 D B 73 B 7 ?F ;
& + > E9 .% & '
( / %C) .% $ )/ . &
> /- ''
* ' ' ) )R R
9 - '' H E' ?
,
% M
%
- M
)
- C%
! - & !
M
F ' ) &
* ! !
SIG SIG
atributos
atributos
SGBD
Arquivos SGBD
F P 4( ! % F PP( !
? - & T " C%
' - ,
T N M
B- &
" C%
' * M
E ; L E4 "
LE
! & A ;
' C% ' ( . C% D/ 9
A ; @ ! &
C% ' (
'- C% A ,
-
7 C% D - ! A
! C%D !
= C% D ! A -
C % 9 . $ 4555/
U .455V/ "
F .H%9 /
( -
' . /M
4
L E .* + )& /" '
M '
;
; , H%9
- & . A
/ - & . /
7 - H%9 A ;
; ! & C%
; A ; ' H%9 -
- H%9 - A
D( . 450V/ L H . 450V/
A ; ' ( ; . ) 455W/ -
; T
A -
& ; N' :
!
' - - "
= (
M
=
' M
= '
' ,
9 .455V/ ; ' @
" .4/ ; !
M .P/ ; ' ! M
.X/ ; ' !
D A .P11P/ ' @ ,
, "
.P/ ; "
, .& ./ . / '
.X/ ; "
A
T , . /
A ' .) ,0 /1 ; !
, T .2 3/ * .$ /
'
' ; " ; ! A ;
A . / .6 .% / 7
; - " ; ! T
A ! T
! !
? ;
& ( & S ; ! -
; ; & 7 A
8 * 9 & @
? & 8
' ' !
-
) ! ;
; & B D ; H * C
% .9 455X/ ! -' V( ;
F PX(D ; *
) .
( & "
H " -
A (
& "
' M
? - "
A -
M
; , (
& - (
& ? E9 E
; "
; " - . '
/ - . ( / .
! ! /M
D .2 '/" ( (
, M
D .3 )/" (
!
M
F .* /" ( -
& -
, - M
7 .: . /" ( -
,
; & , (
' &
& ) A ;
, A - &
&
; & & (
' ( - 9 ;
, - T
( - ! & .
, / ? (
& ; E9 E "
Z Z B Z B A Z B Z Z 2 <
!
. ) /
! &
= 7 E 7 , .
/ = N
@ .B 7 B E B 7 , /
@ .) / = -
! '
nome_estado VARCHAR2(100),
nome_captial VARCHAR2(100),
populacao_03 NUMBER,
fronteira MDSYS.SDO_GEOMETRY
% [ HI79" ! N
" 11 . / 14 . / 1P . / 1X
. , / 1V . / 16 . / 1W . / 1Y
. , /M
% [ D %" &
@ : M
• % [ H DH ? [ FF 9H" !
% [ D% ? H9 M
• % [9HI79" M
• % [ ?H9D7D9H H ?"
% [9HI79
% [ D% ? H9 " - ! &
A D( L
& A ! !
A '
) , - ; D(
' ' (
' , T .BCD / '
- A A ;
, . ? EIZ9[DHD99/
, '
.D9C= E%/
' * B% I
' ! &
A A S
' ' "
! @ ; ' A '
9 ' " = 9D[ % [ ?%93[B9H % H
EE[ % [ ?%93[ ?F %C [ % [ ?%93[ ?F M
! @ ; ' &
' . , T
/
T 9 ' "
= 9D[ % [ 9 B[B9H % H EE[ % [ 9 B[B9H % H
%C [ % [ 9 B[B9H % H
+ / 01 / . . /
A & '
A ;
- , T .BCD/ &
A \ ' A
' !
'
A - *- '
D A
7 ;
; ! &
LE 7 ; & ! &
"
) A ;
LE , 0
$ A *A ! F PV
A @ ' & & , !
, &
A *A '
F PV() )
LE & % [D9E H9
% [C= FF9D - C% "
USER_SDO_GEOM_METADATA m
AND (SDO_RELATE(ass.zona,
SDO_GEOM.SDO_BUFFER(ar.local, m.diminfo,
' ( ! - '
% [C= FF9D & ; '
= 9D[ % [ 9 B[B9H % H
Câmara, G.; Souza, R. C. M.; Pedrosa, B.; Vinhas, L.; Monteiro A. M.; Paiva, J. A. C.
P.; Gattas, M. TerraLib: Technology in Support of GIS Innovation. 2000. II
Workshop Brasileiro de Geoinformática.
Câmara, G.; Vinhas, L.; Souza, R. C. M.; Paiva, J. A. C.; Monteiro, A. M. V.; Carvalho,
M. T.; Raoult, B. Design Patterns in GIS Development: The Terralib Experience.
2001. III Workshop Brasileiro de Geoinformática.
Gamma, E.; Helm, R.; Johnson R.; Vlissides, J. Design patterns - elements of
reusable object-oriented software. USA: Addison-Wesley, 1995.
Guttman, A. R-TREES. A Dynamic Index Structure for Spatial Searching. In: Proc.
SIGMOD Conf. Boston: ACM, 1984. p. 47-57.
IBM Corporation. DB2 Spatial Extender User's Guide and Reference[online].
<http://www-3.ibm.com> 2001.
Lassen, A. R.; Olsson, J.; Osterbye, K. Object Relational Modeling. Centre for Object
Technology (COT), 1998. 32 p.
Locke, P.; Belden, E.; Melnick J. Oracle Call Interface - Programmer’s Guide. :
Oracle Corporation , Mar. 1999. (No. A76975-01)
Mitrovic, A.; Djordjevic, S. Object-Oriented paradigm meets GIS: a new era in
spatial data management. p. 141-148, 1996. YUGIS, Beograd.
Rigaux, P.; Scholl, M.; Voisard, A. Spatial Databases with application to GIS. San
Francisco: Morgan Kaufmann , 2002. 408 p.
Samet, H. The Quadtree and Related Hierarchical Data Structures. ACM Computing
Surveys, v. 16, n. 2, p. 187-260, 1984.
Shekhar, S.; Ravada, S.; Liu, X. Spatial Databases - Accomplishments and Research
Needs. IEEE Transations on Knowledge and Data Engineering, v. 11, n. 1, Fev.
1999.
Stroustrup, B. The C++ Programming Language. USA: Addison-Wesley, 1999.
Vinhas, L.; Queiroz, G. R.; Ferreira, K. R.; Câmara, G.; Paiva, J. A. C. Programação
Genérica Aplicada a Algoritmos Geográficos. In: IV Simpósio Brasileiro de
GeoInformática. Anais. Caxambu, MG, 2002. v.1, p.117-122.
Um modelo de dados é um conjunto de conceitos que podem ser usados para descrever
a estrutura e as operações em um banco de dados [ElNa94]. O modelo busca sistematizar o
entendimento que é desenvolvido a respeito de objetos e fenômenos que serão representados
em um sistema informatizado. Os objetos e fenômenos reais, no entanto, são complexos
demais para permitir uma representação completa, considerando os recursos à disposição dos
sistemas gerenciadores de bancos de dados (SGBD) atuais. Desta forma, é necessário
construir uma abstração dos objetos e fenômenos do mundo real, de modo a obter uma forma
de representação conveniente, embora simplificada, que seja adequada às finalidades das
aplicações do banco de dados.
A abstração de conceitos e entidades existentes no mundo real é uma parte importante
da criação de sistemas de informação. Além disso, o sucesso de qualquer implementação em
computador de um sistema de informação é dependente da qualidade da transposição de
entidades do mundo real e suas interações para um banco de dados informatizado. A abstração
funciona como uma ferramenta que nos ajuda a compreender o sistema, dividindo-o em
componentes separados. Cada um destes componentes pode ser visualizado em diferentes
níveis de complexidade e detalhe, de acordo com a necessidade de compreensão e
representação das diversas entidades de interesse do sistema de informação e suas interações.
Ao longo dos anos, desde o surgimento dos primeiros SGBDs, foram criados vários
modelos de dados que apesar de muitas vezes terem a pretensão de se constituírem em
ferramentas genéricas, refletem as condicionantes tecnológicas dos SGBDs à época de sua
criação. Existem vários tipos de modelos, desde os que possuem descrições orientadas aos
usuários chamados infological até aqueles cuja principal preocupação é a representação no
computador, os datalogical. Os modelos podem ser classificados em: modelos de dados
conceituais, modelos de dados lógicos e modelos de dados físicos [ElNa94]. Os modelos de
dados lógicos, também chamados de clássicos, se destinam a descrever a estrutura de um
banco de dados apresentando um nível de abstração mais próximo das estruturas físicas de
armazenamento de dados. Uma característica desse tipo de modelo é a sua inflexibilidade,
forçando a adequação da realidade à estrutura proposta por ele. Os modelos de dados
relacional, de redes e hierárquico, exemplos de modelos lógicos, são implementados
Modelagem de Dados Geográficos
Não é surpresa se constatar que, até o aparecimento dos primeiros SIGs, praticamente
nada existia em termos de representação específica em modelo de dados, de entidades
geográficas ou espaciais. No entanto, o grau de generalidades das técnicas de modelagem de
dados permite representar estes tipos de entidades, embora com graus variados de sucesso.
Porém, apesar de toda a expressividade oferecida pelas técnicas tradicionais de modelagem de
dados, dificuldades surgem devido ao fato de que muitas informações geográficas precisam
ser consideradas com respeito à localização onde elas são válidas, o tempo de observação e a
sua precisão de obtenção/representação. A modelagem do mundo real é uma atividade
complexa porque envolve a discretização do espaço geográfico para a sua devida
representação. Inúmeros são os fatores envolvidos nesse processo de discretização do espaço.
Entre eles citamos:
• Transcrição da informação geográfica em unidades lógicas de dados - Para Goodchild
[FrGo90], o esquema de uma aplicação geográfica é uma representação limitada da
realidade, tendo em vista a natureza finita e discreta da representação nos computadores.
Por maior que seja o nível de abstração utilizado, a realidade é modelada através de
conceitos geométricos [Fran92] e, para que esses conceitos sejam implementados em
computadores, eles precisam ser formalizados, sendo necessário um maior número de
entidades geográficas com características apenas de exibição, não sendo usadas para
processamento geográfico (embora sejam parte do mapa base). Citamos como exemplo, os
textos que identificam acidentes geográficos como Serras, Picos, ou objetos como muro,
cerca viva, cerca mista e cerca que identificam a delimitação de um lote. O que será
provavelmente usado no processamento geográfico será o lote, como um polígono. Se o
lote é cercado ou não, e se a delimitação é um muro ou uma cerca, não fará diferença,
podendo ser uma informação alfanumérica associada. No entanto, a nível cartográfico é
muito utilizado o registro fiel da realidade observada, sendo considerada significativa a
visualização dessa informação. Nesse aspecto, o desenvolvimento de aplicações
geográficas difere da convencional. Como pode ser percebido, muitas entidades
geográficas poderão ser criadas no banco de dados sem que necessariamente tenham sido
representadas no esquema da aplicação.
Os primeiros modelos de dados para as aplicações geográficas eram direcionados para as
estruturas internas dos SIGs. O usuário era forçado a adequar os fenômenos espaciais às
estruturas disponíveis no SIG a ser utilizado. Consequentemente, o processo de modelagem
não oferecia mecanismos para a representação da realidade de forma mais próxima ao modelo
mental do usuário. Ficava evidente que a modelagem de dados geográficos necessitava de
modelos mais adequados, capazes de capturar a semântica dos dados geográficos, oferecendo
mecanismos de abstração mais elevados e independência de implementação.
A próxima seção apresenta alguns modelos de dados convencionais mais utilizados na
modelagem geográfica. Todo este material está fortemente baseado em [Borg97], onde podem
ser encontradas referências adicionais sobre modelagem de dados.
$ % !
• Simplicidade – O modelo deve ser simples o bastante para que os usuários possam
entender e usar, devendo possuir uma notação diagramática simples.
• Minimalidade – O modelo deve consistir num pequeno número de conceitos básicos, que
são distintos e ortogonais em seu significado.
• Formalidade – O modelo deve ter seus conceitos formalmente definidos.
1 0,N
Quadra Possui Lote
usuário final durante as fases de análise de requisitos e projeto conceitual” [BaCN92 apud
Lisb97, pág. 64].
Hull e King [HuKi87] classificam o modelo IFO (Is-a relationships, Functional relationships,
complex Objects) como um modelo altamente estruturado. Ele foi proposto por Abiteboul e
Hull [AbHu87] apresentando atributos e tipos construtores para agregação e agrupamento,
além de distinguir entre os dois tipos de relacionamento “é_um” (generalização e
especialização). A descrição feita a seguir é baseada em [HuKi87, AbHu87, Hann95].
Os tipos construtores básicos do modelo IFO são: Objetos, fragmentos e relacionamentos
“é_um” (is a). Um tipo de objeto no IFO corresponde a uma coleção de objetos com as
mesmas características. Existem três tipos básicos de objeto, imprimível, abstrato e livre, e
dois tipos de objeto construtor, agrupamento e agregação (produto cartesiano). Um objeto
imprimível (representado graficamente por um retângulo) é um objeto que pode ser
diretamente representado como entrada e saída. Como exemplo, temos os tipos pré-definidos
Integer, string, real e pixel. Um objeto abstrato (representado graficamente por um losango)
representa objetos do mundo real que não sejam imprimíveis, como pessoa, companhia e
curso. Os objetos do tipo livre (representados graficamente por um círculo) são entidades
obtidas via relacionamentos de generalização e especialização, como, por exemplo, estudante.
Pessoa, por exemplo, é um objeto abstrato e estudante um objeto livre.
Os tipos de objeto não básicos são construídos a partir dos tipos básicos usando agregação e
agrupamento. Agrupamento corresponde ao procedimento de formação de um conjunto finito
de objetos de uma mesma estrutura. Um agrupamento consiste em um conjunto de objetos
como, por exemplo, um conjunto de estudantes que forma um tipo de agrupamento de nome
classe. A agregação (produto cartesiano) representa objetos como n-tuplas ordenadas de
outros objetos.
O objetivo do modelo IFO é fornecer um formalismo para representar os relacionamentos
funcionais entre os tipos. O meio pelo qual os relacionamentos são representados é o
fragmento. O fragmento é uma construção do modelo IFO que contém os tipos e funções (mas
não relacionamentos de generalização ou especialização) sujeitos a certas regras. No modelo
IFO, os fragmentos formam os blocos construtores dos esquemas. Eles podem ser usados para
modelar associações “um_para_um” entre dois objetos. Associações “um_para_muitos” são
modeladas indiretamente usando fragmentos e agrupamento.
O modelo IFO provê um formalismo para a representação do relacionamento funcional entre
os tipo Os relacionamentos funcionais são representados pelos fragmentos. Um esquema é a
maior unidade do modelo IFO sendo uma floresta de fragmentos, possivelmente conectados
nos seus vértices primários (raiz do fragmento) por uma generalização e especialização de
GRADE
Dentro da fase de análise, existem três modelos: o modelo de objetos, o modelo dinâmico e o
modelo funcional. O modelo de objetos captura a estrutura estática dos objetos do sistema,
mostrando as classes, os relacionamentos existentes entre as classes e os atributos, as
operações que caracterizam cada classe, e ainda restrições. Apenas o modelo de objetos será
referenciado nesta seção. As definições apresentadas são baseadas em [RBPE91, Rumb96,
Ceza97].
CARDINALIDADE
CLASSE
um Classe
Nome Classe zero ou mais
Nome Classe Classe
Lista de Atributo
zero ou um Classe
Lista de Operação
um ou mais 1+
Classe
ASSOCIAÇÃO
1, 2 a 4 1,2-4
Classe
nome da associação
Classe-1 Classe-2
GENERALIZAÇÃO
AGREGAÇÃO
Classe Superclasse
Agregada
! " #$ $ "
O método de análise orientada a objetos foi proposto por Peter Coad e Edward Yourdon
[CoYo91]. É um método destinado primariamente ao desenvolvimento de sistemas de
gerenciamento de informações. O método possui um processo bem definido, cobrindo análise
e o projeto. A fase de análise é baseada no desenvolvimento de uma forma estendida do
modelo entidade-relacionamento, denominada modelo OOA. O método OOA será descrito de
maneira genérica a seguir.
O método consiste em cinco níveis:
• Assunto – Um assunto contém classes que podem conter outros assuntos. Em projetos
pequeno, os assuntos servem como um mecanismo para orientação do leitor através do
modelo OOA. Já em projetos grandes, os assuntos são muito úteis na divisão do domínio
do problema em sub-domínios, organizando pacotes de trabalho.
• Classe e Objeto – Uma classe descreve uma coleção de objetos através de um conjunto
uniforme de atributos e serviços, incluindo uma descrição de como criar novos objetos na
classe. Um objeto é uma abstração de algo do domínio do problema.
• Estrutura – O método OOA chama de estrutura as primitivas para representação de
generalização/especialização e agregação. A estrutura de Generalização-especialização
caracteriza a herança na hierarquia entre classes e a estrutura Todo-parte (agregação)
modela os objetos como parte de outros objetos.
• Atributo - Este nível fornece detalhes de informação sobre os objetos. Atributos
descrevem valores mantidos em um objeto e que devem ser manipulados exclusivamente
pelos serviços desse objeto. Conexões de instâncias refletem o relacionamento entre
objetos.
• Serviço – Um Serviço (método, operação) é um comportamento específico que um objeto
é responsável por exibir. Conexões de Mensagens modelam as dependências de
processamento de um objeto, indicando quais serviços ele precisa para cumprir suas
responsabilidades.
A primeira fase do método consiste na identificação de classes e objetos, visando exprimir o
domínio do problema e as responsabilidades do sistema. A próxima etapa identifica as
estruturas: Generalização/especialização e Todo-parte. A partir daí são identificados os
assuntos. No modelo OOA, o conceito de assunto é usado para o controle da visibilidade e
orientação do leitor ajudando a rever o esquema e resumindo sucintamente os assuntos no
domínio do problema. O próximo passo é a identificação dos atributos e o último passo é a
definição dos serviços. A Figura 6 apresenta a representação gráfica das primitivas do modelo
OOA. Maiores detalhes do OOA podem ser encontrados em [CoYo91].
n,m n,m
Nome Classe Nome Classe
Atributos Atributos
Nome do Assunto
n,m n,m
Serviços Serviços
0,N 0,N
1 0,M
Modelos de dados semânticos e orientados a objetos, tais como ER [Chen76], OMT [RBPE91],
IFO [AbHu87] e outros, têm sido largamente utilizados para a modelagem de aplicações
geográficas. Apesar da grande expressividade desses modelos, eles apresentam limitações
para a adequada modelagem dessas aplicações, já que não possuem primitivas geográficas
apropriadas para a representação de dados espaciais.
Modelos de dados para as aplicações geográficas têm necessidades adicionais, tanto com
relação à abstração de conceitos e entidades, quanto ao tipo de entidades representáveis e seu
inter-relacionamento. Diversas propostas existem atualmente, principalmente focalizadas em
estender os modelos criados para aplicações convencionais como GeoOOA [KÖPS96],
MODUL-R [BCMM96], GMOD [OlPM97], , MGEO+ [Pime95], IFO para aplicações
geográficas [WoHM90], GISER [SCGL97], Geo-OMT [Borg97]. Todos eles objetivam refletir
% &' $ " $ ! () * $ + !, - $
Os modelos de dados podem variar de acordo com o nível de abstração empregado. Câmara et
al. [CCHM96] especificam quatro níveis de abstração utilizados nas aplicações geográficas:
• Nível do mundo real - Contém os fenômenos geográficos a serem representados como,
rios, cidades e vegetação.
$ $ * $ + !, - $
• ser adequado aos conceitos natos que o ser humano tem sobre dados espaciais,
representando as visões de campo e de objetos;
• ser de fácil visualização e compreensão;
• utilizar o conceito de níveis de informação, possibilitando que uma entidade geográfica
seja associada a diversos níveis de informação;
• representar as múltiplas visões de uma mesma entidade geográfica, tanto com base em
variações de escala, quanto nas várias formas de percebê-las;
• ser capaz de expressar versões e séries temporais, assim como relacionamentos temporais.
& ' !
. ! !&$ $ +
• é independente de implementação.
O modelo Geo-OMT é baseado em três conceitos principais: classes, relacionamentos e
restrições de integridade espaciais. Nas seções seguintes esses conceitos serão detalhados.
. $$ $ / ,$ $
CLASSE
Geo-OMT
CLASSE CLASSE
GEORREFERENCIADA CONVENCIONAL
GEO-CAMPO GEO-OBJETO
REDE GEO-OBJETO C/
POLÍGONOS GEO-OBJETO COM
TRIANGULAR TESSELAÇÃO AMOSTRAGEM ISOLINHAS GEOMETRIA E
ADJACENTES GEOMETRIA
IRREGULAR TOPOLOGIA
podem ter ou não atributos não-espaciais, e podem estar associados a mais de uma
representação geométrica, dependendo da escala em que é representado, ou de como ele é
percebido pelo usuário. Por exemplo, um usuário encarregado do gerenciamento de trânsito
verá a rua como uma rede direcionada, representando vias de mão simples e dupla; um usuário
encarregado do cadastro da cidade, interessado em conhecer os proprietários dos lotes, verá a
rua como o espaço entre os meios-fios.
Todas as subclasses georreferenciadas apresentam uma representação simbólica, construindo
assim um sistema semântico onde cada símbolo possui significado próprio que incorpora a
sua natureza e a geometria.
A inclusão de símbolos geométricos nas classes de entidades geográficas, em substituição aos
relacionamentos que descrevem a geometria do objeto, simplifica significativamente o
esquema final e de acordo com a semiologia gráfica [Bert67], a linguagem visual é mais
intuitiva e expressiva proporcionando uma percepção imediata do conteúdo analisado.
Representações gráficas que exigem demorada leitura tornam-se ineficazes. Portanto, o uso
desse tipo de abstração, além de eliminar pelo menos um relacionamento por classe gráfica,
elimina a necessidade de modelar a estrutura de dados geométrica1 que descreve a classe
[BePa89].
Os pictogramas de um Geo-objeto estão exemplificados na Figura 19. O ponto representa um
símbolo como por exemplo uma árvore, a linha representa segmentos de reta formados por
uma linha simples, um arco ou por uma polilinha (ex. muro, trecho de rua, trecho de
circulação) e o polígono representa uma área (ex. edificação, lote).
Nas aplicações urbanas, esta simplificação pode ser facilmente percebida devido à grande
quantidade de entidades do mundo real presentes em um esquema da aplicação.
Na Figura 20 está exemplificada a simplificação por substituição simbólica. Uma rua possui
pelo menos um trecho, que é definido por pelo menos dois pontos. A quadra é um polígono,
definido pelo menos por três segmentos. Com a substituição simbólica, o nível de abstração é
1
A estrutura de dados geométrica depende da técnica de implementação de cada SIG.
bem mais elevado. O trecho passa a ser visto como um objeto linha e a quadra como um
polígono. O fato do trecho ser definido por dois pontos já é parte da sua definição geométrica.
A definição simbólica da quadra já identifica que é um polígono formado por pelo menos três
segmentos e que cada segmento possui dois vértices.
Trecho
de Rua 2...* 2
Segmento Vértice
Atributos Gráficos
Atributos 3...*
Operações
Quadra
Atributos
Quadra
Operações
Além das vantagens acima citadas, o uso da simbologia tornam mais claras e consistentes as
relações espaciais entre as classes. Por exemplo, o uso da relação “dentro de” implica que
uma das classes do relacionamento seja do tipo Polígono ou Polígono Adjacente.
Uma Classe Georreferenciada é representada graficamente por um retângulo, subdividido em
quatro partes. A parte superior contém à direita o nome da classe e à esquerda o símbolo
representando a forma gráfica da Classe Georreferenciada. Na segunda parte, aparece a lista
dos atributos gráficos na terceira parte, a lista dos atributos alfanuméricos (quando existirem)
e, na última parte, a lista das operações que são aplicadas à classe. Uma Classe
Georreferenciada poderá conter ou não atributos alfanuméricos. No entanto, terá sempre o
atributo gráfico de localização. Uma representação simplificada poderá ser utilizada,
considerando apenas uma subdivisão do retângulo, contendo o nome da classe e a sua
representação simbólica (Figura 20a).
Classe Convencional
Nome da Classe
Nome
Nome Classe da Classe
Representação
Atributos Gráficos
Simplificada
Atributos
Representação Operações
Simplificada
b)
a)
Todo esquema de uma aplicação deve conter a classe que representa o domínio espacial a ser
modelado. Ela deverá vir localizada na parte mais alta do esquema, em posição destacada,
podendo conter atributos gráficos como sistema de coordenadas, projeção cartográfica e
datum. Todas as classes modeladas no esquema estarão totalmente contidas nela. Sua
existência poderá ser real, como na modelagem de municípios onde a divisa de cada
município é um polígono que envolve todo o espaço modelado, ou poderá ser abstrata, apenas
representando a delimitação do espaço modelado, como por exemplo, nos casos de municípios
que além da parte territorial possuem ilhas.
+ . 0
Ex: TIN Ex: Curvas de Ex: Divisão de Ex: Imagem de Ex: Pontos
Nível Bairros Satélite Cotados
Figura 22 – Geo-Campos
Ex: Muro Ex: Árvore Ex: Lote Ex: Trecho rede Ex: Trecho rede Ex:Poço de Visita
de esgoto de água
Divisa
Municipal
Sist. Coordenadas
Projeção
Datum
cor = branca
nome município
descrição
Ponto de
Linha de Ônibus Ônibus
Endereço
num.linha 1...* Para 1...* coord.(x,y) 0...*
Em Frente
1
nome linha símbolo= pto.ônibus coord.(x,y)
Cor=azul símbolo= casa
Cor= vermelho
ident. ponto
num.lograd
num.imovel
Rotacionar símbolo Rotacionar símbolo
Verificar localização
0...* 0...*
Perto de Dentro de
0...* 0...1
Área
Referência
Hachura
Tipo área
nome área
1 $
Segundo [OlPM97], um problema existente na maioria dos modelos de dados é o fato deles
ignorarem a possibilidade de modelagem dos relacionamentos entre fenômenos do mundo
real. Considerando a importância da relações espaciais e não espaciais na compreensão do
espaço modelado, o modelo Geo-OMT representa os seguintes tipos de relacionamentos entre
suas classes: associações simples, relações topológicas de rede e relações espaciais.
As associações simples representam relacionamentos estruturais entre objetos de diferentes
classes, tanto convencionais como georreferenciadas. A instância individual de uma
associação é chamada link. Muitas associações são binárias, sendo representadas por uma
linha contínua ligando duas classes [RBPE91, Rumb96] (Figura 25a). Uma associação pode ter
sobre o seu nome uma seta mostrando qual o sentido da relação. Algumas associações podem
ter atributos próprios.
As relações espaciais representam as relações topológicas, métricas, ordinais2 e fuzzy.
Algumas relações podem ser calculadas a partir das coordenadas de cada objeto durante a
execução das operações de análise espacial. As relações topológicas são exemplos deste caso.
Outras necessitam ser especificadas pelo usuário para que o sistema consiga manter estas
informações. Estas relações são chamadas de explícitas [Peuq84 apud Lisb97]. A
representação dessas relações no modelo Geo-OMT têm por objetivo tornar explícita a
interação espacial entre as classes quando for relevante para o propósito da aplicação.
Todas as relações espaciais são representados por linhas pontilhadas (Figuras 24 e 25b). Um
caso particular de relação espacial é a hierarquia espacial. Através dessa relação a classe que
representa o domínio espacial é conectada às demais subdivisões espaciais (Figuras 24 e 25c).
Esta relação também pode ser utilizada na relação entre classes do tipo Geo-campo com
classes do tipo Geo-Objeto, onde terão sempre uma conotação de hierarquica espacial já que,
toda classe do tipo Geo-Objeto estará distribuída sobre classes do tipo Geo-Campo. A Figura
26 representa que qualquer ponto dentro de um lote tem um valor altimétrico associado.
2
Relações relativas a ordem
Nome Classe
c) Hierarquia Espacial
nome da rede
d) Relacionamento em Rede
Figura 25 – Relacionamentos
As relações em rede são relações que podem ser mantidas através de estruturas de dados
dos SIGs, sendo representadas por nós e arcos conectados.
As relações em rede são representadas por duas linhas pontilhadas paralelas ligando
classes do tipo Nó com classes do tipo Linha Uni ou Bi-direcionada. Estruturas de rede
sem nó, apresentarão um relacionamento recursivo na classe que representa os segmentos
do grafo. O nome dado à rede deverá estar entre as linha pontilhadas (Figura 25d).
Os nomes das relações espaciais estão formalizados abaixo e, conforme dito anteriormente,
poderão ser seguidos por uma seta indicando a origem da relação. Exemplificando melhor,
citamos o caso de lote e rede elétrica. A relação entre as duas classes é em frente a. A seta
deve ser na direção lote→rede elétrica indicando que a relação é importante quando se está no
lote. Em cada instância da classe Lote é necessário saber se existe rede elétrica em frente e não
na instância de um trecho de rede elétrica saber se existe lote em frente. É uma questão de
maior clareza semântica.
Baseado em [PaTh97, Free75, EgHe90, Feut93, EgFr91, ClFO93, Cama95, Fran96, MaES95], o
modelo Geo-OMT considera as seguintes relações espaciais entre as Classes
Georreferenciadas: disjunto, contém, dentro de (contido), toca (encontra), cobre, coberto por,
sobrepõe, adjacente, perto de , acima (mais alto que sobre), abaixo (mais baixo que sob),
sobre, sob, entre, coincide, cruza, atravessa, em frente a, à esquerda, à direita. As relações
contém/dentro de (contido) serão tratadas como um tipo de Agregação Espacial. A seguir
daremos, o significado semântico de cada relação espacial.
• Disjunto – Não existe nenhum tipo de contato entre as classes relacionadas.
• Contém – A geometria da classe que contém envolve a geometria das classes contidas.
Uma instância da classe que contém envolve uma ou mais instâncias da(s) classe(s)
contida(s). a classe que contém deve ser do tipo Polígono (Geo-Objeto) ou Polígonos
Adjacentes (Geo-Campo).
• Dentro de – Existem instâncias de uma classe qualquer, dentro da (contida na) geometria
de instâncias das classes do tipo Polígono (Geo-Objeto) ou Polígonos Adjacentes (Geo-
Campo). A relação dentro de será tratada como uma Agregação Espacial “todo-parte”.
• Toca - Existe um ponto (x,y) em comum entre as instâncias das classes relacionadas.
Consideramos esta relação um caso particular da relação adjacente.
• Cobre/coberto por - A geometria das instâncias de uma classe envolve a geometria das
instâncias de outra classe. A classe que cobre é sempre do tipo polígono (Geo-Objeto).
• Sobrepõe - Duas instâncias se sobrepõem quando há uma interseção de fronteiras. Só será
usado para relações entre polígonos (Geo-Objeto). Apenas parte da geometria é
sobreposta.
• Adjacente - Utilizado no sentido de vizinhança, ao lado de, contíguo.
• Perto de - Utilizado no sentido de proximidade. Deve estar associado a uma distância
“d”, que define quanto será considerado perto. Esta distância poderá ser uma distância
euclidiana, um raio, um intervalo ou qualquer outra definida pelo usuário.
• Acima / Abaixo – Acima é mais alto que sobre, e abaixo mais baixo que sob. Será
considerado acima ou abaixo, quando as instâncias estiverem em planos diferentes.
• Sobre / Sob - Utilizado no sentido de “em cima de” / “em baixo de”, no mesmo plano.
• Entre - Utilizado no sentido posicional, enfatizando a localização de uma instância de
determinada classe entre duas instâncias de outra classe.
Sobre A,B B
Adjacente / Toca
d
Perto de
Dentro de
Acima/ Abaixo
LINHA / POLÍGONO Em frente a
A
Disjunto B
Adjacente
d
Perto de PONTO/PONTO
Dentro de Disjunto
Acima/ Abaixo Adjacente / Toca
d
Cruza Perto de
Atravessa Coincidente A, B
Language (UML) [Rati97] por apresentar maior expressividade na sua representação do que a
proposta pelo modelo OMT (Figura 29).
0...*
Nome da classe Zero ou mais
1...*
Nome da classe Um ou mais
Nome da classe
1 Exatamente um
0...1 Zero ou um
Nome da classe
Figura 29 –Cardinalidade
2 + ! 3 () $0 3 ()
Lote Unid.Ambiental
Nome da
Classe
Figura 30 – Generalização
SuperClasse SuperClasse
Disjunto/Parcial Sobreposta/Parcial
SuperClasse SuperClasse
Nó da Rede Nó da Rede
Fluvial Fluvial
Ponto (x, y) Ponto (x, y)
Símbolo (NÓ) Símbolo (NÓ)
Rotação (0) Rotação (0)
Ident. Nó Ident. Nó
Tipo Nó Tipo Nó
Rotacionar Rotacionar
Tipo de Nó Tipo de Nó
4 " ! ()
A agregação é uma forma especial de associação entre objetos, onde um deles é considerado
composto por outros. O relacionamento entre o objeto primitivo e seus agregados é chamado
de “é-parte-de” e o relacionamento inverso “é-componente-de” [ElNa94]. A notação gráfica da
agregação segue a do modelo OMT (Figura 33).
Uma agregação pode ocorrer entre Classes Convencionais, entre Classes Georreferenciadas e
entre Classes Georreferenciadas e Classes Convencionais.
Nome da Classe
Agregação
(composto de)
Trecho
Logradouro
5 " ! () $0
Classe
União espacial U
(união de)
Classe
Contém C
U C
6 + ! 3 () . ! !, -
3
Não se deve confundir a generalização cartográfica com a generalização utilizada como um tipo de abstração usado nos
modelos de dados semânticos e orientados a objetos [ElNa94].
Um outro exemplo, muito comum em áreas urbanas, é o cemitério. Ele é representado tanto
por um polígono fechando a área do cemitério, quanto pelos símbolos cartográficos de
cruzinhas (Figura 37a). A variação pela forma pode ser também usada na representação de
classes que possuem simultaneamente instâncias georreferenciadas e instâncias não gráficas,
como, por exemplo uma placa de sinalização de trânsito que só passará a ser georreferenciada
quando sair do depósito para fixação na rua (Figura 37b)
a) b)
Cemitério
Placa
F
F
Cemitério Cemitério
Sinalização
Cadastro Placa
A variação por escala é utilizada na representação das diferentes formas geométricas de uma
mesma classe decorrente da mudança de escala. Uma escola pode ser representada por uma
área (polígono) em uma escala maior e por um símbolo (ponto) em uma escala menor (Figura
38).
Nome Escola
Cidade da Classe
intervalo escala
Atributos
Alterar forma
visualização E
E
Escola Escola
Cidade Cidade
Área da Escola
Nome
da Classe
Atributos Gráficos
Atributos
Alterar
visualização
O objetivo do uso desta primitiva é registrar as múltiplas naturezas gráficas que um objeto
pode ter, de forma a tornar possível explicitar os relacionamentos decorrentes de cada
natureza. Conforme visto, a forma com que uma classe é representada influencia nos tipos de
relacionamento espacial que dela podem ser derivados.
A notação para generalização cartográfica é um quadrado interligando uma superclasse à
suas subclasses. A subclasse é ligada por uma linha pontilhada ao retângulo. É usado como
discriminador a letra E para variação por escala e a letra F para variação pela forma. O
quadrado será vazado para representar a restrição de disjunção, e preenchido indicando a
sobreposição de subclasses (Figura 40).
F E
Subclasse Subclasse
Subclasse Subclasse
Hospital City
Shape Scale
A variação por escala será sempre total e disjunta, porque a união de todas as instâncias das
subclasses deve ser equivalente ao conjunto de instâncias da superclasse, não sendo permitida
sobreposição. Neste caso, uma entidade geográfica, dependendo da escala, pode ter formas
alternativas de representação porém, não ao mesmo tempo.
Apesar de conceitualmente a entidade geográfica ser a mesma, as subclasses serão
implementadas como classes distintas, devido a restrições impostas pela maioria dos SIGs
hoje existentes que não permitem que uma classe possa simultaneamente ser representada por
naturezas gráficas diferentes. Alguns dos problemas decorrentes de múltiplas representações
em um SIG são redundância de dados e multiplicidade de comportamento de uma entidade
geográfica [CCHM96].
7 $ !(8 $ $0 $
Muitas aplicações geográficas usam dados que dependem de relacionamentos topológicos que
precisam ser representados explicitamente no banco de dados. Nesses casos, cuidados
especiais devem ser tomados para que a consistência espacial seja mantida. Esses cuidados
interferem não só na entrada de dados geográficos como também na manutenção da
integridade semântica do banco de dados.
O controle das restrições de integridade deve ser considerado uma das principais atividades de
implementação. É conveniente que o esquema da aplicação geográfica represente pelo menos
as situações onde esse controle não pode ser desprezado.
Consideramos nesta seção somente as restrições relacionadas aos relacionamentos espaciais.
Restrições que envolvem valores de atributos ou restrições de cardinalidade já são de uso
comum em projetos de banco de dados não sendo considerado necessário citá-las. Não
consideramos também restrições que envolvem a geometria do objeto, como por exemplo as
restrições impostas na descrição geométrica de um polígono: deve ser composto por no
mínimo três segmentos e possuir a mesma coordenada nos pontos inicial e final, garantindo o
fechamento do polígono. Restrições geométricas devem ser tratadas a nível do sistema de
informação geográfica, pois estão estritamente relacionadas com a implementação. Em
[LaTh92] encontramos regras de consistência associadas à geometria dos objetos espaciais.
A partir da criação das primitivas espaciais “todo-parte”, como de alguns relacionamentos
espaciais padronizados, são deduzidas algumas regras de integridade espacial. Essas regras
formam um conjunto de restrições que devem ser observadas nas operações de atualização do
banco de dados geográfico.
As restrições espaciais consideradas no modelo Geo-OMT são as seguintes:
Regras de Dependência Espacial - São impostas restrições pela existência de objetos
agregados, onde a existência gráfica do objeto agregado depende da existência gráfica dos
sub-objetos e vice-versa. Essas regras são derivadas das primitivas espaciais Subdivisão
espacial e União espacial.
• Regras de Continência - São impostas restrições pela existência de objetos contidos dentro
da estrutura geométrica de outro. Essas regras são derivadas da primitiva espacial Contém.
• Regras de Generalização Espacial - São impostas restrições pela variação dos atributos
gráficos.
• Regra de Disjunção - É uma restrição aplicada a classes que não podem de forma alguma
ter algum tipo de relacionamento espacial entre elas.
• Regras de Conectividade - São impostas restrições pela existência de conectividade entre
os objetos.
• Regras de Associação Espacial - São impostas restrições pela existência de algumas
relações espaciais.
• Regras de Geo-Campo - São impostas restrições à existência de classes do tipo Geo-
Campo.
O cumprimento de algumas regras de integridade espacial pode ser garantido pelo SIG. No
entanto, a maioria requer a definição de operações de controle de integridade associadas às
classes.
Usaremos os conceitos de classe primitiva e derivada, e de objeto primitivo e derivado, para
descrever as regras de integridade espacial relacionadas com as primitivas espaciais “todo-
parte”. Classe primitiva é a classe que dará origem a outras classes, chamadas de derivadas.
Um objeto primitivo, é uma instância da classe primitiva. Um objeto derivado é uma instância
da classe derivada originado de um objeto primitivo. A seguir são especificadas as regras de
integridade espacial.
Para exemplificar o uso das regras de dependência espacial, citamos a classe Quadra que é
subdividida na classe Lote. Na criação e manutenção de cada instância da classe Lote, deve
ser garantido que cada instância da classe Lote só pertença a uma instância da classe Quadra.
A subdivisão de uma quadra dará origem a pelo menos dois lotes (regra 1). Cada lote deve ser
adjacente a outro, não havendo sobreposição de áreas e nem espaço dentro da quadra que não
pertença a um lote (regra 2). A delimitação dos lotes deve estar totalmente contida dentro do
limite da quadra, podendo coincidir com ele mas não extrapolá-lo (regra 3). Caso a quadra
sofra alteração em seus limites, diminuindo ou aumentando sua área, isso afetará a área dos
lotes dentro dela (regra 4). Deve ser verificado quais lotes sofrerão alteração em seus limites.
Caso o limite de um lote seja alterado, sem que o da quadra tenha sido alterado, alguns ou
todos os lotes adjacentes a ele também serão afetados (regra 5). A exclusão de uma quadra
implica na exclusão de todos os lotes dentro dela (regra 6).
União Espacial 1. A origem de um objeto derivado depende da união de pelo menos dois
objetos disjuntos pertencentes à classe primitiva.
O objeto derivado
(objeto agregado) é 2. O limite geográfico do objeto derivado deve coincidir com o limite
formado pela união de geográfico externo formado pela união da geometria dos objetos
objetos primitivos. pertencentes à classe primitiva, não podendo extrapolá-lo.
Obs- caso o objeto primitivo tenha servido apenas de parâmetro para a entrada de dados dos
objetos derivados, não existindo nenhuma dependência de existência entre eles, essas regras
não se aplicam.
Regras de Continência
Contém 1. A geometria do objeto que contém deve conter a geometria dos objetos
Objetos contidos dentro da contidos.
estrutura geométrica de
outro. 2. O limite do objeto contido não pode extrapolar o limite do objeto que
contém.
Exemplificando o uso das regras de continência, citamos a classe Bairro que contém a classe
Quadra. Na delimitação do limite do bairro deve ser observado que seu limite não deve
atravessar uma quadra. Todo o limite da quadra deve estar totalmente contido no limite de um
bairro. Não deve existir quadra sem estar dentro de um bairro e nem pertencendo a mais de
um bairro.
Regra de Disjunção
1. A interseção entre a geometria dos objetos pertencentes à classes disjuntas deve ser
vazia.
Regras de GeoCampo
Isolinha 1. Uma isolinha não pode interceptar outra isolinha
2. As instâncias desta classe devem ser todas adjacentes, não devendo existir
nenhum espaço vazio.
Dentro de 1. A instância que contém deve ser sempre uma área, podendo ser um
polígono ou uma célula.
Regras de Conectividade
Estrutura grafo-nó 1. Todo nó deverá estar conectado a pelo menos um segmento orientado.
Regras de Conectividade
Estrutura grafo-grafo 1. Todo segmento orientado intermediário estará conectado a dois outros
segmentos orientados de uma mesma classe, um posterior e um
anterior.
As regras de conectividade normalmente são garantidas pelo próprio SIG. No caso da rede de
esgoto, que é uma estrutura em grafo-nó, a conexão entre o nó e o segmento é garantida
automaticamente pelo sistema.
* ! $
sobreposição de temas sendo esta visualização muito importante pois é um indicativo de que a
classe é compartilhada por usuários distintos.
O diagrama de temas deve começar com o tema que identifica o espaço modelado e a partir
dele uma hierarquia é desenvolvida, dos temas mais abrangentes aos temas específicos. O
termo abrangente significa abrangência geográfica, como se fossem camadas no sentido
geográfico de distribuição sobre a terra, onde ao mesmo tempo coexistem vários temas de
igual importância. Os temas nos níveis inferiores do diagrama necessitam da existência de
pelo menos alguns dos temas que estão nos níveis superiores. Cada tema é representado por
um retângulo contendo seu nome. A ligação hierárquica entre os temas é feita através de uma
linha contínua. A Figura 41 mostra a notação utilizada em um exemplo de temas do município
de Belo Horizonte. A Figura 42 mostra parte de um esquema da aplicação de circulação viária
onde estão presentes os temas Trânsito e Sistema Viário.
MUNICÍPIO DE
BELO HORIZONTE
DIVISÕES
TERRITORIAIS
TRANSPORTE ILUMINAÇÃO
ENERGIA ÁGUA ESGOTO DRENAGEM TELEFONIA
COLETIVO PÚBLICA
SISTEMA VÁRIO
Nó Nó
circulação cruzamento
circulação viária
malha viária
Trecho Trecho
circulação
Paralelo a
1...* 1
0...*
Pertence
1
Logradouro
TRÂNSITO
( "# ! ")
Esta seção apresenta uma análise comparativa entre os modelos de dados descritos com base
nos requisitos necessários às aplicações geográficas. A comparação apresentada é baseada nas
referências citadas na descrição dos modelos e nas observações de [Lisb97].
1 + . 0 9 $ . !' % &'
Curva de nível
Geo-OMT
GISER
Elevação 1 discreted 1 1 N
Curva
Entityde
name
Nível consist of Spatial Object
Feature by
determines
shape of
GeoOOA
Curva de Nível
Curve
GMOD
Nível de Representação
1 + 9: & / ; ! !, -
BACIA
GISER
consist SPATIAL consist
Entity
BACIAname
OBJECT
surface
of of
GMOD
Geo-Objeto BACIA Polygon
1 (8 $ $0 $
1,N
1,N
Curva de nível
Subdividida
22 1 1
Setor Setor
Setor
0,N
0,N
C
Contém
1...* 1
1
Quadra Quadra
Quadra
1 + ! 3 () $0 ! !
Geo-OMT GISER
Representação
visual
Trecho
Restrições
displays
visuais
Classificação Viária
varies over
Rede Malha
viária
Space
11 + ! 0 '
Geo-OMT Nó Rede da
Trecho de Rio
Fluvial
Rede Fluvial
GeoOOA
Nó do grafo
GISER
Nó da Rede determines
Fluvial topology of
determines
Trecho de Rede topology of
Fluvial
MODUL-R Connected
Graph
REDE fLUVIAL
Lote
Lote
Testada Lote Lote
Lote Lote
Polygon
d) GISER
determines
Delimitação lote shape of
1 N Spatial
Entity
Lote
name consist of U
Object
determines
shape of
Testada lote
Curve
* + ") ,! - ' !
2 ! $0 ! : < !@ $
Figura 51 mostra o esquema da aplicação de transporte coletivo. Nele foi usada a notação
simplificada do Modelo Geo-OMT.
Trecho de via
Trecho de conversão
Nó de circulação
1 1 0...* C
Calçada Área
Referência
Adjacente 1
2 $
O município é subdividido em bacias de esgoto que por sua vez se divide em sub-
bacias. Cada sub-bacia abrange um conjunto de trechos de rede. A rede de esgoto
sanitário é classificada em rede coletora, interceptora e emissária de acordo com a sua
função. A rede coletora é a de diâmetro menor, recebe as ligações dos usuários. A rede
interceptora recebe o fluxo das coletoras e a rede emissária recebe o fluxo das
interceptoras para efetuar o lançamento da rede de esgoto.
Um trecho da rede é representado por dois nós e um arco. Os nós são interrupções no
trecho devido a um poço de visita (PV), um poço de visita com ponta seca, um ponto de
lançamento (em rede pluvial, em curso d’água), uma ligação do usuário, uma estação de
tratamento ou o fim da rede (ponta seca). Os arcos são trechos de tubulação. Cada trecho
possui informações do tipo de rede, diâmetro da tubulação, extensão do trecho,
percentual de declividade e tipo de material (ferro, concreto, pvc). Cada nó possui o
tipo, um número e quando PV a cota do fundo e a cota do tampão.
A bacia de esgoto possui uma numeração, um nome, a quantidade de população
atendida e a vazão da bacia. As sub-bacias são numerada dentro do código da bacia a
qual ela pertence possuindo nome, população atendida e vazão.
Os nós terão representação gráfica diferente assim como deverão ser graficamente
diferente as redes emissárias, coletoras e interceptoras.
A Figura 52 exemplifica um trecho de rede de esgoto e a Figura 53 mostra o esquema
simplificado da rede de e utilizando o Geo-OMT.
Bacia de
Esgoto
Sub-bacia
de esgoto
C
0...* 0...*
Nó rede Trecho
esgoto Rede de Esgoto rede esgoto
tipo de nó
2 / $ . $ ! A!
O município possui quadras que são subdivididas em lotes. Os lotes podem ser
territoriais, quando não existirem construções ou edificados. Os lotes edificados
possuem uma ou mais edificações. Os endereços das edificações (Número de Porta =
num.logradouro + num imóvel) estão dentro da área do lote. Somente os lotes edificados
possuem endereço.
No arquivo de IPTU um imóvel pode ser predial ou territorial. Um imóvel predial estará
associado a uma edificação, quando for possível, e ao lote gráfico. Os imóveis prediais
podem ser georreferenciados pelo endereço no entanto, os imóveis territoriais para
serem georreferenciados deverão usar a associação com o lote gráfico.
As curvas de nível ocupam todo o município sendo que é possível saber a cota de
qualquer ponto na base geográfica.
O número de porta pertence a um logradouro e está em frente a um trecho da malha
viária. A figura 55 mostra o esquema da aplicação.
LIMITE
MUNICIPAL
C CURVA DE
NÍVEL
1...*
QUADRA
1
COINCIDE
1...* 1
LOTE
OCUPAÇÃO CEP
0...1 1 0...* 1
CORRESPONDE
EM FRENTE
POSSUI
ASSOCIADO
TRECHO CRUZAMENTO
1 MALHA VIÁRIA
TIPO IMÓVEL
0...*
0...* IMÓVEL
IMÓVEL 0...1
TERRITO-
PREDIAL
RIAL
1...*
POSSUI
2 B ! & $
Exercício 1
Uma área de concessão corresponde a uma área geográfica de atuação da Eletropaulo. A
estrutura organizacional interna da empresa divide a área de concessão em uma ou mais
áreas regionais, baseada em alguns requisitos tais como região de atuação,
departamento, divisão e seção em questão. Adicionalmente, é de grande interesse da
empresa o armazenamento de informações relativas às áreas geográficas eletricamente
isoladas entre si, as chamadas regiões elétricas.
Um município é uma área administrativa autônoma do Estado. No banco de dados do
SIGRADE, para cada município são armazenadas informações tais como o nome, o
código e a área total de ocupação. Em um município, existem diversas localidades
técnicas, que são áreas geográficas definidas com o objetivo de atendimento técnico da
rede elétrica e dos consumidores.
Outro elemento importante do modelo de dados do SIGRADE é a entidade divisa de
lote. Uma divida de lote representa a testada de um determinado lote em uma
determinada quadra. Cada instância desta entidade possui informações relativas ao
número do lote na rua, à descrição da divisa e à quadra à qual o lote está associado. Para
cada divisa existe um único número associado. Em adição, para cada quadra são
armazenadas as edificações de destaque nelas localizadas.
As divisas de lote são adjacentes aos eixos de logradouro. Um eixo de logradouro é uma
porção definida entre dois cruzamentos consecutivos. Desta forma, um logradouro é
formado por um ou mais eixos de logradouros e representa uma via pública. No banco
de dados do sistema, para cada logradouro são armazenadas informações como código,
o nome e o seu título, entre outras”. A Figura 56 apresenta o esquema do MUB feito no
modelo OMT.
(Descrição do esquema do MUB (mapeamento Urbano) da Eletropaulo constante do
artigo Construção de um modelo unificado a partir de sistemas stand-alone – Cristina
Aguiar e Cláudia Bauzer Medeiros- Gis Brasil 96)
Exercício 2
O objetivo da aplicação é identificar os possíveis focos de Dengue dentro de município
de Belo Horizonte.
Deverão ser identificados todos os lotes vagos, todas as borracharias, floriculturas e
ferro velho. Todas as áreas verdes, córregos e rios também deverão ser identificados.
Todas as notificações de Dengue, obtidas através da Secretaria de Saúde, deverão ser
georreferenciadas pelo endereço do paciente.
O resultado será um mapa por distrito sanitário contendo as quadras com o total de lotes
vagos, os casos de dengue registrados pontualmente, a localização das borracharias,
floriculturas e ferro velhos, as áreas verdes, os rios e córregos.
O município é subdividido em Distritos Sanitário. Cada distrito possui uma
identificação e é responsável pela área que ele abrange ou seja, cada quadra dentro do
município pertence apenas a um Distrito Sanitário.
As atividades de Borracharia, floricultura e ferro velho podem ser obtidas através do
arquivo convencional de Atividades-ISS e georreferenciadas pelo endereço (Num.
Logradouro + num. Imóvel). Cada atividade georreferenciada está relacionada com o
arquivo convencional contribuinte-ISS onde estão armazenados os dados do
contribuinte que está exercendo a atividade.
Os lotes vagos podem ser localizados no arquivo convencional de IPTU. No entanto, o
seu georreferenciamento deverá ser feito através dos campos num.setor e num.quadra.
Como os lotes não estão fechados, não será possível localizar individualmente cada lote.
Serão localizadas todas as quadras que possuem lotes vagos. A chave de identificação
de uma quadra é num. setor + num. quadra. A localização lote vago estará associada ao
arquivo convencional Imóvel IPTU para obtenção do proprietário do lote.
O Endereço é uma entidade gráfica simbólica localizado na base geográfica e será sobre
ele que as atividades e notificações estarão localizadas.
O número e nome do logradouro estão no arquivo convencional Logradouro. Este
arquivo estará relacionado com o endereço e as notificações.
Analisar o problema apresentado e modelar a aplicação utilizando o modelo Geo-OMT.
Caso os lotes já estivessem fechados (polígonos) na base geográfica, qual será a
diferença no esquema feito anteriormente?
Divisa
Municipal
1...*
Distrito Área Verde Rio
Sanitário
C 1 1 1
Notificação
sobre 1...*
1...*
Lote Vago
sobre
Pertence
0...* 1...*
1...* Atividades
0...* Contrib-ISS
pertence
Exerce
Contribuinte-ISS
0...1 1...* 1
1...*
Distrito Área Verde Rio
Sanitário
C 1 1 1
Notificação
sobre 1...*
1...*
Lote sobre
Pertence
0...* 1...*
Atividades
0...* Contrib-ISS
tipo de ocupação Exerce
Contribuinte-ISS
1...* 1
Lote Lote Vago
Edificado
tipo de atividade
1...*
Borracharia Floricultura Ferro Velho
pertence
0...1
Imóvel IPTU
•
Significado
Representação Gráfica
Nome da Classe
Classe Convencional
Atributos
Nome da classe
Operações
Representação
Simplificada
Nome
da Classe Classe Georreferenciada
Geo-objeto Linha
Atributos Gráficos
Nome
Atributos da Classe
Nome Nome
Subclasse Subclasse
Hachura = verde
Nome Classe
Generalização Espacial
As subclasses possuem atributos gráficos diferentes
da superclasse no entanto, herdam os atributos
alfanuméricos
Subclasse Subclasse
Hachura = verde
Nome Classe
Nome da relação Relacionamento Espacial
Nome Classe
Nome da relação Hierarquia Espacial
Nome Classe
nome da rede
Nome Classe Nome Classe
Relacionamento em Rede
nome da rede
Classe
Agregação Espacial
Subdivisão Espacial (subdividido em)
Classe
U
Agregação Espacial
União Espacial (união de)
Classe
C Agregação Espacial
Contém
Significado
Representação Gráfica
SuperClasse
Generalização Cartográfica pela Forma
sobreposta / total
F
Subclasse Subclasse
SuperClasse
Generalização Cartográfica por Escala
disjunta / total
E
Subclasse Subclasse
Nome da classe
0...1 Cardinalidade
Zero ou um
Nome da classe
1...* Cardinalidade
Um ou mais
Nome da classe
1 Cardinalidade
Exatamente um
. /
[Abri74] ABRIAL, J. Data semantics. In: KLIMBIE, J., KOFFEMEN, K.(Eds.). Data
Base management.North-Holland, amsterdam, 1974, p.1-59.
[BCMM96] BÉDARD, Y., CARON, C., MAAMAR, Z., MOULIN, B., VALLIÈRE, D.
Adapting data models for the design of spatio-temporal databases.
Computers, Environment and Urban Systems, London, v.20, n.1, p.19-41,
1996.
[Bert67] BERTIN, Jaques. Sémiologie graphique: les diagrammes, les réseaux, les
cartes. Paris: Mounton et Gauthier-Villars, 1967. 431p.
[CaBe93] CARON, Claude, BÉDARD, Yvan. Extending the individual formalism for a
more complete modeling of urban spatially referenced data. Computers,
Environment and Urban Systems, London, v.17, p.337-346, 1993.
[CFSC94] CAMARA, G., FREITAS, U., SOUZA, R., CASANOVA, M., HEMERLY,
A., MEDEIROS, C. A model to cultivate objects and manipulate fields. In: 2ND
ACM WORKSHOP ON ADVANCES IN GIS, 1994, Proceedings...p.20-28.
[CoYo91] COAD, P., YOURDON, E., 1991, Object-Oriented Analysis., 2nd edition.
Englewood Cliffs, New Jersey: Prentice Hall.
[Davi97] DAVIS Jr., Clodoveu. GIS: dos conceitos básicos ao estado da arte. Espaço
BH, Belo Horizonte, n.1, p.5-8, 1997.
[Ditt86] DITTRICH, K. Object-oriented database systems: The notion and the issues. In:
INTERNATIONAL WORKSHOP ON OBJECT-ORIENTED DATABASE, 1986, Pacific
Groce, CA. Proceedings...IEEE, New York, p.2-17.
[Egen95] EGENHOFER, Max J. Object-oriented GISs: the principles. In: III SIMPÓSIO
BRASILEIRO DE GEOPROCESSAMENTO, 1995, São Paulo. Anais... p.175-203.
[Fran92] FRANK, Andrew U. Spatial concepts, geometric data models, and geometric
data structures. Computers & Geoscience, London, v.18, n.4, p.409-417,
1992.
[Hann95] HANNA, Magdy S. A close at the IFO data model. Sigmod Record, v.24, n.1,
p.21-26, 1995.
[HuKi87] HULL, Richard, KING, Roger. Semantic database modeling: survey,
apllications, and research issues. ACM Computing Surveys, v.19, n.3, p.201-
260, 1987.
[KaCh95] KANG, S., CHOY, Y. Object-Relational data modeling for GIS. In:
GIS/LIS’95, 1995, Nashville. Proceedings... v1, p.535-5417.
[Kemp92] KEMP, Karen K. Environmental modeling with GIS: a strategy for dealing
with spatial continuity. Santa Barbara: University of California, 1992. (PhD
thesis).
[LiIo96] LISBOA F., Jugurta., IOCHPE, Cirano. Análise comparativa dos modelos de
dados conceituais para sistemas de informações geográficas. Porto Alegre:
CPGCC da UFRGS, 1996. RP- 266.
[MaES95] MARK, David M., EGENHOFER, Max. J., SHARIFF, Abdul R. M. Towards
a standard for spatial relations in SDTS and geographic information systems
In: GIS/LIS’95, 1995, Nashville. Proceedings... v.2, p.686-695.
[MaFr90] MARK, David M., FRANK, Andrew U. Language issues for geographical
information systems. Santa Barbara, CA: National Center for Geographic
Information and Analysis (NCGIA), 1990. Technical Report 90-10.
[MeBo96] MEDEIROS, C. B., BOTELHO, M. A. Tratamento do tempo em SIG. In: GIS
BRASIL96, 1996, Curitiba. Anais... p.534-553.
[MePi94] MEDEIROS, Claudia B., PIRES, Fátima. Databases for GIS. SIGMOD
Record, v.23, n.1, p.107-115, 19917.
[Monm91] MONMONIER, Mark. How to lie with maps. Chicago: The University of
Chicago Press, 1991. 176p.
[NaFe94] NATIVI, Stefano, FEDERICI, Giorgio. A conceptual modelling for the GIS
developing. In: FIFTH EUROPEAN CONFERENCE AND EXHIBITION ON
GEOGRAPHICAL INFORMATION SYSTEMS – EGIS/MARI’94, 19917.
Proceedings...v.1,p.899-908.
(http://wwwwsgi.ursus.maine.edu/gisweb/egis/eg94102.html)
[PeBS97] PEREZ, Celso R.; BATISTA, Daniela C. F.; SALGADO, Ana Carolina.
BDGEO: modelagem, implementação e visualização de dados geográficos.
In: GIS BRASIL97, 1997, Curitiba. Anais... p.252-262.
[SaNF79] Dos SANTOS, C., NUHOLD, E., FURTADO, A. A data type approach to
entity-relationship model. In: 1st INTERNATIONAL CONFERENCE ON ENTITY-
RELATIONSHIP APPROACH, 1979, Los Angeles, CA. Proceedings....
[SCGL97] SHEKHAR, S., COYLE, M., GOYAL, B., LIU, D., SARKAR, S. Data model
in geographic information systems. Communications of the ACM, v.40, n.4,
p.103-111, 1997.
[Ship81] SHIPMAN, D. The functional data model and the data language DAPLEX.
ACM Transactions on Database Systems, v.6 n.1, 1981.
[TiSa94] TIMES, Valéria C., SALGADO, Ana Carolina. Uma modelagem orientada a
objetos para aplicações geográficas. In: 9o SIMPÓSIO BRASILEIRO, 1992, São
Carlos-SP. Anais... p.293-309.
! " #
$
$ % %
COURIER MAIÚSCULAS
! & "
' "
( ) & !*+
%& (
!*+
,( $
! & # -./01
2 "
#" & !*+
' 3
<resposta> = CONSULTA (<regiao>)
<resposta> = OPERAÇÃO (<regiao>)
<resposta> = <regiao1> OPERAÇÃO_BINÁRIA <regiao2>
1 ' 4 5
#" ! "& 6
7 ) 4( 8 5! 4
6 &9 5 $
"& 0 ! % )
! % $
2 " "
6 ' ! "& +
$ " $ ' !
%& " $ ' % % #"
1 $ #
& '
% % 1 $ )
# % ! &
# ! " #
%
1 $ "
6 ! %
"& 6# "
( % #
municipio.”AREA_URBANA” = REGION((banda4 – banda3)/(banda4 +
banda3) < 0.2):
2
3
• ) ) 6 : '
6 6 6 %
• " " ( 2; )<=
, <<> - '
& $ -?
• 7 ' ! '
"& $
• ' ' )
6
% @ -?
,
3
, # 3
) OBJECTSET @ , 1AB 17 2 CA 7 -:
) NETWORK @ / 2 :
) RASTER @ 2 2 ; 7/0, 0 :
) CELL @ -. D - , B / -
E & ' # %
" !
= , $ 3
) TABLE " )
) MASK # #% "
) RECTANGLE CIRCLE & " %& (
> , 6 6 3
) COLLECTION3 6 "
F 7 INT, FLOAT, CHARACTER
BOOLEAN
3
" 3 "
#" : " ! :
@ ! :
! " # "$
!
& # %
# $
CREATE <especialização> (<atributos gerais>)
IS_A <classe básica> | <especialização>
(<atributos específicos>)
# & & $
3
• , 47 - 5 &
CREATE Tipo_Solo
(CLASSE_SOLO STRING;
PH_SOLO DOUBLE;}
IS_A OBJECT_SET;
• , 4G 5 & H 6
4 5 4 I 5 4 -B -5
CREATE Hospital
(nome STRING;
num_leitos INT;
receita_SUS FLOAT;)
IS_A OBJECT_SET;
" % DEFAULT
! % & @ " % 8 6
$
=J
• CREATE Landsat_TM
IS_A RASTER
(RES_X = 30;
RES_Y = 30;)
4
% & " ' ( # $" &! "
$ @
NEW . ) 6 #
! % @
7 $ $
• , @ USOSOLO
acao_antrópica_1990 6 #
JJ $ JJ
USOSOLO ant_1990 = NEW (“ação antrópica 1990”);
• , @ Hospital
hospital_SJC3
3
$ -?
! 6
#% ) 6 ) 1 )
& %
E
. ) 6
"
'
) * & ( "
$ 3
' ) 6
'
) 6
E # SELECT @
% @
E
B % $ )
I " # ( # 4 )
% 5
5
= # FROM 6
! &
> #WHERE ' 9 INSIDE,
TOUCH, CROSS, OVERLAP, DISJOINT
DISTANCE
F " $ #3
SELECT <valor > | <objeto> | <lista de objetos e
valores>
FROM <objeto> IN <classe>
WHERE <where_clause>
7 ) $ 3
4- ' K FJ L
7 5 # " M
K M )0
$ #3
SELECT regiao
FROM regiao IN Regioes_França,
cidade IN Cidades_França
WHERE cidade.nome = “Toulouse” AND
distance (regiao, cidade) < 50 km
6
)% & #" $#"
B ! " -?
6
-? :
& 4 5 !
%
) 6 " 6
$ $ ) %
" %
6 $ ( ! 6
N 4 %
=J L &O 5 6 $
) 6 P reserva, represa Q %
!
" # " $ .
-?
4 5 ) ) 6 +
2; ) 6 2 ; , <<>
2; !
I #
"
- "
& @ COLLECTION & " )
$ 3
COLLECTION <colecao> OF <classes_OBJETOS> |
<classes_atributos>
1 % %
) 6 % %
) 6 6
% .
) 3 R/ I FL
( - A, @
( R #
1 $ ! Hospital Postos_Saude
" " %
7
COLLECTION postos_dist (Postos_Saude, FLOAT);
postos_dist =
(SELECT postos, distance (postos, hospital)
FROM postos IN Postos_Saude,
hospital IN Hospital,
WHERE hospital.nome = “Municipal”
AND distance (postos, hospital) < 5 km );
$
, 3 4-
"& " ; ( & ( 8 ! - %
6 6 F L 5 -
$ + Fazenda, Estrada, Rede_Estradas,
Cadastro_Fazendas.
9$ $
, 3 4- "& 01, /
. . JJJ ( 6
# J JJJ 07/5
8
1 % 6 FAZENDAS
6 ) cadastro CADASTRO_INCRA
# " " ME
) 6 6 )
" " ' ( %
' I 01, / ( % #
fazendas
cadastro
K ME) $ ) 6 6 )
9
) &" , " "$
6 6 )
6 '
6 - $ # N 6 %
$ ,
6 ! ! 6 )
6 % )
-./ 01 2 0 . 3- . 0 ' 3 0
1 3 4;
! % &O FJ L
%5 - $ + Aeroporto,
Reserva, Mapa_Reserva e Mapa_Aeroportos
// definições da coleção
COLLECTION aero_res (Aeroporto, Reserva, FLOAT);
// consulta sobre geo-objetos
aero_res= ( SELECT aeroporto,reserva,
distance(aeroporto, reserva)
FROM aeroporto IN AEROPORTO,
reserva IN RESERVA
WHERE (aeroporto INSIDE reserva
OR distance (aeroporto, reserva) < 50 km));
1
) 6 ) .
O ' " !
) 6 !
% #
10
42 . # !
! & # &9 5
// definições dos dados
// definição da coleção
COLLECTION rios_podz (Rios);
// recuperacao dos mapas
rede_rios = (SELECT rede FROM rede
WHERE rede.nome = “mapa_rios_PR”);
Solos = RETRIEVE (“mapa_solos_PR”);
// consulta sobre geo-objetos
rios_podz= (SELECT rio
FROM rio IN Rios
WHERE rio CROSS REGION(solos.”TIPO”= “podzólico”));
E 40 ! , ! #
% 5
// definições da coleção
COLLECTION lotes_risco Lotes;
// recuperacao dos mapas
decl= RETRIEVE (“declivid_CBT”);
// juncao espacial sobre geo-objetos e geo-campo
lotes_risco= ( SELECT lotes
FROM lotes IN Lotes
WHERE lotes INSIDE REGION (decl.”CLASSE” = “Alta”)
OR lotes OVERLAP REGION (decl.”CLASSE" = “Alta”));
11
)) & " " "$ "&" &
1 % ) 9 %
& LINKED_TO ! 9
6 7 ) &
4S ( ) 5
$ 3
<geo_objeto> LINKED_TO <geo_objeto>.
p. 92-17-63 p 92-17-64
Sub-estação
Hospital
K M=) $
, $ ) " M=
! 4? ( N ) A
C @ ! 5
3
COLLECTION hospitais (Hospitais);
hospitais= (SELECT cons
FROM cons IN Consumidor,
sub_estacao IN Sub_Estacao
WHERE sub_estacao.”NOME” = “Jardim Botanico”
AND cons.”TYPE” = “Hospital”
AND cons LINKED_TO sub_estacao );
12
!
9 #"
' ) ) 6
! 3
• 7 " ' )
• ' )
• # " '
" &
%# ) 3
• PONDERE (WEIGHT)3 %
# 9 :
• FATIE (SLICE): % #
9 :
• RECLASSIFY3 % #
9 # 9
, ! ! # "
. "
# " ! %
6 " TABLE ! &
" WEIGHT_TABLE, SLICE_TABLE, RECLASSIFY_TABLE
13
1 / . /
B 3 ATTR_IN
ATTR_OUT
%
$ 3
<tema_entrada> : <peso>
$
#
solo = RETRIEVE (“Solos_CE”);
tab_peso= NEW
(ATTR_IN = “TipoSolo”, ATTR_OUT = “PESO_SOLO”,
“Le”: 0.2, “Li” : 0.4, “Aq” : 0.5));
solo = PONDERE (solo, tab_peso);
1 / & 2 00 52 /
" % %
9 " "
! 3 ATTR_IN ATTR_OUT " "
$ 3
<tema_entrada>: <tema_saida>;
1 $
&O " P4K 2 5 4K 8# & 5
4/ 5 4V 2 5 4, 5Q # #
" % P4K 5
42 5 4, 5Q - $ + 3
VEGETACAO DESMATAMENTO.
14
// definição da função de mapeamento
tab_recl= NEW (ATTR_IN = “Vegetacao”,
ATTR_OUT = “Desmatamento”,
“Floresta Densa” : “Floresta”,
“Floresta Varzea”: “Floresta”,
“Rebrota” : “Desmatamento”,
“Area Desmatada” : “Desmatamento”,
“Cerrado” : “Cerrado”);
// recuperação dos dados
mapa = RETRIEVE(mapa_Amapa”);
mapa = RECLASSIFY (cobertura, tab_recl);
SWITCH
) W # " 6 '
" " $ $
- ( %
"
CREATE Aptidao (“classe”: STRING)
IS_A CELLSPACE;
campo_aptidao= SWITCH
{ “Boa” : solos.”TIPO” = “Le”
AND chuva.”MAX” >= 1000;
“Media” : solos.”TIPO” = “Aq”
AND chuva.”MAX” >= 600;
“Baixa” : OTHERWISE;
}
15
4+ &" , ! "# ! 6# "
' # 3
• ' 3 + − ∗
% /:
• " ' # 3 sin cos tan
atan log $ exp &
! sqrt :
• ' 3 ! < ! > <=
>= == " !=
, $ # %
- . ) !
" I
3
{
sp = RETRIEVE (“sampa”);
sp.”peridoso” = sp.”pop70” / sp.”pop_total”;
}
16
" #
1 2; ' %
% . "
# " ITERATOR, !
6 ,
<<> 3
tipo ITERATOR <T>
propriedades:
stable?: Boolean
iteration_order: Enum (forward, backward)
operadores:
next()-> element:T
first()-> element:T
last() -> element:T
more?()-> element:T
reset()
delete()
1 next
9$ 2 ! next I
% # nil ( next
@ iteration_order
% forward, I @ iteration_order %
backward
ITERATOR " & #
ITERATOR
" " @ 3
ITERATOR <nome_iterador> OVER <coleção>;
#
DO...UNTIL WHILE
. 4
, # FJ L
=
FJ JJJ # 5
// Definicoes dos elementos do Banco
VARIABLE mapa_mun_CE Mapa_Municipal;
INSTANCE mapa_acudes_CE Mapa_Acudes;
17
// definições da coleção e do iterador
COLLECTION cid_acu_CE (Cidade, Acude);
ITERATOR elem OVER cid_acu_CE;
// consulta sobre geo-objetos
cid_acu_CE = (SELECT cidade, acude
FROM cidade IN Cidade
acude IN Acude
WHERE acude.capacidade > 50.000
AND DISTANCE (cidade, acude) < 50 km);
// percorre a coleção
WHILE MORE (elem)
BEGIN
//processamento da colecao (nao mostrado)
elem= NEXT (elem);
END
7% #& $ $" # # ,
' ! ! (
" $
& FOR..TO..STEP WHILE
IF...THEN...ELSE '
, $ ) # %
& 08 2 1 E 8 G //
1 , 4 5 (
% & '
% # ! +
! & - %
% : ) 9$ !
! 6 % % %&
! & ' $ +
) Imagem_NOAA
Indice_Vegetacao.
18
VARIABLE ivdn Indice_Vegetacao;
COLLECTION avhrr1, avhrr2 Imagem_NOAA ;
ITERATOR b1 OVER avhrr1;
ITERATOR b2 OVER avhrr2;
avhrr1= (SELECT imagem FROM Imagem_NOAA
WHERE imagem.banda = 1
AND imagem.mes = 9
AND imagem.quinzena = 1);
avhrr2= (SELECT imagem FROM Imagem_NOAA
WHERE imagem.banda = 2
AND imagem.mes = 9
AND imagem.quinzena = 1);
ivdn = NEW
(nome= “IVDN Set95 Quinz1”,
mes = “Setembro”, quinzena=1)
REPRESENTED_BY RASTER
(RES_X= 1000, RES_Y =1000);
19
# 3
' avhrr1 avhrr2 #
6 ) " 0
' ! '
! &
E % #% ivdn # " "
& JJJ $ JJJ
8 G // # &
% &
= ' avhrr1 avhrr2 " %
b1 b2 VALUE (b1) % % %
)
> " " '
)
ivdn = (VALUE(b2) - VALUE(b1))
/(VALUE(b2) + VALUE(b1));
& ivdn
20
!"# $ %
&
# ' ( ) *+ , -
# ' &+ *
+ '() * * '. ( . /0 12 3/ 4 0 5
677 2 3 4 '89 2 9 :. / 6777"# ; * & *
4 '8 !"#
-*
*
# ; *
< #
& * -* =
< # 8= % =
= '()
4)/ 4 !2 9 8> 4 /? 4 !2 @8; A ; 8 677 2 3/ 4 0
12B /C >' 1 D29 / . ;4 E/( ; F"#
& GH I" GH I" = , % &
H # &
0 J ; / ' 677 "# ' * 9H K 677 " * L
% &
#'
MG
!
" # #
"
$%
8= = &
& & H + #
< &
! & # 8= % &
# ; H & &
3/ 4 0 5"#
' * & &
#
&
N * # ;
* *+ & %
N L <
# * < # 8
< * * L #
* L M ! #
* < N
* *+ < & # 8
L # * % % +& *
< -
& ? J (' 3 4 '89 2677 "#
* % <
* % < #
*
% * %
# 9
= = * %
C L M 2 H H
H N2 <* O &
9 . * * 2 H H
2 - - H N @. C 6776"#
* * %
, " # " % , & "
& "#
+ 3* 7# & !
84 ) 84 38/ ) 8?) 82 1"#
P ! ' #
; = -* #
& & %
3* 7# Q / +
3 Q 8 * H ) * 1"
@ %
' %
# 8
#( H -
#
& #
8?8 B 8('' (J 8(/ 2 D"
L
&
, & #
#
& *
#;
#; & % =
% & # &
, # &
L & % '
# = H
& +& ,#
(
4)/ 4 !"#
# 4 & = #
# 4 & & & &
% &
& < #
#8 +
* & $&
# ' ( & -
'" & 2
& + $ L
* * -* 8?8 B 8(' D"#
M & *
3* 7#6#
3* 7#6 8
3 B K R#
@
M #
& + &
# & L
#
7# "# 8 #
)" " '4 ?) / '' 72
C //8/ D 2 8?8 B 8('' (J 8(/ D"#
+
S H #
& *
, H - #
*
L )"#
* M &
= H
<& H L #
C C
8 +
C C C
-
7# 9 =
3 ? ( @. C 6776"#
& # &
& & # 8
O #
, = C 8"
'4 ?) / '' 6"# & & "
* = * 3* 7#!"# ; C 8
% (? = (8" &
(?" & (8"# < 8
T UT
B /C >' R"#
Tempo de evento
3* 7#! 8 C
3 B K D#
S = C 8 ? 8"V =
= , % ?
& 8# L -*
& W & "#
& #8 L *
* "# &
, %
M ' ' # 1!"
3* 7#D"M * +' * +'
* +' * & +' * +' * +
* & +#
3* 7#D @
3 Q !
* * = H = L
* % #8 S
$
# + = *
H N < C L # 3* 7#R
* % % H H "
H " 7#6
"#8 * H N %
D * 6WRW R
& 67W!W F# 3 * W6W 1 * H
N !W1W 5 5WFW 1
* H !W W 1#
H . N % = "
J ) % & '*
* A % @ <*
% 67W!W F 6WRW R H
H % H
9 . A @ <*
!W1W 5 W6W 1 H
H H
9 . A !W W 1 5WFW 1
H
7#6 ) % H N
3 / +& @ % @C #
3* 7#R H N % C L 3
@
4 = + & %
& * H
& "# E
< % &
W6W 1 5WFW 1"#
%
* H - #9 H N
# & 3* 7#F
* % N#
& "
" H - & * #
* & O
H N#
3* 7#F H N=
3 @
% < + *
& L = & &
& # 8 + $ &
+ * -* #
* + L H -
% * H - + #
? = <& * M
A & ' + X 5 Y
A & O O
* O ? C <
5 Y
A % - * H N 1Y
; S *
% & * # 8 &
* M
* " * # - * %
L #
;
9H K 677 " 3* 7#5 M
• ! M
# *
& #
• ! M * %
O S &
S & % "# 8
* W = " #9 =
#@ * &
+ 2
• ! M@ & *
& & + &
#' *
% * & #' * O
2
• ! , %4 * % S
, * "# 4
* % * &
* % * #9 =
* #
3* 7#5 '
3 9H K 677 #
A * * * X 67W!W 6Y
A * L L (@ ;
677 Y
A * ? C 6WFW6777Y
A * 9 . < 6WDW 1
H %Y
A +* 1M77 H 6 %
$ 67M77 H R % 17Y
A * + 9 . XY
A $ & = XY
A -& + X O Y
A L *
& L Y
A & * X D7[ Y
? < 9 . X &
O Y
8 * % -
* < * % # 4
& %
#.
H - = P,
O * &
% O #
* +
= , L =
*
& & H - * = 9 8> 4 677 "
! "
* & = , *
%
* #@ =
# $ S * %
$ #9
. Z "M G !
! - ! !
. #
" '
' ( $
* % L <
/# %
& = , # )
9 9 Z 11" %
%
# / % %
% % % #
677 "
9H # 6" * M #
& & &
# &
- % * &
& * #
/ * #
H C D" 0 '
/# 0 * &
* % = - *
% * # * * * % &
* %
$ # S
+ * %
& & # * % * * *
% < = ,
& <& # /
% * % * % %
* % 677 "# 8
& * * &
% #( <& *
# %
? "
# % < '()
H C D" 3* 7#1 = #
3* 7#1 9
3 C //8/ D#
9 H F" =
& #3
% &
% L -* %
#8 O & & M
# # 3
F 3* 7# "#
3* 7# *
3 9 H F#
K 8 * H 52 1" < (
# ( S
* % * & (
< # S
' * % * = #
. Z " L D
K 8 * H 5 1" H
C D" #
& & &+ #8 &
& * % # 8
+ * % M
' /# $
) %
* % & <
* % * % %
L
* % $
& " * % " *
H - * % +
* # @
% * *+ *
= L * #
= =
% % * *+ +
% * %
* %
& & #
* * * & +
* % H = (#
@ <& K
8 * H 5 1 6777" & & * * & -
9? 1 . "# 9? &
+ P, *
#8 & &
= *
% * % # & 9?
3* 7# 7#
; * % * * = = &*
= * = , #8
& H - # ,
* % * % #
$ * %
+ &
* #
"
I A
A A J
R1
"
3 K 8 * H 5 6777"#
4 3* 7# &
* % -* S
< #
A A A A A A
R1 R1 R1 R2
B B B B B B
& H *
3* 7#
3 K 8 * H 5"
& & * 3*
7# 6# & &
* % # *
% * % #
( $ * % #
A A M M
I
A A
J M M
A
M J
A
I
A M
J
B B
J M
B
B
J M
B
M
' (
3* 7# 6
3 K 8 * H 5"
9? & + & &
=
=
-* # 4
* % = #
9 H - * %
) #8 &
& & * % <
= #' *
* % #
; * < #
G& I# @ & &
& 3/ 4 0 677!"#
% & # 4 S
/ *H " & &
% # B /C >' 677!"#
% H H
H = & #
; & S #@
, - # @ S
# & + #; &
# & <
& B /C >' 677!"#
9 B 4 3 Z 677!"
# 8
& & # & # *
& O = #
= & " #;
& #
! " #
& *
S * %
&
& & * %
) % * # 8
* & & * %
#
4
# ; *
< # G& I 3/ 4 0 677!"# @
& & & B /C >' 677!"#
; #
& # * & O
= # = &
" 3/ 4 0 677!"#
* % * *+
* & &
* % # &
H - %
#
% + &
& & S
"# . =
< & & %
% <
% + #
* * & &
% # 8 * , <&
M & 3* 7# M
1
Definição da WordNet, citada em Frank (2003).
PROCESSOS
P1 Pn
A1 A6 A2 A4
OP1 OP3 OP3 OP2 OP3 OP4 OP1 OP3 OP1
………..
AÇÕES
A1 A2 An
OP1 OP3 OP3 OP4 OP1 OP4 OP2
…………….
OPERAÇÕES PRIMITIVAS
OP1 OP2 OP3 …………… OPn
4
* %
% # @
% &
* * * * 9? # 8
& &
# 8 & % <&
* #
& * # &
#
% * *+ &+ * %
* #8 * <
H <* #
@ H + *
= & 9? *
* % * # * *
# *
* %
* #3 < % &S
%+ = & " % #
Geometria
1 1 1
H <*
Objeto c/ A A A
geometria
1 J
) % = ) % = @ * %
H -
\Q
Transição
Transição do tipo
junção & "
3* 7#6 Q 8 @ & 9? " * %
* "
& 9? "
$ $ %*
! M∅→* 1 1
! M* →∅ / 1 1
! M* = %* → %* A
A
A-1
1
! %M %* = %* → A
%* A
AuB
B
3* 7#! & *
A operação creategeom cria uma geometria a partir de uma lista de pontos. A operação
destroygeom destrói a existência de uma geometria. A operação subtrgeom subtrai uma
geometria fornecida de uma geometria que corresponde à representação espacial de um
objeto. A operação subtrgeom é uma operação entre tipos diferentes: geometria e objeto.
A operação uniongeom faz a junção de uma geometria de um objeto com a geometria de
outro objeto. A álgebra preliminar relacionada às operações primitivas propostas é
apresentada a seguir:
& $* K
'
* M*
%* %*6 %*!M %*
M → *
*
/ M →&
*
M * → %* → %*
M %* → %* → %*
M * → *
M %* →
* * M %* → *
&(
* * K* * "" ] &
$* "] * " )
* * * "] *
$ %*6" ] * %* * "" )
* * %*6" ] * * %* " *
* %*6"] * %* "
$ %*!" ] * %* %*6"" )
* * %*!" ] * * %* " ∪ * * %*6"
* %*!"] * %* "
% =
* #8 S =
% + % S #
< G#I
P, *# " ="] * =""# % *#
& =
*#
&
< C L M
• M & %
* 2
• M & % & 2
• M* & % , =
• ! M L % = 2
• M * % & %
* 2
• M L * % *
% 2
3* 7#D * #
?
####### ####### 6
obj1 obj1
gmt1 gmt1
####### ####### 6
####### ####### 6
obj2 obj2
obj1 obj1 obj1
###########! ############ 6
####### ####### 6
6
########### ############
3* 7#D Q ( & & % * *+
& $ % ^* K_
M * → %*
M %* →&
M %* × × → %*
! M %* × %* → %*
M %* × × ×* → %*
M %* × %* × * → %* × %*
M %* →
M %* → *
* M*
%* %*6 %*!M %*
M
M
$ %* " ] * " )
* %* "]
* * %* "] *
& %* " )
* K %* "" ] &
* * K* * " "] &
$ %*6" ] %* "" )
* "" `] * %* ""
* %*6" ]
* * %*6" ] * * %* "
$ %*!" ] % %* %*6" )
* %*!" ] * %* "
* %*!" `] * %*6"
* * %!" ] * %* %*6"
$ %*6" ] * %* * " )
* %*6" `] * %* "
* %*6" ]
* * %" ] * %* * "
* * %6" ] *
* & 9? $
#
& * +
% %* * " %* * "
6% %* " K % "# K* *
"
!% %* " %* "# K
* * %* ""
D%! %* %*6" destroy(objg2).
* %* * *
%*6""
R# %* * create(id,tp,gmt1).
" subrgeom(objg1,gmt1)
F% %* %*6 * " * %*6 * "#
* %* * "
* %
* #8 % M
• 2 M 2
• 2 M & 2
• 2 M
• M & + * % *
% # 9 = M &
+ W + &
O + %
L * "# +
* * *
"2
• 2 M & *
= 2
• 2 M *
= 2
• 2 M * &+ *
& % * 2
• 2 M * % & %
* 2
• 2 M + & &
* = , #4
H -
+
#
, -. *
# 2 ^ %*_^*
_" ] 4 %* " * """
6# 2 ^ %*_" ] 4 K % ""#
K* * """
3.substitui_unidades([objg],[id], ] 4 K %* ""#
[tp]) " "* * %* """
D# %* ^ _ substituir(objg1,idN,tpN).
^ _^* _" (for i=1,N-1 do( segmentar(objg1,id(i),tp(i),
gmt(i)))
R# 2 ^ %*_ %* "#
" ]64 % %* %* """
F# 2 ^ %*_" ]64 % %* %* """
5# 2 %* ^ _ for i=1,N do( segmentar(obj1, id(i),tp(i)gmt(i)))
^ _^* _"
1# 2 ^ %*_^ _ for i=1,N do( segmentar(obj(i), id(i),tp(i), gmt(i)))
^ _^* _"
# 2 ^ %*_ ] 4 %* " %*"#
^ _^ _^* _" " "* """#
$
4 = < C
L % & = L
#
= * *
H N < # 3* 7#R &
* % * H N H
* # . =
H * + H #
3* 7#R Q a H =
3 Q@
% * *+ +
% H N H & H "
+ H + & *
H "# L % + H
+ #8 =
* &* # S
& &
= , # & & * M * %
+ * % Y = ,
* % & *
% Y
S 9 . 9 .# '
% * *+ H * % + +
+ H # 4
H -
+ $+ * % + = = +
< -* "
% + #
* 3* 7#F = #4 + 9?
^_" % #
ANTES 1
TLB 1
TLB
Área Linha férrea
TL E
1
LA
1
LA
LA LB LD
LG
TL D
Junta
unidades 1
LA
1
LA
substitui
unidades 1
TLF
1
TLE 1
AF1
1
AR1
DEPOIS
1
LG
Área Linha férrea
TL F
1 LB 1 LB
LB AR1 fusão
LA LD
unidades
LC LF LE
TL H
TL D 1
TLH 1
TLH
segmenta
unidades
1
LE 1
LE
1
LC 1 LC
3* 7#F Q ( + 9? + H
L & % * %
& ? % L "
+ * + H #
! 2 L * % %
H + +
& " % + H +
# + H %+ + %
* % * *+
#
* L & * *
% + #E 2
* % * & <
& * % < +
H # * + 2 L
* * % *
% + H - * % #
* * % 8 "
< * % +
/ " $ 2
& & * % #
1 Algoritmos Geométricos
em SIG
Existe também muito desenvolvimento na área de indexação espacial para SIG. São
algoritmos e estruturas de dados desenvolvidos especialmente para agilizar a busca e
recuperação de dados em bancos de dados geográficos. As estruturas de indexação
espacial procuram agilizar a resposta a dois tipos fundamentais de perguntas:
Para entender melhor a maneira como os SIG tratam a informação vetorial, estão
relacionadas a seguir algumas definições fundamentais [ref. Vetores em GIS]. Como na
maioria dos SIG comerciais, as definições consideram apenas duas dimensões.
Alguns SIG denominam objetos localizados com apenas um ponto como símbolos. Isto
se deve ao fato de sempre se associar um símbolo cartográfico ao ponto, para fins de
apresentação em tela ou em um mapa.
Reta e segmento de reta: Sejam p1 e p2 dois pontos distintos no plano. A combinação
linear α . p1 + ( 1 − α ) p2 , onde α é qualquer número real, é uma reta no plano. Quando
0 ≤ α ≤ 1 , se tem um segmento de reta no plano, que tem p1 e p2 como pontos extremos.
Esta definição é estritamente geométrica, e nos interessa uma definição mais aplicada.
Assim, partimos para o conceito de linha poligonal, que é composta por uma seqüência
de segmentos de reta. O mais comum, no entanto, é definir a linha poligonal através da
seqüência dos pontos extremos de seus segmentos, ou seja, seus vértices.
Polígono: Um polígono é a região do plano limitada por uma linha poligonal fechada.
A definição acima implica que, apenas invertendo a condição (3) da linha poligonal,
temos um polígono. Assim, também aqui não é permitida a interseção de segmentos fora
dos vértices, e os polígonos onde isto ocorre são denominados polígonos complexos. Os
mesmos comentários que foram feitos para poligonais valem para os polígonos.
Observe-se também que o polígono divide o plano em duas regiões: o interior, que
convencionalmente inclui a fronteira (a poligonal fechada) e o exterior.
Objetos de área podem ter três formas diferentes de utilização: como objetos isolados,
objetos aninhados ou objetos adjacentes. O caso de objetos isolados é bastante comum
em SIG urbanos, e ocorre no caso em que os objetos da mesma classe em geral não se
tocam. Por exemplo, edificações, piscinas, e mesmo as quadras das aplicações cadastrais
ocorrem isoladamente, não existindo segmentos poligonais compartilhados entre os
objetos. O caso típico de objetos aninhados é o de curvas de nível e todo tipo de
isolinhas, em que se tem linhas que não se cruzam, e são entendidas como estando
“empilhadas” umas sobre as outras. Este caso tem muitas variações, pois curvas de nível
podem ser também representadas como linhas, uma vez que podem permanecer abertas
em algumas situações, e também podem ser entendidas como subproduto de modelos
digitais de terreno, que são campos. Finalmente, temos objetos adjacentes, e os
exemplos típicos são todas as modalidades de divisão territorial: bairros, setores
censitários, municípios e outros. São também exemplos mapas geológicos e
pedológicos, que representam fenômenos que cobrem toda a área de interesse. Neste
caso, pode-se ter o compartilhamento de fronteiras entre objetos adjacentes, gerando a
necessidade por estruturas topológicas. Estes também são os casos em que recursos de
representação de buracos e ilhas são mais necessários.
Também objetos de linha podem ter variadas formas de utilização. Analogamente aos
objetos de área, pode-se ter objetos de linha isolados, em árvore e em rede. Objetos de
linha isolados ocorrem, por exemplo, na representação de muros e cercas em mapas
urbanos. Objetos de linha organizados em uma árvore podem ser encontrados nas
representações de rios e seus afluentes, e também em redes de esgotos e drenagem
pluvial. E podem ser organizados em rede, nos casos de redes elétricas, telefônicas, de
água ou mesmo na malha viária urbana e nas malhas rodoviária e ferroviária.
Quase sempre aparecem sutilezas com relação à definição que serão especificamente
ligadas a aspectos da lógica de construção do software SIG. Um SIG baseado em
topologia, por exemplo, define áreas ou regiões a partir de seqüências de arcos, que por
sua vez conectam nós. Um sistema desktop mapping poderá impedir a utilização de
objetos compostos por vários polígonos. Um SIG baseado em SGBD relacional poderá
permitir buracos, mas não permitir polígonos externos adicionais.
1.1.1.3 Tipos abstratos para dados vetoriais
Será apresentada a seguir um breve resumo das definições da seção anterior, seguida da
a formulação de tipos abstratos de dados para suportar os dados vetoriais. Esta
formulação será usada na descrição de algoritmos geométricos no restante deste
capítulo.
estes pontos. Estes segmentos formam uma poligonal L se, e somente se, (1) a
interseção de segmentos consecutivos é apenas o ponto extremo compartilhado por eles
(i.e., si ∩ si +1 = vi +1 ), (2) segmentos não consecutivos não se interceptam
(i.e., si ∩ s j = ∅ para todo i, j tais que j ≠ i + 1), e (3) v 0 ≠ v n −1 , ou seja, a poligonal
não é fechada.
Polígono: Um polígono é a região do plano limitada por uma linha poligonal fechada.
Estas três entidades geométricas básicas podem ser definidas em uma linguagem de
programação usando tipos abstratos de dados, conforme apresentado no Programa 1.1.
Essa definição inclui tipos abstratos para retângulos e para segmentos, que serão
bastante úteis na indexação espacial e em alguns algoritmos geométricos. Não foi
definido um tipo abstrato específico para polígonos, uma vez que corresponde a
poligonais em que o primeiro e o último vértices coincidem. Para as poligonais, foi
incluído no tipo uma variável Retângulo, para armazenar os limites do objeto em
cada eixo1.
1
Este retângulo é usualmente denominado retângulo envolvente mínimo (REM), e é o menor retângulo
com lados paralelos aos eixos que contém o objeto em questão.
estrutura Ponto
início
inteiro x;
inteiro y;
fim;
estrutura Segmento
início
Ponto p1;
Ponto p2;
fim;
estrutura Retângulo
início
inteiro x1;
inteiro y1;
inteiro x2;
inteiro y2;
fim;
estrutura Poligonal
início
inteiro numPontos;
Retângulo retânguloEnvolventeMínimo;
Ponto[] vertice;
fim;
2
Esta opção também é feita neste trabalho, considerando principalmente que é a alternativa mais usada
pelos SIG comerciais.
metros em y. Para limitar a possibilidade de distorção na projeção, no entanto, os
valores x variam de fato apenas de 166.667 a 666.667 metros.
Muitos SIG adotam inteiros de 32 bits, sem sinal, para representar coordenadas. Isto
permite valores entre 0 e 4.294.967.295. Valores decimais são geralmente representados
pela adoção de um número fixo de casas decimais, validos para todos os dados gráficos.
Por exemplo, para representar coordenadas UTM com precisão de 1 centímetro, pode
ser estabelecido um “fator de precisão” de 100. As coordenadas inteiras não mais
representam metros, mas centímetros. O SIG assume a responsabilidade de inserir o
ponto decimal na posição correta quando necessário, mas todos os cálculos internos
serão realizados usando as coordenadas inteiras. Com um fator de 100, adequado para
aplicações urbanas, a faixa de coordenadas efetivamente utilizáveis passa a ser de 0 a
42.949.672,95, que corresponde a mais de 40.000 quilômetros – suficiente para dar a
volta ao mundo, e claramente mais do que o necessário para representar um fuso UTM.
Área. Uma vez que na representação vetorial se trabalha com vértices e suas
coordenadas, a fórmula elementar da geometria para cálculo da área de um triângulo (“a
área de um triângulo é igual à metade do produto entre sua base e sua altura”) não é
muito prática. Em vez dela, serão utilizados dois resultados equivalentes da álgebra
linear. O primeiro usa o produto de dois vetores, que determina a área de um
paralelogramo, o dobro da área do triângulo que interessa. Outro método calcula a área
diretamente, por meio de um determinante 3x3.
i j k
zU = ( yU zV − zU yV )i + ( zU xV − xU zV ) j + ( xU yV − yU xV ) k
xU yU
xV yV zV
( xU yV − yU xV )
S=
2
1
S= ( x y − y A x B + y A xC − x A yC + x B yC − y B xC ) (1.1)
2 A B
xA yA 1
1 1
S = xB yB 1 = ( x A y B − y A x B + y A xC − x A yC + x B yC − y B xC ) (1.2)
2 2
xC yC 1
Também neste caso a área será negativa se a seqüência de vértices estiver orientada em
sentido horário, e positiva caso contrário.
início
retorne ((A.x*C.y - A.y*C.x + A.y*B.x - A.x*B.y +
C.x*B.y - C.y*B.x) / 2);
fim;
início
retorne abs(áreaOrientadaTriângulo(A, B, C));
fim.
Teorema 1.1 - Sejam p1, p2 e p3 pontos não colineares no plano. Então cada
ponto p do plano pode ser escrito na forma
p = λ1 p1 + λ2 p2 + λ3 p3 (1.3)
λ1 x1 + λ2 x 2 + λ3 x 3 = x p
λ1 y1 + λ2 y 2 + λ3 y 3 = y p
λ +λ +λ =
O sistema acima tem por determinante exatamente aquele apresentado na
Equação 1.2 e seu valor corresponde ao dobro da área do triângulo p1p2p3. A área
é não-nula, pois p1, p2 e p3 não são alinhados por hipótese. Assim, o sistema tem
solução única para cada p.
Os valores de λ1, λ2 e λ3 podem ser obtidos usando a regra de Cramer, e expressos em
termos de áreas de triângulos. Temos, portanto:
S ( pp2 p3 ) S ( p1 pp3 ) S ( p1 p2 p)
λ1 = , λ2 = e λ3 =
S ( p1 p2 p3 ) S ( p1 p2 p3 ) S ( p1 p2 p3 )
λ1 >0
λ2 <0 3 0
λ=
λ3 <0 λ1 >0
λ2 <0
λ3 >0
p1
λ 1= 0 λ1 <0
λ1 >0 λ2 <0
λ1 >0
λ2 >0 λ2 >0 λ2 = 0 λ3 >0
λ3 >0 p3
λ3 <0
p2 λ1 <0
λ2 >0
λ3 >0
λ1 <0
λ2 >0
λ3 <0
início
real lambda1, lambda2, lambda3, S;
C
A
D
B seEncontram(AB, CD) Compartilham exatamente um ponto extremo
C
A
C
D B disjuntos(AB, CD) Não são iguais, nem se encontram, nem se tocam,
nem são paralelos, nem se interceptam, nem se
superpõem
A
Adicionalmente aos predicados listados acima, existe a necessidade de definir uma
única função, denominada pontoInterseção, que retornará as coordenadas do
ponto de interseção (se houver) entre dois segmentos.
A implementação dos predicados depende de funções mais básicas. Uma delas, a função
para detectar o posicionamento relativo entre ponto e segmento orientado de reta, é
baseada no sinal do produto vetorial, conforme apresentado na seção 1.1.2. Por
exemplo, para determinar se o ponto C está à direita ou à esquerda do segmento
orientado AB, basta calcular a área do triângulo ACB pela Equação 1.1. Se esta for
positiva, o ponto C está à esquerda (Figura 1.3a); se for negativa, C está à direita (Figura
1.3b). Se a área calculada for nula, então A, B e C estão alinhados (Figura 1.3c).
Naturalmente, para esta e outras aplicações, é desnecessário calcular a área: apenas o
sinal do produto vetorial interessa.
B B B
C
C
S>0
S<0 S=0
C
A A A
U
V
V
B
B
U A
A B U V
C
fim então
senão
retorne falso;
fim.
y B − y A y D − yC
=
xB − x A x D − xC
e portanto
(y B − y A ) ⋅ (x D − xC ) − ( y D − yC ) ⋅ (x B − x A ) = 0 (1.4)
x A ( y D − yC ) + x B ( yC − y D ) + xC ( y A − y B ) + x D ( y B − y A ) = 0 (1.5)
Cuidados especiais deverão ser tomados para garantir que a interseção é própria. Se o
ponto de interseção não é pertence a pelo menos um dos segmentos, diz-se que a
interseção é imprópria (Figura 1.6a). Quando o ponto de interseção é interior a ambos
os segmentos, como na Figura 1.5, a interseção é própria. O conceito de interseção
própria em geral não inclui o caso em que a interseção ocorre em um dos pontos
extremos (Figura 1.6b), que corresponde ao caso dos predicados seTocam e
seEncontram.
D
P
B
A B
C
P B
D
(a) (b)
(x 2 ≥ x 3 ) ∧ ( x 4 ≥ x1 ) ∧ ( y 2 ≥ y 3 ) ∧ ( y 4 ≥ y1 )
onde
x1 = min( x A , x B ) x3 = min( x C , x D )
x 2 = max ( x A , x B ) x4 = max ( x C , x D )
y1 = min( y A , y B ) y3 = min( y C , y D )
y 2 = max ( y A , y B ) y4 = max ( y C , y D )
ou seja, P = (x1, y1) e Q = (x2, y2) são respectivamente o canto inferior esquerdo e
superior direito do REM de AB, e P’ = (x3, y3) e Q’ = (x4, y4) são, analogamente, os
cantos do REM de CD (Figura 1.7).
Q' Q
Q
Q'
P P
P'
P'
(a) (b)
início
Ponto P, Ponto Q, Ponto P1, Ponto Q1;
B
D
D C
A A A
(a) (b) (c)
(B-A) x (D-A) < 0 (B-A) x (D-A) = 0 (B-A) x (D-A) = 0
(B-A) x (C-A) > 0 (B-A) x (C-A) > 0 (B-A) x (C-A) = 0
início
inteiro abc, abd, cda, cdb;
se não interseçãoRetângulos(A, B, C, D)
então retorne falso;
início
retorne (seEncontram(A, B, C, D) ou
seTocam(A, B, C, D) ou
seInterceptam(A, B, C, D));
fim.
início
retorne (não iguais(A, B, C, D) e
não seEncontram(A, B, C, D) e
não seTocam(A, B, C, D) e
não paralelos(A, B, C, D) e
não superpostos(A, B, C, D) e
não seInterceptam(A, B, C, D));
fim.
A primeira e mais óbvia solução é baseada em geometria analítica. Dados dois pares de
pontos, cada par definindo um segmento no plano, deve-se deduzir as equações das retas
e resolver um sistema de duas equações e duas incógnitas, cuja solução é o ponto de
interseção.
y = a1 x + b1 . (1.6)
y − y A yB − y A
= ,
x − xA xB − x A
então
yB − y A
a1 = e b1 = y A − a1 x A .
xB − x A
y = a 2 x + b2 , (1.7)
y D − yC
a2 = e b2 = y C − a 2 x C .
x D − xC
A solução para o sistema indica o ponto de interseção entre as retas AB e CD, que não
necessariamente pertence aos segmentos AB e CD. Assim, um teste adicional é
necessário para verificar se a interseção é ou não própria. Isto pode ser feito verificando
se ambas as coordenadas do ponto de interseção P estão dentro do intervalo formado
pelas coordenadas dos pontos extremos de ambos os segmentos, ou seja:
e também
Embora a formulação acima pareça ser uma boa maneira de resolver o problema, alguns
obstáculos e inconveniências persistem. Em primeiro lugar, um programa que
implemente esta formulação precisa lidar com a possibilidade de se obter zero em um
dos denominadores. Isto pode acontecer em três situações: (1) a reta AB é vertical
(xA = xB), (2) a reta CD é vertical (xC = xD), ou (3) as retas AB e CD são paralelas
(a1 = a2). Nos casos (1) e (2), o ponto de interseção pode ser calculado de forma trivial,
aplicando a abscissa da reta vertical à equação da outra reta. No caso (3) fica claro que
as retas não têm ponto de interseção, e portanto o problema não tem solução, i.e., não
existe ponto de interseção, próprio ou impróprio. Em todos os casos, no entanto, mas
problemas numéricos ainda podem surgir quando o denominador é “quase” zero. Lidar
com estas exceções no código pode ser problemático, levando ao desenvolvimento de
programas menos robustos.
Uma solução um pouco mais conveniente para o problema usa também a geometria
analítica, mas aplica uma representação paramétrica para os segmentos que evitará as
inconveniências listadas acima. Esta formulação é a seguinte: seja AB um segmento de
reta qualquer no plano. Seja U = B − A um vetor correspondente ao segmento.
Qualquer ponto P ao longo da reta que passa por A e B pode ser obtido a partir da soma
vetorial P( s) = A + sU , onde s é denominado o parâmetro da equação. Mas temos que
P(0) = A , e P(1) = A + U = B , e é possível chegar a qualquer ponto do segmento AB
variando s entre 0 e 1.
Analogamente, pode-se representar o segmento CD pela expressão Q(t ) = C + tV , onde
V = D − C e t é o parâmetro. Um ponto de interseção entre AB e CD é aquele para o
qual P( s) = Q(t ) , e portanto A + sU = C + tV . Decompondo os pontos e os vetores em
coordenadas, temos novamente um sistema de duas equações e duas incógnitas em s e t,
cuja solução é [ORou94]:
x A ( y D − yC ) + xC ( y A − y D ) + x D ( yC − y A )
s=
denom
t=−
(x (y A C )
− y B ) + x B ( y A − yC ) + xC ( y B − y A )
(1.9)
denom
onde
denom = x A ( y D − y C ) + x B ( y C − y D ) + x C ( y A − y B ) + x D ( y B − y A )
x I = x A + s( x B − x A )
(1.10)
y I = y A + s( y B − y A )
Em uma tentativa de evitar que o cálculo seja feito inutilmente, ou seja, para evitar que
um ponto de interseção impróprio seja calculado, inseriu-se no início da função um teste
preliminar, usando o predicado seInterceptam. Note-se também que os problemas
numéricos não são totalmente eliminados com esta implementação. Ainda existe o risco,
por exemplo, de se ter um valor de denom exageradamente alto, correspondente à
situação em que as retas são quase paralelas, podendo gerar imprecisão numérica no
cálculo de s e t. Faz sentido, portanto, assumir o custo adicional do teste
seInterceptam, que incorpora o teste simples e seguro de interseção de retângulos,
para evitar ao máximo situações numericamente problemáticas.
função pontoInterseção(Ponto A, Ponto B, Ponto C, Ponto D, Ponto I):
booleano
início
real s, t, denom;
se não seInterceptam(A, B, C, D)
então retorne falso;
No entanto, uma maneira mais eficiente de resolver o problema é construir uma lista
ordenada dos valores extremos dos intervalos, tomando o cuidado de identificá-los
como sendo L ou R, de acordo com sua situação no intervalo. Assim, não haverá
interseção alguma entre os intervalos se e somente se a lista ordenada contiver uma
seqüência alternada de Ls e Rs: L R L R ... L R L R. Em qualquer outra situação, pode-se
afirmar que existe superposição entre algum par de intervalos (Figura 1.9). Esta solução
tem complexidade computacional da ordem de O(n log n), uma vez que é dominada pela
ordenação dos valores extremos [PrSh88].
L R L R L R L R
(a)
L L R L R L R R
(b)
A idéia consiste em deslocar uma reta vertical pelo conjunto de segmentos, buscando
identificar inversões na ordem em que esta reta encontra dois segmentos quaisquer. Para
implementar esta idéia, é necessário definir uma nova relação de comparação, da
seguinte forma: considere-se dois segmentos s1 e s2 no plano, sendo que s1 não
intercepta s2. Diz-se que s1 é comparável a s2 se, para alguma abscissa x, existe uma
linha vertical que intercepta tanto s1 quanto s2. Assim, diz-se que s1 está acima de s2 em
x se, naquela abscissa, a interseção da reta com s1 está acima da interseção da reta com
s2. Esta relação é denotada como s1 >x s2. Na Figura 1.10, temos as seguintes relações: s3
>v s2; s4 >v s3; s4 >v s2; s4 >w s2; s4 >w s3; s2 >w s3.
s4
s
3
s1
s2
v w
Observe-se que, para que s1 e s2 possam trocar de posição, é necessário que exista algum
x para o qual s1 e s2 são consecutivos na ordenação. O algoritmo usa este fato, testando
apenas elementos consecutivos, à medida em que novos eventos vão sendo detectados
conforme descrito acima.
Inicialmente, as abscissas dos pontos extremos dos segmentos são ordenadas e inseridas
no event-point schedule. Em seguida, as abscissas são retiradas a partir da menor, e são
realizadas as seguintes operações:
• Se for um ponto extremo à direita, excluir o segmento do sweep line status. Verificar
se existem interseções entre os segmentos que estão imediatamente acima e abaixo
dele na linha de varredura. Caso exista interseção (que estará necessariamente à
direita do ponto extremo), a abscissa do ponto de interseção deve ser calculada e
inserida no event-point schedule, caso já não pertença a ele.
Com ligeiras modificações, o programa acima pode ser modificado para verificar se
existe alguma interseção entre os n segmentos. Neste caso, não é necessário manter a
fila de prioridades, pois a primeira interseção detectada interromperá o algoritmo, e o
event-point schedule pode ser implementado como um simples arranjo [CLR90]. Com
isso, a complexidade computacional cai para O(n log n), tendo sido demonstrado que
este resultado é ótimo [PrSh88].
Os algoritmos que trabalham com poligonais3 são muito importantes para os SIG, uma
vez que diversas operações básicas, freqüentemente repetidas, são baseadas neles. Em
particular, estamos interessados em estudar problemas relacionados à representação de
objetos utilizando poligonais, visando conseguir formas de representação mais simples e
3
Deste ponto em diante, será utilizado o termo poligonal, em lugar de simplesmente linha, para evitar
confusão com a definição geométrica da linha reta (infinita).
compactas a partir de dados mais detalhados. Dentro desse escopo, é necessário levar
em consideração que uma das características da poligonal em cartografia é o fato de
possuir sempre uma espessura [Peuc75][Bear91], o que a distingue da linha geométrica
ideal.
Outro objetivo é o de gerar uma nova versão da linha, uma versão mais adequada para a
representação do mesmo fenômeno geográfico em outra escala, menor que a escala
original de digitalização. Neste caso, está sendo obtida uma generalização da linha
[McSh92]. Em uma extensão deste enfoque, existe o interesse em organizar os vértices
da poligonal de tal forma que seja possível produzir, dinamicamente, versões
generalizadas adequadas para uma escala definida no momento da visualização
[Oost93][OoSc95], conseguindo portanto gerar múltiplas representações geométricas
para o mesmo fenômeno sem introduzir dados redundantes. No entanto, a utilização de
métodos e algoritmos desenvolvidos originalmente apenas pensando na redução do
número de vértices da linha podem não ser adequados para alcançar o objetivo de
generalização [LiOp92], em geral por não conseguirem uma boa representação
geométrica4, e portanto devem ser analisados cuidadosamente quanto a este aspecto.
eliminado, uma vez que o ângulo 324 é menor que o mínimo tolerável. Uma alternativa
4
Para auxiliar na manutenção do aspecto natural da poligonal, existem enfoques que integram algoritmos
de simplificação com algoritmos de suavização [McMa89].
mais rara é a área entre as poligonais (Figura 1.11c), onde se estabelece um limite para
ao deslocamento de área.
3 3
2 2 4
4
distância máxima ângulo mínimo
1 1
(a) (b)
3
2 4
deslocamento de
área máximo
1
(c)
5
Um algoritmo baseado nestes conceitos foi implementado em um software chamado WHIRLPOOL
[Bear91], mas sua utilização é comprometida por sua tendência em alterar a topologia percebida das
poligonais durante o processo de generalização, especialmente nas situações em que canais estreitos e
penínsulas são estrangulados e “ilhas” inexistentes são formadas. Devido a este problema, o algoritmo de
Perkal não será abordado por este trabalho.
seu efeito é inócuo para o problema de simplificação, pois conduz a uma seleção
aleatória dos objetos e segmentos de poligonal que serão mantidos, assumindo que a
poligonal é um conjunto de vértices equiprováveis [Butt85]. Assim, em generalização a
Lei do Radical continua sendo útil na determinação prática de quantos objetos devem
ser mantidos pelo processo de generalização – embora não permita determinar quais
seriam estes objetos.
| S|
d=
dist ( B, C )
onde dist(B, C) é a distância euclidiana entre os pontos B e C, e o único valor que tem
que ser testado contra zero para evitar erros numéricos no processamento.
n′
MPCV = × 100
n
σ (n ′) l ′
MPCN = × 100
σ ( n) l
6
Neste e em outros estudos existe a preocupação em utilizar naturally occurring lines, ou seja, poligonais
usadas para delimitar ou representar fenômenos que ocorrem na natureza, considerando uma ampla gama
de fenômenos: curso e estuário de rios, linhas costeiras e curvas de nível, por exemplo. Dentro de cada
tipo de fenômeno, busca-se selecionar poligonais com comportamento variado. Por exemplo seriam
incluídos tanto rios jovens, com muitos meandros de curvatura brusca, quanto rios antigos, com curvas
suaves e em menor quantidade. Um estudo anterior que procurou utilizar estes critérios foi [Mari79].
Mudança percentual na angularidade: avalia a redução da “microssinuosidade” após
a simplificação. Esta medida pode ser definida como:
n ′− 3
∑ ang (v , v
i =0
i i +1 , vi + 2 )
MPCA = n−3 × 100
∑ ang(v , v
i =0
i i +1 , vi +2 )
onde ang é uma função que calcula o ângulo definido por três pontos (Figura 1.11b),
que no caso é utilizada em segmentos consecutivos na poligonal simplificada e na
poligonal original.
∑ d (v , P)
i =0
i
DVT =
l
A( P ′, P)
DAT =
l
onde A é uma função que calcula a área total entre duas poligonais (Figura 1.11c), e l é o
comprimento da poligonal original.
NSC ′
MPCS = × 100
NSC
7
São deixados intencionalmente de fora alguns algoritmos, como os propostos em [Deve85], [Will78] e
[Joha74], por não acrescentarem elementos relevantes à discussão.
equiprováveis [Peuc75][Butt85]. Trata-se de selecionar aleatoriamente uma quantidade
predeterminada (n’) dos vértices que compõem a poligonal, gerando desta forma uma
nova poligonal simplificada. Como no caso do k-ésimo vértice, o algoritmo não
considera a geometria da linha, e também corre o risco de desprezar pontos
característicos.
Uma variação interessante deste algoritmo estabelece, como tolerância, não a distância
do vértice central ao segmento formado pelos outros dois, mas sim o ângulo entre os
segmentos v1v2 e v1v3. Quando este ângulo estiver abaixo de um valor dado, os pontos
são considerados alinhados e v2 é descartado, sendo reiniciado o processamento em v3.
Caso contrário, v2 é mantido, e o processamento recomeça por ele (Figura 1.11b).
De acordo com [McMa87a], Jenks posteriormente propôs uma variação desta rotina
angular considerando três valores distintos de tolerância, denominados min1, min2 e ang.
Se a distância entre v1 e v2 for inferior a min1, ou se a distância entre v1 e v3 for inferior a
min2, então v2 é eliminado. Caso as duas distâncias ultrapassem os valores mínimos, é
então testado o ângulo entre os segmentos v1v2 e v1v3 contra a tolerância ang, da maneira
descrita acima.
O melhor caso, por outro lado, ocorre quando nenhum vértice é eliminado. Nesta
situação, cada um dos n - 2 vértices intermediários é testado uma única vez contra seus
vizinhos imediatos, produzindo um cálculo de distância ponto-reta. O algoritmo é,
assim, O(n) no melhor caso.
Observe-se que este comportamento é o inverso do apresentado pelo algoritmo Douglas-
Peucker, que será apresentado adiante, no sentido de que seu pior caso ocorre quando
elimina todos os vértices, e o melhor ocorre quando todos os vértices são mantidos.
Sendo assim, este algoritmo poderá ser mais eficiente que o Douglas-Peucker em
situações de simplificação mínima, e está recomendado para situações em que o
interesse seja simplesmente a eliminação de vértices alinhados, com tolerância
baixíssima.
13 17 13 17
12 12
18 18
11 19 11 19
3 29 3 29
4 4
10 20 10 20
2 2
9 21 28 9 21 28
22 22
1 1
5 23 27 5 23 27
6 8 24 26 6 8 24 26
7 7
25 25
(a) (b)
15 15
16 16
14 14
13 17 13 17
12 12
18 18
11 19 11 19
3 29 3 29
4 4
10 20 10 20
2 2
9 21 28 9 21 28
22 22
1 1
5 23 27 5 23 27
6 8 24 26 6 8 24 26
7 7
25 25
(c) (d)
11
3
4
10
in
2
dm
dmax 9
22
1
5 23
Área de eliminação
de vértices 6 8
7
(a) (b)
11 11
3 3
4 4
10 10
2 2
9 9 21
22 22
1 1
5 23 5 23
6 8 6 8 24
7 7
(c) (d)
6
tolerância tolerância
(a) (b)
3
4
8
tolerância
tolerância
(c) (d)
Com relação ao grau de compactação, observe-se que este algoritmo só será capaz de
eliminar n − n p vértices, uma vez que, em cada intervalo são preservados, no mínimo,
os dois vértices extremos. A manutenção dos vértices extremos de cada intervalo
prejudica a aparência final da poligonal, pois sua seleção é tão arbitrária quanto a
realizada pelo algoritmo do k-ésimo vértice.
início
se ((f - a) == 1) então retorne;
maxd = 0;
maxp = 0;
para i = a+1 até f-1 faça
início
d = distância(linha[i], linha[a], linha[f]);
se d > maxd então
início
maxd = d;
maxp = i;
fim se;
fim para;
se maxd > tol então
início
vértice maxp selecionado;
DP(a, maxp, tol);
DP(maxp, f, tol);
fim
senão retorne;
fim;
início
vértice 1 selecionado;
vértice numvert selecionado;
DP(1, numvert, tol);
fim.
15
16
14
13 17
12
18
11 19
3 29
4
10 20
2
9 21 28
22
1
5 23 27
6 8 24 26
7
25
15
29
tolerância
29
9
1
tolerância
3
29
9
1
tolerância
3
2 29
9
1
tolerância
15
16
17
3 29
4
9
22
1
6 24
tolerância
17
29
9
1
24
tolerância
9 24
1.614 2.705
3 11 17 27
0.750 0.213 1.094 0.514
2 6 10 13 16 22 25 28
0.177 0.894 0.070 0.267 0.354 0.256 0.247 0.078
4 8 12 14 18 23 26
0.371 0.224 0.224 0.100 0.238 0.108 0.054
5 7 19
0.250 0.094 0.062
21
0.044
20
0.028
Assim, a melhor situação para o particionamento ocorre quando o vértice mais distante é
o vértice central do intervalo8. Neste caso, é possível formular a seguinte equação de
recorrência:
8
Esta situação pode ocorrer, por exemplo, quando os vértices da poligonal estão dispostos ao longo de
um semicírculo [Nick88].
n n
T (n) = (n − 2) + T − 2 + T − 2
2 2 (1.11)
T ( 2) = 0
n
T ( n) = n + 2 T
2 (1.12)
T ( 2) = 0
Resolvendo a Equação 1.12, resulta O(n log n), que indica o melhor desempenho do
algoritmo quando todos os vértices são mantidos. No entanto, o pior caso ocorre, de
forma também análoga ao quicksort, quando a divisão é feita no segundo vértice ou no
penúltimo, fazendo com que a recorrência assuma a seguinte forma:
T (n) = (n − 2) + T ( n − 1)
(1.13)
T ( 2) = 0
O melhor caso ocorre quando todos os vértices da poligonal podem ser simplificados
imediatamente. Assim, apenas uma iteração é necessária, calculando as distâncias de
todos os vértices intermediários à reta definida pelos extremos, e portanto o algoritmo é
O(n).
Definição 1.1 - Dada uma cadeia de vértices (vi, ..., vj) pertencentes a uma poligonal
P, o path hull da cadeia é definido como sendo a tripla [vm, CC(vi, ..., vm),
CC(vm, ..., vj)], onde CC(vi, ..., vj) é o fecho convexo dos vértices entre vi e vj. O
vértice vm é chamado de tag.
Em seguida, são definidas as operações básicas sobre path hulls: criação, divisão e
localização do vértice mais distante. A operação de localização do vértice mais distante
utiliza uma pesquisa binária sobre os dois fechos convexos do path hull, localizando
dois pontos extremos em cada. Em seguida, é calculada a distância de cada um destes
extremos à reta, e retornado o vértice mais distante em cada fecho. O custo total desta
operação é O(log n) no pior caso. Como esta operação é chamada O(n) vezes, isto
determina o custo total do algoritmo em O(n log n).
A operação seguinte é a criação, que consiste em dividir um conjunto (vi, ..., vj) de
vértices ao meio, escolhendo o vértice central como tag, (i.e., m = (i + j ) / 2 ) e criar dois
fechos convexos: um entre todos os pontos anteriores ao tag (vi a vm), e outro com os
pontos posteriores (vm a vj). Para construir os fechos convexos, os autores indicam a
9
Vide seção 1.1.6
utilização de um algoritmo de Melkman [Melk87], incremental e baseado em pilhas.
Estas pilhas conseguem armazenar não apenas o fecho convexo desejado, mas também
todos os fechos convexos intermediários, que serão usados a partir das divisões. A
operação final, divisão, utiliza estas pilhas para reconstruir o “histórico” do fecho
convexo que contém determinado vértice k, retrocedendo o fecho previamente calculado
para todos os vértices até o momento da inserção de vk no fecho. Os autores demonstram
que a combinação das etapas de criação e divisão custam também O(n log n) no pior
caso.
O algoritmo modificado para incluir o path hull tem, desta forma, complexidade
computacional O(n log n) no pior caso, contra O(n2) no algoritmo original. Os autores
chamam a atenção, no entanto, para os fatores constantes, bem mais significativos no
caso do path hull do que no algoritmo Douglas-Peucker, uma vez que o algoritmo
original não trabalha a estrutura geométrica da poligonal. Para desenvolver uma melhor
noção comparativa quanto a este aspecto, torna-se necessário implementar ambos os
algoritmos no mesmo ambiente computacional e comparar diretamente os tempos de
execução na solução de problemas típicos. Os autores do aperfeiçoamento o fizeram,
mas somente compararam linhas artificiais, tentando simular os casos extremos de
desempenho. No entanto, destacaram a dificuldade de se selecionar um conjunto
representativo de linhas para realizar uma comparação adequada.
α2
α1
α4
α2
α3
α1
ε
vj
vk ε
2δ
vi
No entanto, dada sua natureza incremental e seu comportamento linear, este algoritmo
pode ser uma excelente opção para aplicativos de digitalização de linhas, onde
trabalharia para eliminar vértices desnecessários à medida em que o trabalho prossegue.
Uma demonstração desta possibilidade foi implementada pelos autores em Java, e
colocada à disposição no URL http://ra.cfm.ohio-state.edu/grad/zhao
/algorithms/linesimp.html.
v i+1
v i-1
início
para i = 1 até numvert - 2 faça
calcular a área efetiva do vértice i;
repita
min = vértice com menor área efetiva correspondente ;
se area_efetiva(min) < tol_area
eliminar o vértice min;
recalcular as áreas efetivas dos vizinhos do ponto eliminado ;
até que (area_efetiva(min) >= tol_area) ou
(todos os vértices intermediários foram eliminados );
fim.
Figura 1.28 - Lago digitalizado com 204 vértices (a), e simplificado pelos
algoritmos de Douglas-Peucker (b) e Visvalingam-Whyatt (c),
mantendo 10% dos vértices originais.
A escala de digitalização do lago da Figura 1.28 foi 1:50.000. A Figura 1.29 compara as
três representações da Figura 1.28, desta vez plotadas em escalas aproximadas de
1:100.000 e 1:200.000. Observe-se como o detalhamento obtido na digitalização
original torna a poligonal muito complexa, com detalhes praticamente irreconhecíveis,
nas duas escalas menores (Figura 1.29a), produzindo um aspecto excessivamente
poluído. A simplificação por Douglas-Peucker (Figura 1.29b) efetivamente diminui a
quantidade de detalhes, mas apresenta vários “picos” com aspecto pouco natural. A
simplificação por Visvalingam-Whyatt (Figura 1.29c) consegue eliminar as feições
menos significativas do lago, como os diversos pequenos estuários que ocorrem ao seu
redor.
Além disso, esta estrutura de dados precisa ser modificada em cada iteração do
algoritmo, uma vez que a eliminação de um vértice causa o recálculo das áreas efetivas
dos dois vizinhos imediatos, o que por sua vez demanda um rearranjo no heap para
preservar sua propriedade. No caso do algoritmo, pode ocorrer que uma área efetiva já
presente no heap seja modificada para menos ou para mais. No primeiro caso, o item
correspondente à área modificada precisa subir no heap, enquanto no segundo caso o
item precisa descer. Qualquer rearranjo desta natureza em heaps é feito em tempo O(log
n). Como o rearranjo é feito a cada retirada de elementos, o pior caso é a execução deste
passo n vezes, e portanto temos novamente tempo O(n log n), que é a complexidade
final do algoritmo.
O problema de mínimo erro não tem aplicação imediata na área de interesse deste
trabalho, uma vez que desejamos construir poligonais mais compactas dado um erro
máximo tolerável. Já o problema de número mínimo de segmentos se assemelha
bastante em termos de formulação a alguns dos algoritmos já analisados, introduzindo o
requisito de garantia de otimalidade, ou seja, de que o resultado tenha um número
mínimo de segmentos e portanto um número mínimo de vértices.
O principal problema consiste em montar o grafo G, checando cada par de vértices para
verificar o atendimento à condição de distância máxima. Isto pode ser feito na base da
força bruta, combinando todos os vértices da poligonal entre si, mas levaria tempo
O(n3), uma vez que existem O(n2) pares de vértices e para cada par seria necessário
verificar o erro avaliando a distância dos vértices intermediários, o que pode consumir
tempo O(n). Outros autores apresentaram propostas semelhantes, obtendo tempo O(n2
log n) [Melk88] [ImIr86], mas Chan e Chin demonstraram a viabilidade de obter o
mesmo resultado em tempo O(n2). De qualquer maneira, este tempo é dominante sobre
o tempo de processamento do caminho mínimo, e superior aos apresentados pelos
algoritmos anteriores, que não garantem resultados ótimos.
Desta forma, a concepção dos algoritmos parte da dedução do tamanho do menor objeto
visível (smallest visible object, ou SVO). Naturalmente, o tamanho do SVO é expresso
nas unidades de medida da tela ou do mapa, e portanto pode ser traduzido em medidas
reais através da aplicação do fator de escala. Li e Openshaw utilizam um resultado
anterior, obtido por Müller [Mull87], que indica o valor de 0,4mm como sendo o
mínimo necessário para assegurar a separabilidade visual dos objetos, com base na
espessura das linhas plotadas e na resolução do olho humano. Qualquer detalhe de
tamanho menor é desnecessário: virtualmente toda a informação adicional que exista é
perdida, pois os humanos não são capazes de percebê-la. Outro estudo do mesmo autor
[Mull90a] usa o mesmo conceito na detecção de conflitos entre elementos
generalizados.
(a) (b)
Note-se que o polígono, sendo a região do plano limitada pelas arestas, contém todos os
pontos internos. Em muitas aplicações e algoritmos, no entanto, existe a necessidade de
distinguir entre a fronteira e a região limitada pelo polígono. Assim, será usada aqui a
notação ∂ P para representar a fronteira, enquanto P representará a região. Isto significa
que ∂ P ⊆ P . O símbolo de derivada parcial é usado porque, no sentido topológico, a
fronteira é a derivada parcial da região. A partir desta definição, concluímos que o
polígono, entendido como sendo a região, divide o plano em duas partes: o interior
(limitado) e o exterior (ilimitado). Este conceito é fundamental para aplicações de SIG
envolvendo polígonos.
Figura 1.34 - Dois polígonos de seis lados que exigem dois guardas
Para um dado polígono de n vértices, existe sempre um número necessário (mínimo) de
guardas. É necessário mostrar que este número é suficiente para todos os polígonos de n
vértices. Formalmente, o problema é determinar os valores de uma função G(n),
definida como G( n ) = max Pn g( Pn ) , onde Pn é um polígono genérico de n vértices, e a
função g(P) determina o mínimo número de guardas para um polígono específico P.
Obviamente, G(3) = 1, uma vez que qualquer triângulo é convexo, e portanto pode ser
coberto por um único guarda. Pode-se mostrar facilmente que também G(4) = 1 e G(5) =
1. No entanto, G(6) = 2, como se pode perceber pela Figura 1.34, confirmando por
experimentação. Isto leva a uma conjetura inicial, de que G( n ) = n / 3 . Essa conjetura
foi provada por Fisk, em 1978, usando triangulação de polígonos.
Figura 1.35 - Para este polígono com 14 vértices, 4 guardas são suficientes (nos
vértices pretos)
Triangulação de polígonos. Na solução do Problema da Galeria de Arte foi utilizada a
triangulação de polígonos, e afirmou-se que a triangulação é sempre possível. Para
provar esta afirmação, é necessário estabelecer algumas condições iniciais, relativas à
convexidade de vértices e à existência de diagonais.
v i+1
vi vi v i-1 vi
vi vi vi
Figura 1.37 - Três situações possíveis no Lema 1.2 : (a) vi-1vi+1 é uma diagonal,
(b) vi-1vi+1 intercepta a fronteira e (c) vi-1vi+1 é exterior a P
Este lema demonstrou que qualquer polígono com mais de 3 vértices deve ter pelo
menos uma diagonal. Observe-se, no entanto, que qualquer diagonal encontrada dividirá
o polígono em duas partes. Se uma parte ficar com apenas três vértices, tem-se
obviamente um triângulo. Se ficar com mais de três vértices, formará também um
polígono, que também tem pelo menos uma diagonal. Recursivamente, chega-se a uma
triangulação completa. O teorema abaixo formaliza esta conclusão.
Um corolário ao Lema 1.3 é que a soma dos ângulos internos de um polígono com n
vértices é (n - 2)π, correspondendo à soma da contribuição de cada um dos
(n - 2) triângulos, cada qual tendo somatório de ângulos internos igual a π.
No grafo dual, cada nó claramente terá grau máximo igual a 3, uma vez que cada
triângulo tem no máximo três lados para compartilhar.
Se o dual de uma triangulação não tem ciclos, então trata-se de uma árvore. Como cada
nó tem grau máximo de 3, então a árvore é binária, quando se escolhe uma raiz com
grau 1 ou 2. Esta correspondência entre triangulação de polígonos e árvores binárias é
muito útil na implementação de algoritmos de geometria computacional.
1 n −1
A( P) = ∑ ( xi yi +1 − yi xi +1 ) (1.14)
2 i =0
O sinal da área calculada indica o sentido da seqüência de vértices. A área será negativa
se os vértices estiverem em sentido horário, ou positiva se em sentido anti-horário,
exatamente como no caso da área do triângulo (Equação 1.1). Como já foi dito, a base
do raciocínio para o desenvolvimento do somatório é o mesmo do cálculo da área de um
triângulo. O somatório da Equação 1.14 corresponde à soma da área de n triângulos,
formados entre um ponto arbitrário (no caso, a origem do sistema de coordenadas) e
cada par seqüencial de vértices (vi, vi+1). A demonstração pode ser encontrada em
[FiCa91].
x A + x B + xC y + y B + yC
xG = e yG = A
3 3
x G1 S (T1 ) + x G 2 S (T2 )
xG =
S (T1 ) + S (T2 )
y 1 S (T1 ) + y G 2 S (T2 )
yG = G
S (T1 ) + S (T2 )
No entanto, existe uma solução mais simples e independente da triangulação, e que leva
em conta triângulos com áreas positivas e negativas, como no cálculo da área do
polígono. O mesmo processo de média ponderada pela área pode ser usado,
considerando todos os triângulos formados entre um ponto fixo, por exemplo (0, 0), e
cada par de vértices sucessivos, (vi, vi+1).
10
Este resultado pode ser demonstrado usando as coordenadas baricêntricas, conforme apresentado na
seção 1.1.2.1, atribuindo valores iguais a 1/3 para os parâmetros λ1, λ2 e λ3 (Equação 1.3).
1 n −1
A( P) = ∑ ( x y − y i x i +1 )
2 i = 0 i i +1
n −1
∑ (x
i =0
i +1 + x i ) × ( x i y i +1 − y i x i +1 )
xC = (1.15)
3 A( P)
n −1
∑(y
i =0
i +1 + y i ) × ( x i y i +1 − y i x i +1 )
yC =
3 A( P)
S = S + parcela;
xc = xc + (P.fronteira[i].x +P.fronteira[i1]. x) * parcela;
yc = yc + (P.fronteira[i].y +P.fronteira[i1].y) * parcela;
fim;
se (S != 0) então início
xc = xc / (3 * S);
yc = yc / (3 * S);
fim senão início
xc = 0;
yc = 0;
sinalizar erro e retornar;
fim;
S = S / 2;
pt.x = xc;
pt.y = yc;
retorne (pt);
fim.
Figura 1.39 - Centróides calculados pela média (M) e como centro de gravidade (G)
(a) (b)
P P
Q
(c) (d)
• se a reta passa por um vértice, a interseção deve ser considerada apenas se for o
vértice com maior ordenada do segmento, e ignorada caso contrário;
O caso em que Q coincide com um vértice pode ser tratado pelo primeiro critério. O
terceiro critério faz com que todos os pontos da fronteira sejam considerados como
pertencentes ao polígono.
função pontoEmRetângulo(Ponto Q, Ponto A, Ponto B): booleano
/* testa se Q está contido no retângulo definido por A e B */
início
Ponto C, D;
se (C.y != D.y)
então início
calcular interseção;
se (interseção for à direita de Q)
então numInterseções = numInterseções + 1;
fim então;
fim;
retorne ((numInterseções mod 2) != 0);
fim.
11
O Programa 1.20, embora use os mesmos critérios de solução de casos degenerados, difere do
apresentado em [ORou94], pois não realiza a mudança de eixos proposta (que pode ser inconveniente), e
procura tirar partido das funções desenvolvidas na seção anterior.
pertencentes a determinados segmentos da fronteira são considerados como pertencentes
ao polígono, enquanto outros são considerados como não pertencentes. Como exemplo,
considere-se um retângulo com lados paralelos aos eixos. Pelo algoritmo do Programa
1.20, pontos nas laterais esquerda e inferior são considerados dentro, e pontos nas
laterais direita e superior são considerados fora do polígono. Este critério é o mais
recomendável em situações de particionamento do plano, em que se deseja que qualquer
ponto pertença a exatamente um polígono. Pelo critério anterior, pontos sobre a fronteira
comum entre dois polígonos pertenceriam a ambos.
função pontoEmPolígono1(Ponto Q, Poligono P): booleano
início
inteiro i, i1, numInterseções = 0;
• Ponto contido em apenas um polígono: neste caso, o polígono só poderá ser uma ilha,
e portanto o ponto está dentro da região. Caso o polígono seja um buraco, existe erro
topológico.
(a) (b)
Algumas vezes, o polygon overlay é definido como uma operação topológica, ou seja,
que é executada sobre dados organizados em uma estrutura de dados topológica. Estas
estruturas e operações sobre elas serão apresentadas na seção 1.2. As funções de
processamento de polígonos que serão descritas a seguir são utilizadas em sistemas não
topológicos, ou em situações em que o processamento é feito de maneira isolada, como
na criação e uso de buffers (vide seção 1.1.5.6).
No caso geral, operações de união, interseção ou diferença entre dois polígonos simples
podem gerar diversos polígonos como resultado. Mais ainda, os polígonos resultantes
poderão conter buracos. A Figura 1.43 contém exemplos de produção de múltiplos
polígonos e de polígonos com buracos em operações de interseção, união e diferença.
P
Q
(a) P U Q (b) Q - S
(c) P ∩ Q (d) P - R
Polígonos Operações
12
Para uma análise mais completa, inclusive com as combinações de hipóteses nos casos de ilhas e
buracos, vide [MaKn89].
Tabela 1.6 - Tipos de arestas para seleção de acordo com o tipo de operação e os
tipos de polígonos de entrada
Polígonos Operações
P Q P Q P Q P Q P Q
ilha buraco interior interior exterior exterior exterior interior interior exterior
ilha buraco exterior interior interior exterior interior interior exterior exterior
buraco ilha interior exterior exterior interior exterior exterior interior interior
buraco buraco exterior exterior interior interior interior exterior exterior interior
p1
p 0= p 9
P
p2
p5
p3 q3 p6
i2
i1 q2
i3
p4
p7
i4
q 0= q 4 Q p8
q1
PL f f f f d f f d f f
q0 q1 q2 q3 q4
QL f f d d f
p0 p1 p2 p3 i1 p4 i2 p5 p6 i3 p7 i4 p8 p9
PL f f f f nf d nf f f nf d nf f f
q0 q1 i4 q2 i3 i2 q3 i1 q4
QL f f nf d nf nf d nf f
p0 p1 p2 p3 i1 p4 i2 p5 p6 i3 p7 i4 p8 q0 q1 i4 q2 i3 i2 q3 i1
p1 p2 p3 i1 p4 i2 p5 p6 i3 p7 i4 p8 p9 q1 i4 q2 i3 i2 q3 i1 q4
RL e e e e i i e e e i i e e e e i i e i i e
Observe-se a classificação da aresta i3i2, que somente pôde ser feita analisando a posição
do seu ponto médio em relação ao polígono P.
p0 p1 p2 p3 i2 p5 p6 i4 p8 q0 q1 i3 i1
p1 p2 p3 i1 p5 p6 i3 p8 p9 q1 i4 i2 q4
P∪Q e e e e e e e e e e e e e
Para a interseção, ainda de acordo com a Tabela 1.6, selecionamos as arestas interiores:
i1 p4 i3 p7 i4 q2 i2 q3
p4 i2 p7 i4 q2 i3 q3 i1
P∩Q i i i i i i i i
Para compor o resultado da união selecionamos por exemplo a primeira aresta, p0p1, e a
partir daí buscamos continuações até voltar a p0. O resultado inicial é, portanto, o
polígono cujos vértices são p0, p1, p2, p3, i1, q0 (q4), q1, i4, p8, p0 (p9). No entanto, resta
ainda na lista outro polígono, com vértices i2, p5, p6, i3, i2. Os vértices do primeiro
polígono estão em sentido anti-horário, formando portanto uma ilha. O segundo
polígono está em sentido horário, e é portanto um buraco. Analogamente, na interseção
obtemos os polígonos i1, p4, i2, q3, i1 e i3, p7, i4, q2, i3. Neste caso, ambos os polígonos
obtidos estão em sentido anti-horário, e portanto são ambos ilhas.
4. Classificar cada aresta pode ser feito em tempo constante, se um dos pontos extremos
for um vértice original de P ou de Q. Se ambos os pontos extremos estão na fronteira,
é necessário executar o procedimento de ponto em polígono, ao custo de O(nP) para
fragmentos de aresta provenientes de P, ou O(nQ) no caso inverso. O custo total é,
portanto, de O(nP + nQ + ni . max(nP, nQ))
13
Neste ponto da análise, [MaKn89] considera um algoritmo força-bruta para encontrar as interseções,
consumindo tempo O(nP.nQ). Naturalmente, o algoritmo apresentado na seção 1.1.3 é mais eficiente,
baixando a complexidade total deste passo.
Compondo os custos de cada passo, chega-se à complexidade deste algoritmo no pior
caso, que é dominada pelo passo 3, de inserção dos pontos de interseção em uma lista.
Como, no pior caso, tem-se ni = nP . nQ, chega-se à complexidade O((nP . nQ)2). Nos
casos mais usuais em SIG, no entanto, o número de interseções em geral fica muito
abaixo de nP . nQ, e portanto espera-se um desempenho prático bastante superior ao de
pior caso. Para uma análise mais detalhada desta complexidade, bem como
considerações a respeito do consumo de espaço, vide [MaKn89].
Buffers podem ser construídos ao redor de qualquer tipo de objeto geográfico vetorial:
pontos, linhas ou polígonos. No caso de pontos, o buffer é simplesmente um círculo
cujo raio é a distância desejada. Em linhas e polígonos, o buffer é construído a partir da
união de buffers elementares, que são construídos ao redor de cada segmento e cada
vértice. Estes buffers elementares são simplesmente círculos, ao redor dos vértices, e
retângulos ao redor dos segmentos, com lados paralelos a estes (Figura 1.45).
(a) (b)
(a) (b)
Figura 1.49 - Buffers com buracos (a) e formados por polígonos isolados (b)
Em SIG, o fecho convexo pode ser útil para delimitar regiões definidas por um conjunto
de pontos, como por exemplo a área afetada por alguma doença, cujos casos são
individualmente lançados como pontos no mapa. Também é útil na construção de
limites para triangulações, do tipo encontrado em modelagem digital de terrenos (vide
seção 1.1.7.4).
O conceito de fecho convexo de um conjunto S de pontos é bastante simples. Uma
imagem freqüentemente invocada nos livros de geometria computacional é a de um
elástico (a fronteira do fecho) colocado ao redor de todos os pregos (pontos) dispostos
sobre uma tábua (o plano). Este conceito pode ser naturalmente estendido para três ou
mais dimensões, mas estaremos interessados particularmente em fechos convexos no
plano, por se tratar da variação mais útil em SIG.
O problema de encontrar o fecho convexo pode ser colocado de duas maneiras: (1)
construir a fronteira do polígono FC(S) (fecho convexo de S), ou (2) identificar os
pontos de S que são vértices de FC(S). Foi demonstrado que ambas as variações têm a
mesma complexidade, apesar de parecer, instintivamente, que a segunda alternativa
seria mais fácil, uma vez que não exige a construção das ligações entre os vértices (ou
seja, não exige a determinação da seqüência de vértices) para formar o polígono.
Foi demonstrado também que o problema clássico de ordenação pode ser transformado,
em tempo linear, no problema de encontrar o fecho convexo [PrSh88]. A conseqüência
disso é que um algoritmo ótimo para determinar o fecho convexo tem complexidade
computacional Ω(n log n) sobre o número de pontos em S.
1. para cada combinação de três pontos (pi, pj, pk) de S, construir um triângulo;
2. testar cada um dos outros n - 3 pontos contra este triângulo, usando o procedimento
pontoEmTriângulo (seção 1.1.2.1);
3. marcar como “interior” todo ponto que estiver dentro do triângulo;
Este algoritmo é claramente O(n4), uma vez que depende da combinação dos pontos três
a três, posteriormente testando cada um dos n - 3 pontos contra o triângulo.
1. para cada par ordenado (pi, pj) de pontos de S, definir uma reta;
3. se algum ponto não estiver à esquerda ou sobre a reta pipj (usar o procedimento
lado, seção 1.1.2.2), então o segmento pipj não é uma aresta do fecho convexo.
4. se todos os demais pontos estiverem à sua esquerda, o segmento pipj é uma aresta do
fecho convexo.
Observe-se que o teste tem que ser feito com cada par ordenado (pi, pj), para que se
possa sempre testar se os demais pontos estão especificamente à esquerda. Observe-se
também que existe a necessidade de um teste adicional, para eliminar a situação em que
três vértices alinhados definem duas arestas superpostas para o fecho convexo. Este
algoritmo consome tempo O(n3), um vez que é necessário formar os pares de pontos
(O(n2)) e depois testá-los contra os n - 2 pontos restantes. Este algoritmo foi
aperfeiçoado por Jarvis, que observou que, uma vez que se tenha uma aresta pipj do
contorno convexo, uma aresta subseqüente necessariamente parte de pj. Com isso, é
possível reduzir a complexidade para O(n2) [PrSh88]. Este algoritmo é conhecido na
literatura como Jarvis’ march.
1.1.6.2 Quickhull
Um aperfeiçoamento da estratégia de pontos interiores foi proposto independentemente
por diversos pesquisadores, e denominado posteriormente quickhull por Preparata e
Shamos [PrSh88], devido à sua semelhança com o quicksort.
C
D
C D
A Figura 1.52 mostra um exemplo. Inicialmente, o fecho é constituído dos pontos p0, p1
e p2, sendo p1 e p2 colocados na pilha nesta ordem. Em seguida, o ponto p3 é inserido no
fecho, pois p2p3 constitui uma curva à esquerda em relação a p1p2. Analisando o ponto
p4, o próximo na seqüência ao redor de p0, verifica-se que p3p4 forma uma curva à
direita. Assim, elimina-se p3 do alto da pilha, e testa-se p2p4, como agora tem-se uma
curva à esquerda, empilha-se p4 e o algoritmo prossegue de forma incremental. O
fechamento se dá quando é analisado o ponto p10, que é ligado ao ponto inicial p1,
fechando a cadeia. O exemplo contém o caso mais simples, em que o primeiro ponto
analisado pertence ao fecho convexo. Se ocorresse o contrário, código adicional teria
que ser adicionado para retirar o ponto p1, e possivelmente outros, que estão no fundo da
pilha ao final do processamento. Outro problema ocorre quando o p2 não pertence ao
fecho convexo. O teste em p3 detectaria uma curva à direita a partir de p1p2, e portanto,
pela lógica apresentada, p2 teria que ser eliminado da pilha. Ocorre que, nesta situação, a
pilha ficaria com apenas um ponto, tornando impossível a análise das curvas à direita e à
esquerda.
14
Não é necessário que o ponto p0 pertença a S. Pode-se tomar um ponto interior qualquer, por exemplo o
1
baricentro do conjunto de pontos, ou seja ∑ pi [FiCa91]. Em seu artigo inicial, Graham inclui um
n
método detalhado, de complexidade linear, para escolher tal ponto, analisando trios de pontos até
encontrar um não-colinear, e então adotando o baricentro do triângulo como origem [ORou94].
15
Vide função lado, seção 1.1.2.2.
p4 p2
p3
p5
p6
p1
p0
p9
p7
p 10
p8
p7 p4
p5
p8
p9 p6 p2
p 10 p3
p1
p0
p6 p3
p4
p7 p2
p5
p9 p1
p8
p0
push(S, (n - 1));
push(S, 0);
i = 1;
retorne(S);
fim.
{
Seja P = p1, p2 ,
}
, pn um conjunto de pontos no plano, usualmente denominados
locais (ou sites). O plano pode ser particionado de modo que cada ponto esteja
associado ao elemento de P mais próximo de si. O conjunto dos pontos associados ao
local pi constituem o polígono de Voronoi16 de pi, denotada V(pi). Este polígono é,
portanto, o lugar geométrico dos pontos do plano mais próximos de pi do que de
qualquer outro elemento de P, ou seja
V ( pi ) = x dist ( pi − x ) ≤ dist ( p j − x ), ∀j ≠ i
î
Existe a possibilidade de se ter pontos que são igualmente próximos a dois ou mais
locais. O conjunto destes pontos constitui o diagrama de Voronoi para o conjunto de
locais, denotado Vor(P).
p2
p1
16
Estes polígonos recebem diversos nomes alternativos na literatura: regiões de Dirichlet, polígonos de
Thiessen, células de Wigner-Seitz, ou regiões proximais [PrSh88]
p2
M 12
M 23
p1
p3
M 13
V ( pi ) =
Sij
i≠ j
Como semiplanos são, por definição, convexos (não existe nenhum segmento definido
entre dois pontos do semiplano e que contém pontos que não pertençam a ele). A
interseção de conjuntos convexos é também um conjunto convexo [PrSh88]. Portanto,
pode-se concluir que qualquer polígono de Voronoi é convexo também.
(a) (b)
Traçando G com linhas retas entre os vértices (locais), assumindo que não existam
quatro vértices co-circulares, é produzida uma triangulação de P, que é denominada
triangulação de Delaunay e denotada D(P). A Figura 1.59 mostra a triangulação de
Delaunay sobre o diagrama de Voronoi da Figura 1.57.
1.1.7.3 Implementação
Devido à extensão do código fonte, este capítulo não irá detalhar a implementação de
algoritmos para obter o diagrama de Voronoi e a triangulação de Delaunay. As
principais idéias e alternativas apresentadas na literatura de geometria computacional,
no entanto, serão delineadas, deixando a cargo do leitor um aprofundamento maior17.
Uma alternativa a esta forma de implementação foi desenvolvida por Fortune ([Fort87]
apud [ORou94]), usando a técnica de varredura do plano. Foi necessário conceber uma
variação da varredura tradicional, pois na construção do diagrama a linha de varredura
vai certamente interceptar o polígono de Voronoi bem antes de encontrar o local
correspondente. Assim, Fortune propôs a construção de cones invertidos, com ápice
colocado sobre cada local e com lados cuja inclinação é de 45 graus. A projeção da
interseção entre os cones sobre o plano XY é exatamente o diagrama de Voronoi. Para
recuperar o diagrama, o algoritmo faz a varredura do conjunto de cones utilizando um
plano inclinado também a 45 graus em relação ao plano XY. A interseção do plano com
cada cone configura uma parábola, e o algoritmo usa uma composição destas parábolas
(denominada “frente parabólica”) no lugar da linha de varredura tradicional. A frente
parabólica consegue, portanto, detectar arestas do diagrama antes de passar pelos locais
propriamente ditos. O algoritmo final tem também complexidade O(n log n).
17
Existem diversos programas para a construção do diagrama de Voronoi e da triangulação de Delaunay
disponíveis na Internet. O URL http://www.geog.umn.edu/software/cglist contém links
para diversas páginas que oferecem freeware na área de geometria computacional. O programa original de
Fortune, por exemplo, pode ser encontrado em http://netlib.bell-
labs.com/netlib/voronoi/index/html, incluindo o código fonte. O mesmo programa é capaz
de produzir o diagrama de Voronoi, a triangulação de Delaunay e ainda o fecho convexo de um conjunto
de pontos.
proposta foi posteriormente refinada por Guibas e Stolfi [GuSt85], utilizando uma nova
estrutura topológica denominada quad-edge (vide seção 1.2.3) Um aperfeiçoamento
deste algoritmo foi proposto posteriormente, obtendo significativos ganhos de
desempenho e também uma maior facilidade de implementação [Leac92].
1.1.7.4 Aplicações
O diagrama de Voronoi tem muitas aplicações em SIG. Como estrutura de dados básica
para resolver problemas de proximidade, pode ser empregada sempre que o número de
consultas justificar o custo de sua criação e manutenção. Apesar das vantagens que se
tem em usar esta estrutura na solução de problemas como os relacionados a seguir, a
maioria das aplicações baseadas em SIG comerciais prefere adotar estratégias mais
genéricas, usando os recursos básicos de localização individual de objetos disponíveis
no SIG subjacente. No entanto, a grande utilidade do diagrama de Voronoi no contexto
de SIG tem conduzido a propostas no sentido de incrementar seu uso, incorporando
estratégias de manutenção dinâmica e a possibilidade de trabalhar com objetos móveis
em tempo real [Gold92b][OBS92].
Ponto mais próximo. Dado um conjunto P de locais, deseja-se saber qual é o mais
próximo de um ponto q dado. Trata-se de uma consulta tradicional em
geoprocessamento, e tem diversas aplicações em análise espacial. Quando se dispõe do
diagrama de Voronoi, a solução do problema consiste simplesmente em determinar o
local correspondente ao polígono de Voronoi que contém q. Naturalmente, existem
maneiras de resolver este problema sem utilizar o diagrama de Voronoi (por exemplo,
analisar seqüencialmente a distância entre q e todos os pontos pi ∈ P ), mas quando se
pretende realizar um número razoável de consultas, sobre um conjunto de pontos
relativamente estável, construir antecipadamente o diagrama de Voronoi pode ser muito
vantajoso. Um exemplo prático: informar aos usuários do sistema de transporte coletivo
qual é o ponto de parada de ônibus mais próximo de sua residência ou local de trabalho.
Outro exemplo: localizar o hidrante mais próximo de um determinado prédio.
Foi demonstrado que, contando com alguma estrutura de indexação espacial, problemas
como este (denominados genericamente de point location problems: determinar em qual
partição do plano está um determinado ponto) podem ser resolvidos em tempo O(log n).
Vizinhos mais próximos. Este problema consiste em, dado um conjunto P de locais,
encontrar o local pj mais próximo de cada local pi (o vizinho mais próximo de pi)
pertencente a P. Um exemplo prático está na geração de indicações de “quiosque mais
próximo” para caixas automáticos, de modo a informar os clientes sobre alternativas em
caso de falha de algum deles. Outro exemplo é, dado um conjunto de aeroportos
satisfazendo a certas condições (comprimento da pista, instrumentação de pouso,
equipamentos de emergência), determinar qual é o aeroporto mais indicado para
redirecionamento dos pousos em caso de fechamento por mau tempo de qualquer um
dos aeroportos.
Maior círculo vazio. Consiste em determinar o maior círculo cujo centro pertence ao
fecho convexo dos locais de P e que não contém nenhum local. Foi demonstrado que,
caso o centro do círculo seja interior ao fecho convexo, então deve coincidir com um
vértice de Voronoi. O centro do maior círculo vazio pode também estar sobre alguma
aresta do fecho convexo, e neste caso estará situado no ponto médio da aresta,
eqüidistante a dois vértices [ORou94]. Um algoritmo para resolver este problema a
partir do diagrama de Voronoi consiste, portanto, em verificar o raio do círculo definido
sobre cada vértice, que corresponde à distância do vértice a um dos três locais
eqüidistantes a ele. Também deve ser verificado o raio de cada círculo definido com
centro no ponto médio de cada aresta do fecho convexo. Ao final, o resultado é o círculo
de maior raio dentre os verificados (Figura 1.61).
O mesmo processo descrito para MDT pode ser usado para tratar outras variáveis de
distribuição contínua e que são medidas em pontos discretos, tais como temperatura,
índice pluviométrico ou ruído ambiental.
1.2 Topologia
1.2.5 Aplicações
Pesquisas de proximidade em diagramas de Voronoi codificados segundo uma winged-
edge!
[Davi97] Davis Jr., C. A. Uso de Vetores em GIS. Fator GIS 4(21): 22-23, 1997.
[DGHS88] Dobkin, D., Guibas, L., Hershberger, J., and Snoeyink, J. An Efficient
Algorithm for Finding the CSG Representation of a Simple Polygon.
Computer Graphics 22(4):31-40, 1988.
[DuHa73] Duda, R. and Hart, P. Pattern Classification and Scene Analysis. John
Wiley & Sons, New York, 1973.
[Lang69] Lang, T. Rules for Robot Draughtsmen. Geographical Magazine 22: 50-
51, 1969.
[Mull87] Muller, J. C. Optimum Point Density and Compaction Rates for the
Representation of Geographic Lines. In Proceedings of AutoCarto 8,
221-230, 1987.
[OBS92] Okabe, A., Boots, B., Sugihara, K. Spatial Tesselations: Concepts and
Applications of Voronoi Diagrams, John Wiley, 1992.
1
Com a colaboração de Clodoveu Davis e Frederico Fonseca.
2
Segundo Thomé (1998) entende-se por modelos conceituais a semântica do funcionamento de
cada SIG, e a maneira como os dados devem estar organizados.
0 )
! 5 0 ( 0
& 3 0
4
& !
2 * ( $%' 3 *
. 1 0 #
1
( !
/ ( & 3
! / 3 0 8
1 0
# !/ 0 0
!
Figura 1: Geometria
* & $%' 3 : ;
: ; : & ; 3
0 (0 ( # 3
& & !<
3 . .
$%' 1 0 .
* ! " 1 & 1 0
# & # . 0
) 0 !
< 1 . *
0 ( !
9 * 4
( ' =! /
( 3 0 & ( 1
* & & 1 0 &
( 1
0 ! % 3 1
0 0 0 & 0 0
& 1 0 & !
< . &
! / + 1 0
# & ! 2 3
1 0 # & !",, 0 > / ?% 1
3 1 0 # & !@ %7 0 >
@ % ! / 0
# . !
Figura 2 : Arquivos diferentes - E00 x MIF
" 3 0 0
. 1 0 0 0 *
0 & &
0 ( !
2 0 4 * 6 & &
( (
!A 4
. 1
( * !/
& 1
0 ( 7 " ! +,,,
/ $%'
& ( 8 ) <4 +,,,
0 &
(
(0 & 3 0 ! 2
$%' !
- # & @ '" B %
< C/$$" 5 " 7"%D E "$
8 9"@ /9%< 2 2 AF"92 $ $-G% ' ! "
1 @ '" & # &
( (
! 8 < C/$$" 5 " 7"%D H2 3 *
9 3 !
2 1 & 0 0 3 1
( !2 1
* ( !"
1
* 0
!
/ * & 1
! / 1 0 (
0 ! - 1 4
) 0 0
& 0 !
<4 *1 $%' 1 0
4 #
! 7 0 * ' 9@ $
9 3 7@ " >>>! !
) 0 & !
- 1 2 0
$%' 3 0 !
/ 1 & $%' 0
0 1
0 8 ( 4 !
/ 0 &
& $5 9$
. 2 ' %$
7' 5 < ! "
) 1 0
1 . & !
A 0
* < -G@ B < - 1 G @
>>>! ! 0! A< 5 /@ B $ 5 A < 5 5
$ / * >>>! ! 0! ' @ - %
I 9 ' J & " @
' >>>! ! ! 0! 1 * %
@ ' !
! " # $% &' (#
/ ( 4 ( 3
0 & ( 1 * & 1 0
& ( ! 7 3
. * $%' 1 0 ! -
0 & $%' 0 8
• 2 # & /$< %% (
5K7 / @ %5 ?@ %7 @ % ",, / ?% $-G $ L
• 5 $M -
/ N > !
2 4 1
* # &
0 &
( !2
!
2 ( 0 0 !/
# & 1 $%' 0 B
& 0
B ! <
0 & & 3 (
& !"# 0( &
& ( 0 0 $%' !
"# 8
! " #
# $% $&'
9 87
# & 1
0* ( !"
# & ( 1 0 /$< %%
( ( & !2
( 8 &
8 &
& !' 1 0 0
( ( 0
!< &
! - 0 80
! /
0 # &
0 & .
B .B O5 !
! ) % *) + , - % .
2 > @ % * 4
@ % % 7 P @ %7 ! < 1 0 8
( *
4 &
!2 1 0 ( # & !
# & ! @ % +,, ! / 3
0 (
1 0 4 !"
& 1 0
# & G"' %2 Q
& 0 # R
& ! & ( & # 1
!2 &
0 O5 # R *! / 1 &
3 9"K 9 1 0 # &
#R !
! / " $ 0
2 > $ # & 1 0
/$< %%! < 1 0 * ! / &
1S 0 0 0
! 2 3
O5 O5 $/@ -C"$
C% "O5 -2 % 9O5 !
! & 11 $/ 2 + &' %
2 3 $ *
"$G% > > > ! ! / N >! 2 & *
1 0 ( # & !$M - 1 0
# & !$M K # & !5 A7 ! -
0 1 0 !$M -
& 3 "$G% $ 1
1 0 0
& !2
0( 3 ! & !
!7 / (#
5 & @ $ *
@ '" % ' A R < /5
1 * 1 0 5' 1 & 3 #
!2 ' @ % &
# & & 3 *
? 0 $M - ",, 5 K 7 @ %7!
" ( & &
& * 1
1
& # 3 B
5K7 7 ! "# 0
1 0 & $5 9$ $
5 9 $ !
!8 9
0 & *
& # !T &
& 1 1
1 1 $%' ! "
Q 0
<4 ! =!
2 $5 9$ 0 + - & 7 -
% & 7%-$ B 7 % - $
* & & %
- 9 %$9 B % $
9 R 0 & %
/ - / $%B / $ % !
2 & ( -
. 1
8 1
0 *
)
& 1 &
. !/ + 3
3 ( &
!/- O -
& %$2 ?/ $% + !
- 0 & $5 9$
0 & & 3 * - +
& ) - !2
) ) &
. 3 - !" &
1 0 - O!
@ & 8?? > ! ! ! 0? ?
B $5 9$U U
<U U > 0 * &
0 & !
/ & ' 0 "I / * $5 9$
. & 0 !2
$5 9$ Q 4 (
6 / ?% BV! 2 & $5 9$
& ) &
& 0
( ! " $5 9$ B
4 $M - @ %7 0
!
5
" /-%
)
& 1 ( 0 0
!2 /-%
$%' &
3 *
( !2 * 1 0 0 $%'
6 & (
*
0 !
2 < . 2 ' %$ 3 * & 0 0
$%' &
2'< =
3 *
( K @ C <2 @ F0
$W C 2 ' < =!
- * . < 93 *
* 0
8??> > > ! ! ? ? ! !
1 & Q &
!
< <4 = )
0 ) )
1 &
) 0 ! 9 3 0
)
0 &
!
/ 2 ' %$ 0
* 03
! / & 3 ) 0 0
> 03
& 1
# * 0
. 7 !
1 & # &
2 ' %$ 0 0 0 3
) 4 ! <4 (
$%' % P @ ' " "$G% B / ?% % -" B
$-G% ' 0 & 2 ' %$! /
& 8
• / 4 Q 1
2 ' %$ & ) @ '" &
$-G% ' 2 ' %$
0 & 4 <4 9 3
! !
• 2 $%'
0* &
#
< 2 N "G/' "$ / ?% 7"/9I G" X %9M ' "2 @ "9G
2 ' %$!
/ 4 & (
2 ' %$ & 3 3 ( 0
4 1 <4 !
5 ) /
2 2 ' %$ 3
! I 3 2 ' %$
& L3 & ( 3
0 69 !
5 ) :
$ 4
2 ' %$ & K@ C K @ Y C
( !-
'@ C ' R@ Y C !
'@ C ' R@ Y C
* & (
& ( 2 ' < +,, !
2 ) 0 3 ) 1 (
. 0 !- '@ C 3
"1 K@ C K@ C $ ! 2 "1 K@ C
1 0 !
/ ( 0 & +! ! "1 1
( ! 2
"1 & 2 ' %$ 2 ' < +,,
# 8
• 7 !# P
& 2 ' %$!
• ' R!# P &
2 ' %$!
• K Y !# P &
K @ C!
5 "1 ( . "1
& ! @ ( #
!$ 2 ' < +,, & 8
• I "1 & ( 0
0 0 "1 & '@ C
+! ! 2 ' < +,, L I 31 0 0 "1
& 0 1 &
' @ C8 8/ 7 9R
8/ 7 < 9R
8/ ' R9R 8' R< 9R
!
• I "1 & & &
. ' @ CL
• 5 0
L
• 2 "1 & 0 0 1 1 1
1 "1 L
• 2 "1 0 0 : ;1 &
0 : 8??> > > ! ! ?
5 0 0 "1 .
& '@ C ( * ! - #
1 0 "1 # !#
# !# 8
2 =3 "1
& <rio> 1
0 1 0 # !# ! 9 3 3
1 substitutionGroup
gml:_Feature 1 & ! 2 : #;
ex:hidrografia 1 3 ex
1 0 8
1 0 : ; ex [
# !I 1 0 3
# # 8
Figura 9: Fragmento de um arquivo de dados em XML.
/ <gml:description> + <gml:name> O
& "1 &
/ 7 9R )( 1 3 <rio>
!- 3 (
1 0 "1 3 . & 1
<_Feature> ( 1 <rio> 3 <_Feature>!
5 / (# $ 2 ) :
/ (0 0 2 ' %$ !
- # /-% 0
* &
! 2 & 2 ' %$ 3
. )
" 7 * &
&
5 0 ! 2 * &
1 ) 3 & 0 ! 2
$W C
2 ' %$ 3 1 (0 ! < " + <4
Z & 0 $W C 0
( ! 2 $W C & 0 #
& 6 *
1 ) &
!
/ ' @ C +! ! ( ! -
' @ C +! ! . & 3
1 & "1
& !
2 "1 '@ C * & & 1 4
! " 0 & "1
&
& B 1 "1
& Q > ' @ C! % # 0
& "1 !
'@ C 3 @ -
@ - R
0 $ G " !@
* &
) 0 & & 0 !
I 0 K@ C 3 # : ;
1 # B
! @ & 85 (
'@ C
<rio> <curso_de_agua>! "
( "1 3 0 .
& ( 1 <rio> <curso_de_agua> &
<_Feature> "1 7 !# '@ C & (B
1 ! 5 3 0 !
@ 1 <rio> 3 <curso_de_agua> 0 B0 \2
4 & 3 0 0
! - * B
1 0 1 1 !
@ &
* * 3
2 ' %$!
/ '@ C $%'
& 4 !
< # & C G 1
& # ( 1 )
<LinearRing>
<coordinates>10.0,10.0</coordinates></LinearRing> 3
0( !
2 1 & 0 '@ C 3
!/ /-% F0 '@ C
' @ C[F ( 0 0 %
8?? ! ? ) ? [)?! / 0 & 3 *
"1 '@ C 1 6
& Z & & '@ C & 0 ! 2
> 7@ " '@ C &
& "1 / & !
/0 & '@ C : ;K@ C 1
"1 0 "1 '@ C
& 0 # & Z!+ & &
' @ C! & 0 "1 / ( !
/ 1 0 2 ' %$ 0 &
1 0 ! - 0
4 3
& 4 6
' AG!
( K@ C & 4 3
1 (0 ! @ & K@ C 0
4 1 0 >
* 0 1 !2 3 0
& 4 & K@ C
# 1 0
. ! -
5 /@ CU 2 %C 5 /G -/ / @ Y C U
2 R % C R 0
0 4 !
/ 0( "1 1 0 "1
& 3 1 ) # &
( 1
"1 !@ 1 4 &
"1 & 0 0 1
( . 1 0 !
- 3 ( 0 & "1 & !
/3 # "1 &
0 & ! 2 "1 0
0*
) #
!
7 ; )
@ & : ; 0 Q &
. * & 7' 5 < +,, ! 2
) 0 3 1 #
1 (B (B ! /
0 &
& & !
- # &
& ( 0(
&
# 8/ & ( # / & (
& 1 1
!
M( " I < ( 7' 5 < +,,
) 0
( !5 0
75 ' < !
7 % "
2 7' 5 < 3
1 0 & &
"I /! 7' 5 < +,, & 1
( 8 )
0 * L
0 & * & L 0
&
# !
2 & )
& (
. 8 & 1 * &
& &
$5 % V!
2 & ( 81 ( 0
! @ & 0
"I / " 0 0 & 0
& ! 2 7' 5 < 3
&
1 ( )
1 ! / & & 3 *
( 0 Y %
& * ! '
* &
( & 1 0
* !
< 3 & & 7' 5 < &
1 & ( *
!< # & 1
0 & 0
4 & !
2 7' 5 <
3 # 0 1 0 &
! < & 6 # & B 1
1 & 0 ! 4
& 7' 5 < & :
& ; & ) !/ &
7' 5 < 0 (0 : ) ;
1 # 0 1 & 1 (0
* ( !
" 0 0 & 7' 5 <
& * ! " 0* # 1
1 & ( 1 . 2 ' %$
. !
8 -
7 +,,, 1 4 &
& ( !
5 0 ( # &
. * 3 # 0
! 00
0 )
(
1 0 4 !
& 2
& $%' 2 7
+,,, !
/ 2 3 . 1 0
/ .
$ ! - %
/ & 1 0 ( 0
7 +,,, 0
)
0 0 ( !
2 0 0 &
0 1 $ % &
' ! 7 +,,, $%'
0
0
! / 1 $%'
!
0 & ,
1 & 0
!/ & * >
3 & ) )
0 0 1
(1 ( 7 +,,, !
5 0 0 * *
> $%' 1 3
! 2 0
B $%' (0
# 4 1 0&
& # !
$ 7 +,,, 4
0 03 0
&
( !
/ 1 & . 1 0 (
3 1 0
!- #
& *
: ; : ( ;! 2 Q
! ! : ; # 0
! ! : ; : ( ; : ;! 3
( 1 4
1 2
& ( 1
( !
5 %
/ 0 & ( 0B 1
0 & 0
M !- & 0
0 & 0
7 ' %$ +,, !
( B 7@ " B 7 @
" >>>! ! 1 3 0 & 0(
(
( 1 0 &
. 3
0 ) !
2 > 7@ " 1 ) . 1
& 0
6 +5 O5 ! / 0 .
1 ( > 8
• @. 8 # L
• @. 7( 8 Q L
• @. 9 & 8 8 0
L
• @. 8 0
!
5 > & 0 &
3
4 !/ 0 & ( #
1
( !'
0 &
0 & 0* (
& & ! "
!
10
10.1 INTRODUÇÃO
10-1
O presente capítulo apresenta uma interface de programação genérica, ou API
(Application Programming Interface), para operações espaciais em banco de dados
geográficos para a biblioteca TerraLib. Uma API é um conjunto de funções que
facilitam a troca de mensagens ou dados entre dois ou mais sistemas distintos. A API
desenvolvida deve ser composta por funções que permitam realizar operações espaciais
sobre dados geográficos armazenados em um SGBD. Essas operações podem ser
realizadas sobre dados vetoriais (Rigaux et al, 2002), como consultas de relações
topológicas e métricas, geração de uma nova geometria a partir de uma distância em
torno de uma geometria específica (buffer) e operações de conjunto (interseção, união e
diferença), ou sobre dados matriciais (Tomlin, 1990), como operações zonais e recorte a
partir de uma máscara.
Para cumprir o objetivo do trabalho, a API foi implementada na TerraLib nas classes de
interface com os SGBDs em dois níveis:
10-2
Como as extensões espaciais existentes não tratam dados geográficos de representação
matricial, as operações sobre esses dados foram implementadas apenas no nível
genérico, sendo utilizadas por todos os SGBDs, inclusive pelo Oracle Spatial.
Para testar a API, foram desenvolvidas duas interfaces gráficas para operações espaciais
no TerraView (Ferreira et al, 2002), um aplicativo geográfico construído sobre a
TerraLib. Essas interfaces têm como objetivo utilizar as operações implementadas na
API e mostrar, graficamente, os resultados na área de desenho do TerraView,
facilitando os testes.
Oracle Spatial
O Oracle Spatial (Murray, 2001) é uma extensão espacial desenvolvida sobre o modelo
objeto-relacional do SGDB Oracle. Este modelo permite definir novos tipos de dados,
através da linguagem de definição de dados SQL DDL, e implementar operações sobre
esses novos tipos através da linguagem PL/SQL, que é uma extensão procedural da SQL
(Lassen et al, 1998). Esta extensão é baseada nas especificações do OpenGIS e contém
um conjunto de funcionalidades e procedimentos que permitem armazenar, acessar e
consultar dados espaciais de representação vetorial em um banco de dados Oracle.
10-3
(VARCHAR2, NUMBER, etc) e a geometria, como uma coluna do tipo
SDO_GEOMETRY. Nesta tabela espacial cada instância da geometria é armazenada
em uma linha e o conjunto de todas as geometrias de uma mesma tabela formam um
plano. Abaixo é mostrado um exemplo da criação de uma tabela espacial em SQL:
10-4
• SDO_INTERPRETATION: indica como o elemento deve ser
interpretado juntamente com o SDO_ETYPE.
O Oracle Spatial fornece dois tipos de indexação espacial, R-tree e Quadtree, podendo
ser utilizados simultaneamente. Indexação espacial, como qualquer outro tipo de
indexação, fornece mecanismos para limitar o conjunto de busca, aumentando assim a
performance das consultas e da recuperação de dados geográficos.
10-5
Operações espaciais no Oracle Spatial
Dentre as funções podem ser citadas: SDO_BUFFER, gera uma nova geometria a partir
de uma distância em torno de uma geometria específica (buffer); SDO_AREA e
SDO_LENGTH, calculam a área e o perímetro; SDO_DISTANCE, calcula a distância
entre dois objetos; e, SDO_INTERSECTION, SDO_UNION e SDO_DIFFERENCE,
geram uma nova geometria resultante da interseção, união e diferença, respectivamente,
10-6
entre outras duas. Como exemplo do uso desses operadores e funções juntamente com a
linguagem SQL, considere a consulta “listar todas as áreas sensíveis dentro de um raio
de 8 km de uma área de lixo tóxico”. Supondo a existência de duas tabelas espaciais,
uma para armazenar as zonas sensíveis que são representadas por polígonos e a outra
para armazenar as áreas de risco ou de lixo tóxico, representadas por pontos. As tabelas
são mostradas na Tabela 10.1.
10-7
10.2 UMA INTERFACE GENÉRICA PARA OPERAÇÕES ESPACIAIS EM
BANCOS DE DADOS GEOGRÁFICOS
Drivers: para cada SGBD existe um driver, ou seja, uma classe específica que
implementa todas as funcionalidades da classe base conforme as particularidades
e características de cada SGBD. Dentre essas funcionalidades estão inserção,
recuperação e remoção de dados geográficos;
10-8
para linhas e TePolygon para polígonos, e classes para representar dados matriciais,
como a classe TeRaster.
Os drivers possuem uma interface comum que é definida por duas classes bases:
TeDatabase e TeDatabasePortal. Dentre as funcionalidades fornecidas por essa
interface podem ser citadas: estabelecimento de conexão com o servidor de banco de
dados; criação do modelo de dados da TerraLib; execução de comandos em SQL DDL1
e DML2; execução de consultas em SQL que retornam um conjunto de resultados e
manipulação desses resultados; definição de índices espaciais; e, armazenamento e
manipulação de dados vetoriais e matriciais (Ferreira et al, 2002).
Cada driver fornece uma interface entre o Kernel da TerraLib e um SGBD específico,
permitindo o armazenamento e manipulação dos dados geográficos diretamente no
SGBD, sem a necessidade de utilização de estruturas proprietárias. Esses drivers
exploram ao máximo os recursos oferecidos por cada SGBD, principalmente os que
apresentam extensões espaciais que fornecem mecanismos de indexação espacial, tipos
de dados geográficos e operadores espaciais. Atualmente, existem quatro drivers na
1
SQL DDL: Linguagem de definição de dados que fornece comandos para definição e modificação de
esquemas de tabelas, remoção de tabelas e criação de índices e de restrições de integridade.
2
SQL DML: Linguagem de manipulação de dados que fornece comandos para busca de informações no
banco de dados e inserção, remoção e modificação de dados do banco de dados.
10-9
TerraLib: TeOracleSpatial (Oracle Spatial), TePostgreSQL (PostgreSQL),
TeMySQL (MySQL) e TeADO (acessar SGBDs via tecnologia ADO). A Figura mostra
a estruturação das classes que representam a interface comum e os drivers.
A TerraLib possui um modelo de dados específico que é criado por cada driver no
respectivo SGBD. Esse modelo é composto por esquemas de tabelas espaciais para
armazenar e manipular os dados geográficos vetoriais e matriciais (TerraLib, 2003).
Nos SGBDs que não possuem extensão espacial para tratar dados geográficos, esses são
armazenados em campos longos binários, chamados de BLOB. Já nos SGBDs que
possuem extensão espacial, como o Oracle Spatial, os dados geográficos vetoriais são
armazenados em estruturas de dados específicas fornecidas pela extensão. Mas, em
todos os SGBDs, os dados matriciais são armazenados em campos longos binários, pois
nenhuma extensão espacial oferece recursos para tratar esse tipo de dado.
10-10
Figura 10.4 - Tabela de polígonos em Figura 10.5 - Tabela de polígonos no
SGBDs relacionais Oracle Spatial
10-11
As operações disponíveis na API, como mostradas acima, são: SpatialRelation,
consulta relações topológicas; calculateArea e calculateLength, calculam a
área e comprimento ou perímetro; calculateDistance, calcula a distância entre
duas geometrias; NearestNeighbors, retorna os n vizinhos mais próximos de
uma geometria específica; ConvexHull, gera uma nova geometria convexa a partir
de uma outra geometria; Buffer, gera uma nova geometria a partir de uma distância
em torno de uma geometria específica; Intersection, Union, Difference e
Xor, geram novas geometrias através de operações de conjunto, interseção, união,
diferença e diferença simétrica, entre duas geometrias; Zonal, calcula as estatísticas
de uma região ou zona do dado raster delimitada por um polígono e Mask, recorta um
dado raster a partir de uma máscara que é definida por um polígono.
Como trabalhos relacionados com a API desenvolvida pode ser citado o ArcSDE, um
aplicativo que fornece uma interface entre os ArcGIS (ArcInfo, ArcEditor, ArcView
GIS e ArcIMS) e diferentes SGBDs, como Oracle, Informix, IBM DB2 e Microsoft
SQL Server (ArcSDE, 2003). A seguir, é apresentada uma comparação entre a TerraLib
e o ArcSDE, incluindo as APIs para operações espaciais.
TerraLib ArcSDE
10-12
Cria um modelo de dados Cria um modelo de dados lógico
Modelo de Dados lógico próprio para representar próprio para representar dados
dados geográficos em SGBDs geográficos em SGBDs
O ArcSDE possui dois tipos de APIs para operações espaciais: (1) API que fornece
funções para executar operações espaciais em memória; e (2) SQL API que apenas
designa a execução de uma operação em SQL, que utiliza operadores e funções
espaciais, para o Informix Spatial Datablade ou para o IBM DB2 Spatial Extender.
(1) Nível genérico: as operações foram implementadas como métodos da classe base
TeDatabase, sendo utilizadas por todos os SGBDs que não possuem extensão
espacial, como Access, MySQL e PostgreSQL.
10-13
(2) Nível específico: as operações foram reimplementadas no driver do SGBD
Oracle Spatial, TeOracleSpatial, utilizando os recursos de sua extensão
espacial.
10-14
SELECT * TerraLib
FROM geomTable
WHERE sigla= “MG”
blob
TePolygon
area (2)
TerraLib
SELECT
SDO_GEOM.SDO_AREA(geomTabl
e, spatial_data, ...)
FROM geomTable
WHERE sigla= “MG”
10-15
TABELA 10.4 – OPERAÇÕES ESPACIAIS DA API SOBRE DADOS VETORIAIS
calculateArea Buffer
da operação
NearestNeighbors Union
Difference
XOr
10-16
Estados
SGBD
Estados_polígonos
Rios_linhas
Rios
10-17
As funções binárias entre objetos de um mesmo PI, ou seja, de uma mesma tabela
espacial, recebem os mesmos parâmetros de entrada de uma operação unária descritos
acima. Como essas funções são realizadas entre pares de objetos, o identificador de cada
objeto é passado como um parâmetro distinto (objId1 e objId2). Para ilustrar, são
mostradas, a seguir, as assinaturas das funções calculateDistance e
geomIntersection:
As funções binárias entre objetos de dois layers distintos, ou seja, de duas tabelas
espaciais, recebem como parâmetros de entrada: nomes das duas tabelas espaciais
(actGeomTable e visGeomTable); nomes das colunas espaciais (actGeomColl e
visGeomColl); tipo da representação geométrica armazenada em cada tabela (actRep
e visRep); os identificadores dos objetos geográficos sobre os quais a operação será
aplicada (objId1 e objId2); e, a variável ou a estrutura de dados que conterá o
10-18
resultado. Como exemplo, as assinaturas das funções calculateDistance e
geomIntersection entre geometrias de diferentes tabelas são mostradas a seguir:
Relações topológicas
10-19
TeGeometry* geom, TeGeomRep geomRep, TeDatabasePortal *portal,
int relate, const double& tol);
(2) Para cada geometria recuperada verificar se existe uma determinada relação
topológica com a geometria específica, utilizando as funções topológicas da
TerraLib.
Como exemplo, considera-se a consulta “selecione todos os estados do Brasil que fazem
fronteira com o estado de Minas Gerais”. A primeira etapa recupera do SGBD somente
os estados cujo o mínimo retângulo envolvente tem alguma interseção com o mínimo
retângulo envolvente do estado de Minas Gerais, como ilustrado na Figura 10.9. E a
10-20
segunda etapa utiliza a função topológica TeTouches entre os estados recuperados na
etapa anterior e o estado de Minas Gerais, retornando o resultado final da consulta.
Como exemplo, a SQL gerada para solucionar a consulta acima, “selecione todos os
estados do Brasil que fazem fronteira com o estado de Minas Gerais” é
SELECT geomTable1.*
FROM Estados_polígonos geomTable1,
Estados_polígonos geomTable2
WHERE geomTable2.object_id = 'MG'
AND SDO_RELATE(geomTable1.spatial_data,
geomTable2.spatial_data,
'mask = TOUCH querytype = WINDOW') = 'TRUE'
10-21
consulta (geomTable1.spatial_data e geomTable2.spatial_data), a relação
topológica (mask = TOUCH) e o tipo da consulta (querytype), que pode ser WINDOW
ou JOIN. O tipo de consulta WINDOW é usado quando se quer comparar uma simples
geometria com todas as geometrias de uma coluna espacial. E o tipo JOIN é usado
quando se quer comparar todas as geometrias de uma coluna espacial com todas as
geometrias de outra coluna.
Polígono simples cujos vértices são conectados por linhas retas: SDO_ETYPE
igual a “1003” ou “2003” e SDO_INTERPRETATON igual a “1”;
Polígono composto formado por alguns vértices conectados por linhas retas e
outros por arcos circulares: SDO_ETYPE igual a “1005” ou “2005” e
SDO_INTERPRETATON maior que “1”.
Como exemplo, uma consulta em SQL para retornar uma nova geometria a partir de
uma distância de 1.0 unidade ao redor de um objeto geográfico, o qual possui um
identificador igual a “17” e está armazenado em uma tabela espacial chamada
“teste_Linhas” em sua coluna espacial “spatial_data”, pode ser escrita como:
10-22
AND m.column_name = 'spatial_data'
AND object_id = '17';
Um arco circular no Oracle Spatial é representado apenas por três pontos e o tipo
TePolygon da TerraLib é formado por pontos conectados por segmentos de linha reta.
Portanto, para representar um polígono composto no TePolygon, para cada arco desse
polígono é necessário gerar pontos intermediários que, ao serem ligados por segmentos
de linha reta, se aproximem de um arco. Para isso, foi necessário desenvolver uma
função que gera um arco formado por n pontos intermediários a partir de três pontos de
10-23
um arco retornados pelo Oracle Spatial. Essa função, chamada TeGenerateArc, foi
implementada na TerraLib e recebe como argumentos três pontos ( pt1, pt2 e pt3) e o
número n de pontos intermediários que devem ser gerados. Como resultado, essa função
gera um arco formado por esses n pontos que passa pelos três pontos de entrada (Drexel
University, 2003).
A A A A
R R
B R B B
B
R
10-24
No TeOracleSpatial essas operações utilizam as funções da extensão espacial:
SDO_INTERSECTION, SDO_UNION, SDO_XOR e SDO_DIFFERENCE, as quais
retornam um objeto do tipo SDO_GEOMETRY, contendo a geometria resultante. Não é
possível saber, a priori, o tipo do objeto que será retornado por essas funções, pois, por
exemplo, a interseção entre dois polígonos pode retornar uma geometria do tipo
polígono, linha ou ponto, ou até mesmo um conjunto de geometrias. Por isso, essas
operações retornam uma estrutura de dados genérica, chamada TeGeometryVect,
que pode conter o endereço de diferentes tipos de geometrias, assim como
TePolygon, TeLine2D ou TePoint.
10-25
16, 24, 16, 24, 18, 28, 18, 28,
30, 10, 30, 20, 20, 20, 26, 26,
26, 26, 20, 20, 20))
A API desenvolvida nesse trabalho fornece dois tipos de operações sobre dados
matriciais: Zonal e Recorte (a partir de uma máscara). Essas operações foram
implementadas somente no nível mais genérico, ou seja, como métodos da classe base
TeDatabase, pois nenhuma extensão espacial oferece recursos para tratar dados
matriciais. Portanto, esses métodos são utilizados por todos os SGBDs que possuem
uma interface com a TerraLib, como Access, MySQL, PostgreSQL e Oracle Spatial.
Para que as operações Zonal e Recorte pudessem ser aplicadas a dados matriciais
armazenados tanto em arquivos em memória quanto em SGBDs, foram implementadas
as funções TeRasterStatisticsInPoly (para calcular as estatísticas de um
raster a partir de um polígono) e TeMask (para recortar um raster a partir de um
polígono) sobre a classe TeRaster. Assim, essas funções recebem como parâmetro de
entrada um geo-campo do tipo TeRaster, o qual pode estar associado a um arquivo de
formato proprietário, como JPEG ou geoTIFF, ou a uma tabela espacial do tipo raster
do SGBD. As assinaturas dessas funções são mostradas abaixo:
10-26
bool TeRasterStatisticsInPoly (TePolygon& poly, TeRaster*
raster, int band, TeStatisticValMap& stat)
As estatísticas calculadas são: contagem, valor mínimo e máximo, soma, média, desvio
padrão, variância, assimetria, curtose, amplitude, mediana, coeficiente de variação e
moda. Todas as estruturas de dados e funções, implementadas em C++, utilizadas para o
cálculo dessas estatísticas da operação Zonal são mostradas no Anexo B.
10-27
percorrer sua estrutura segundo alguma estratégia de percurso. Essa estratégia define se
o iterador percorrerá a região interna ou externa de um polígono específico.
Iteradores são uma generalização de ponteiros; são objetos que apontam para outros
objetos (Austern, 1998). Segundo Stroustrup (1999), um iterador é uma abstração da
noção de um ponteiro para uma seqüência. Basicamente, seus principais conceitos são:
A classe TeRaster possui um iterador que percorre, célula a célula, todo o dado
raster. Um dado raster é representado por uma estrutura matricial que pode ser de duas
(linha e coluna) ou três dimensões (linha, coluna e banda). Como o tipo TeRaster
considera um geo-campo sempre como uma estrutura matricial de três dimensões, o
iterador percorre essa estrutura passando por cada linha e coluna, retornando um vetor
de valores, onde cada valor está associado a uma determinada banda. Portanto, o
elemento apontado pelo iterador é um vetor de valores e o seu operador de dereferência
(*) retorna esse vetor. O operador de incremento (++) faz o iterador apontar para a
próxima linha e coluna e é possível verificar se dois iteradores são iguais, ou seja, se
eles apontam para a mesma linha e coluna do raster, através do operador (= =).
Iteradores são muito importantes para a programação genérica, pois fornecem uma
interface entre as estruturas de dados e os algoritmos, permitindo assim um
desacoplamento entre os dois (Köthe, 2000). Esse desacoplamento é essencial para a
implementação de algoritmos genéricos e reusáveis (Vinhas et al, 2002).
10-28
O iterador desenvolvido nesse trabalho, chamado iteratorPoly, foi implementado
como uma classe derivada da classe iterator já existente (Figura 10.3). O iterador
iterator implementa os operadores de incremento (++) pré e pós-fixado, o de
dereferência (*) e o de igualdade e diferença (= = e !=). Já o iterador iteratorPoly
só reimplementa o operador de incremento, pois o único critério que o diferencia do
iterador iterator é o critério de percurso. O iterador iterator percorre todo o
raster, e o iteratorPoly só percorre o raster na região que está fora ou dentro dos
limites de um polígono. Portanto, ele deve guardar informações sobre o polígono
limitante e saber calcular, para cada linha do raster, as colunas que estão fora ou dentro
do polígono (método getNewSegment).
10-29
++it; //incremento
}
Para ilustrar cada estratégia, considera-se a Figura 10.4, onde a matriz em cinza é um
dado raster, o retângulo em azul é o polígono limitante e as retas pontilhadas vermelhas
são os segmentos, para cada linha do raster, que passam pelo centro de todas as células
dessa linha. As células percorridas segundo os critérios são:
10-30
TeBoxPixelIn: (2,3), (2,4), (2,5), (3,3), (3,4), (3,5), (4,3), (4,4) e (4,5);
TeBBoxPixelInters: (2,2), (2,3), (2,4), (2,5), (3,2), (3,3), (3,4), (3,5), (4,2),
(4,3), (4,4) e (4,5);
TeBoxPixelOut: (1,1), (1,2), (1,3), (1,4), (1,5), (1,6), (2,1), (2,2), (2,6), (3,1),
(3,2), (3,6), (4,1), (4,2), (4,6), (5,1), (5,2), (5,3), (5,4), (5,5), (5,6), (6,1), (6,2),
(6,3), (6,4), (6,5) e (6,6).
A operação Zonal trabalha somente com as regiões do raster internas às zonas, que são
representadas por polígonos. Portanto, a função TeRasterStatisticsInPoly
utiliza sempre o iteratorPoly com a estratégia de percurso TeBoxPixelIn,
como mostrado no Anexo B. Já a operação Mask, função TeMask, recebe a estratégia
como parâmetro, podendo recortar o raster a partir da região interna ou externa ao
polígono.
10-31
de percorrê-la, e não somente pelo tipo TeRaster. As assinaturas dessa função são
mostradas abaixo:
Sendo genérica, essa função poderá ser utilizada para várias estruturas de dados da
TerraLib que possuem um iterador, como por exemplo, a estrutura
TeSelectedObjectMap, que armazena os atributos referentes aos objetos de um
layer (TerraLib, 2003). Assim, para calcular as estatísticas de um determinado atributo,
10-32
deve-se apenas criar um iterador para o início e outro para o final dessa estrutura e
passá-los como parâmetros para a função TeCalculateStatistics.
Operações no TeDatabase
10-33
tabela espacial, a função retorna uma estrutura que faz o mapeamento de cada objeto
geográfico dessa tabela para suas respectivas estatísticas (TeObjectStatistics).
10-34
10.3 UTILIZAÇÃO E RESULTADOS
10.3.1 Introdução
Na tela mostrada acima, o usuário escolhe os temas envolvidos e a operação que será
executada. Um tema é um conceito da TerraLib que consiste em um subconjunto dos
objetos geográficos de um determinado layer. As operações podem ser executadas entre
os objetos de um mesmo tema ou de dois temas distintos.
10-35
partir de uma distância em torno de uma geometria específica (buffer), operações de
conjunto (interseção, união, diferença e diferença simétrica) e vizinhos mais próximos.
Para cada operação selecionada é mostrada uma descrição de sua funcionalidade.
Para testar as operações sobre dados matriciais da API, foi desenvolvida uma interface
gráfica no TerraView, mostrada na Figura . Nesta interface o usuário pode recortar ou
gerar as estatísticas de um geo-campo, ou seja, de um tema de representação matricial, a
partir de um polígono. Esse polígono pode estar em outro tema ou ter sido desenhado na
tela. Para executar a operação de recorte, o usuário fornece outras informações como o
nome do layer que será gerado e a estratégia de recorte, ou seja, se o dado raster será
recortado a partir da região externa ou interna ao polígono.
Consultas espaciais
Nesta seção, serão apresentados dois exemplos de consultas sobre relações topológicas,
considerando dois temas, onde um é formado pelos estados (estados_Brasil) e o outro
pelos rios (rios_Brasil) do Brasil. Esses dois temas foram construídos a partir dos layers
mostrados na Figura .
Consulta 1) Encontre todos os estados do Brasil que fazem fronteira com o estado de
Minas Gerais
10-36
//TeTheme* estados_Brasil
//TeDatabase* db (TeAdo ou TeOracleSpatial ou TeMySQL)
//typedef vector<string> Keys
Além dos parâmetros descritos acima, são passados para o método: a relação topológica
a ser executada (relate = TeTOUCHES), o conjunto dos identificadores dos objetos
sobre os quais a consulta será realizada (IdsIn = “MG”), a tolerância permitida (tol
= 0.001) e a estrutura que conterá os identificadores dos objetos resultantes (IdsOut).
Uma outra opção seria retornar todos os objetos geográficos resultantes da consulta, e
10-37
não somente seus identificadores. Para isso, pode ser passado como parâmetro um
objeto do tipo TeDatabasePortal (portal), o qual conterá as geometrias
resultantes, ao invés de passar uma estrutura do tipo Keys (IdsOut), como mostrado
abaixo:
O resultado dessa consulta é mostrado nas figuras a seguir. A Figura mostra o objeto
selecionado na cor marrom, sobre o qual a consulta será realizada (estado de Minas
Gerais). A Figura mostra os objetos resultantes da consulta pintados de mostarda.
Consulta 2) Encontre todos os rios do Brasil que cruzam a fronteira do estado de Minas
Gerais ou do Paraná.
10-38
string actTable = estados_Brasil->layer()->tableName(actRep);
10-39
geográficos resultantes, e não somente seus identificadores, passando um objeto do tipo
TeDatabasePortal (portal), como mostrado abaixo:
O resultado dessa consulta é mostrado nas figuras a seguir. A Figura mostra os objetos
selecionados na cor amarela, sobre os quais a consulta será realizada (estados Minas
Gerais e Paraná). A Figura mostra os objetos, no caso os rios, resultantes da consulta,
pintados de vermelho.
Funções espaciais
Nesta seção serão apresentados dois exemplos da utilização das operações Buffer e
nearestNeighbors da API.
Exemplo 1) Gerar uma nova geometria a partir de uma distância de 0.5 ao redor dos rios
Itaí e Paragua, cujos identificadores são “1140” e “1255”, respectivamente.
10-40
//TeTheme* rios_Brasil
//TeDatabase* db = new TeOracleSpatial()
//typedef vector<string> Keys
Keys IdsIn;
string obj_id1 = “1140”;
IdsIn.push_back(obj_id1);
string obj_id2 = “1255”;
IdsIn.push_back(obj_id2);
10-41
Figura 10.20 - Buffers gerados
Figura 10.21 - Buffer do país Hungria Figura 10.22 - Buffer da cidade de Roma
//TeTheme* rios_Brasil
//TeDatabase* db = new TeOracleSpatial()
10-42
string collName = “spatial_data”;
A função para encontrar os vizinhos mais próximos de um objeto geográfico ainda não
foi implementada na TerraLib, portanto para realizar essa operação o TeDatabase
tem que ser do tipo TeOracleSpatial. A Figura mostra o resultado dessa operação,
onde o rio Tapaua está selecionado de amarelo e seus 10 vizinhos mais próximos estão
pintados de vermelho.
Ainda para ilustrar a operação de vizinho mais próximo, a Figura mostra essa operação
sendo aplicada a dois temas distintos, de rios e cidades da Europa. Essa figura ilustra o
resultado da operação “encontre os cinco rios mais próximos da cidade de Roma”. A
10-43
cidade de Roma está selecionada de verde e os rios resultantes foram pintados de
vermelho.
Figura 10.23 - Rios mais próximos do rio Figura 10.24 - Rios mais próximos da cidade
Tapaua de Roma
Nesta seção, serão mostrados alguns exemplos de utilização das operações sobre dados
matriciais da API, apresentando seus resultados.
Operação Mask
Como exemplo, serão mostradas as operações para recortar uma imagem de Brasília,
que está representada em um tema chamado Imagem_Brasilia, a partir de um polígono
de um tema chamado Poligonos_Mask. A Figura 10.25 mostra esses dois temas
sobrepostos, onde o polígono pintado de verde define a máscara do recorte.
10-44
Operação 1) Recortar a imagem de Brasília a partir da região interna ao polígono cujo
identificador é “polígono1”:
// TeTheme* Imagem_Brasilia
// TeTheme* Poligonos_Mask
// TeDatabase* db (TeAdo ou TeOracleSpatial ou TeMySQL)
//estratégia
TeStrategicIterator strat = TeBoxPixelIn;
No código da operação 1 mostrado acima, os nomes das tabelas onde estão armazenados
o dado raster (rasterTable) e o polígono que define a máscara (geomTable) são
extraídos dos temas Imagem_Brasilia e Poligonos_Mask, respectivamente. A operação
Mask é um método do objeto TeDatabase (db) que é instanciado conforme o SGBD
utilizado, podendo ser um TeAdo, TeOracleSpatial ou TeMySQL. Além dos
nomes das tabelas, esse método recebe como parâmetros de entrada: o identificador do
polígono que define a máscara (objId = “polígono1”), o nome do layer que será
gerado como resultado (nameLayerOut = "Imagem_Brasilia_Mask_In") e a
estratégia utilizada no recorte, que nesta operação é a partir da região interna à máscara
10-45
(strat = TeBoxPixelIn). O layer resultante dessa operação é mostrado na Figura
10.26.
// TeTheme* Imagem_Brasilia
// TeTheme* Poligonos_Mask
// TeDatabase* db (TeAdo ou TeOracleSpatial ou TeMySQL)
//estratégia
TeStrategicIterator strat = TeBoxPixelOut;
10-46
Figura 10.25-Imagem de Brasília
Operação Zonal
10-47
// TeTheme* Imagem_Brasilia
// TeTheme* Poligonos_Mask
// TeDatabase* db (TeAdo ou TeOracleSpatial ou TeMySQL)
// typedef vector<string> Keys
// typedef map<string, TeStatisticsDimensionVect>
TeObjectStatistics
TeObjectStatistics result;
Keys Ids;
10-48
TerraView para mostrar as estatísticas geradas nessas operações. Essa interface
apresenta o conjunto de estatísticas para cada banda da imagem.
10-49
10.4 CONCLUSÃO E TRABALHOS FUTUROS
Com relação aos objetivos propostos, a API desenvolvida permite encapsular diferentes
implementações de tipos de dados espaciais realizadas pelos diferentes fabricantes de
SGBD e ainda estende as facilidades disponíveis nestes sistemas, como no caso do
suporte a dados matriciais no Oracle Spatial. Como a TerraLib é uma biblioteca base
para a construção desses aplicativos, a API desenvolvida fornece tais funcionalidades a
um nível maior de abstração para os desenvolvedores de sistemas geográficos. Assim,
esse desenvolvedor pode utilizar as operações espaciais disponíveis na biblioteca sem
precisar ter conhecimento de como são computadas, podendo então, se dedicar à
implementação de outras funcionalidades, como por exemplo, visualização dos dados,
interface com o usuário e ferramentas para análise espacial. Abaixo são citadas algumas
restrições da API desenvolvida, que serão exploradas em trabalhos futuros:
(2) Há outras operações sobre dados matriciais que não estão disponíveis na API
como: operações matemáticas entre dois geo-campos, reclassificação,
fatiamento, ponderação e operações focais ou de vizinhança.
10-50
REFERÊNCIAS BIBLIOGRÁFICAS
Austern, M. H. Generic Programming and the STL: Using and Extending the C++
Standard Template Library. Massachusetts: Addison-Weslwy, 1998. 548 p.
Câmara, G.; Souza, R. C. M.; Pedrosa, B.; Vinhas, L.; Monteiro A. M.; Paiva, J. A. C.
P.; Gattas, M. TerraLib: Technology in Support of GIS Innovation. 2000. II
Workshop Brasileiro de Geoinformática.
Câmara, G.; Vinhas, L.; Souza, R. C. M.; Paiva, J. A. C.; Monteiro, A. M. V.; Carvalho,
M. T.; Raoult, B. Design Patterns in GIS Development: The Terralib Experience.
2001. III Workshop Brasileiro de Geoinformática.
10-51
Egenhofer, M.; Franzosa, R. On the Equivalence of Topological Relations.
International Journal of Geographical Information Systems , v. 9, n. 2, p. 133-152,
1995.
Gamma, E.; Helm, R.; Johnson R.; Vlissides, J. Design patterns - elements of
reusable object-oriented software. USA: Addison-Wesley, 1995.
Guttman, A. R-TREES. A Dynamic Index Structure for Spatial Searching. In: Proc.
SIGMOD Conf. Boston: ACM, 1984. p. 47-57.
IBM Corporation. DB2 Spatial Extender User's Guide and Reference[online].
<http://www-3.ibm.com> 2001.
Lassen, A. R.; Olsson, J.; Osterbye, K. Object Relational Modeling. Centre for Object
Technology (COT), 1998. 32 p.
Locke, P.; Belden, E.; Melnick J. Oracle Call Interface - Programmer’s Guide. :
Oracle Corporation , Mar. 1999. (No. A76975-01)
Mitrovic, A.; Djordjevic, S. Object-Oriented paradigm meets GIS: a new era in
spatial data management. p. 141-148, 1996. YUGIS, Beograd.
Murray, C. Oracle® Spatial - User's Guide and Reference. Redwood City, CA:
Oracle Corporation, 2001. (Part Nº A88805-01)
10-52
OGC The OpenGIS™ Guide - Introduction to Interoperable Geoprocessing.
Massachusetts, USA: Open GIS Consortium , 1996.
Rigaux, P.; Scholl, M.; Voisard, A. Spatial Databases with application to GIS. San
Francisco: Morgan Kaufmann , 2002. 408 p.
Samet, H. The Quadtree and Related Hierarchical Data Structures. ACM Computing
Surveys, v. 16, n. 2, p. 187-260, 1984.
Shekhar, S.; Ravada, S.; Liu, X. Spatial Databases - Accomplishments and Research
Needs. IEEE Transations on Knowledge and Data Engineering, v. 11, n. 1, Fev.
1999.
Stroustrup, B. The C++ Programming Language. USA: Addison-Wesley, 1999.
Vinhas, L.; Queiroz, G. R.; Ferreira, K. R.; Câmara, G.; Paiva, J. A. C. Programação
Genérica Aplicada a Algoritmos Geográficos. In: IV Simpósio Brasileiro de
GeoInformática. Anais. Caxambu, MG, 2002. v.1, p.117-122.
10-53