Você está na página 1de 370

Bancos de Dados Geográficos

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.

1. Representação Computacional de Dados Geográficos


Gilberto Câmara

Introdução. Modelos de dados para Geoprocessamento. Representações computacionais


para dados espaciais.

2. Arquiteturas de Bancos de Dados Geográficos


Gilberto Câmara, Karine Reis Ferreira, Gilberto Ribeiro de Queiroz

Arquiteturas para bancos de dados geográficos: dual, em camadas,


integrada. Exemplos de tecnologias atual e emergentes

3. Modelagem de Dados Geográficos


Clodoveu Davis e Karla Borges

Modelo de dados OMT-G: uma visão genérica do problema de modelagem de dados.


Mapeamento do OMT-G para sistemas reais: SPRING, ARC/INFO, ARC/VIEW,
IDRISI, MGE. Exemplos de modelagem sobre problemas reais.

4. Linguagens para Bancos de Dados Geográficos


Gilberto Câmara, Marco Casanova

Operadores Topologicos: o modelo das 9-interseccoes.


Componentes de uma linguagem: consulta, apresentacao e
manipulacao. Exemplos de linguagens: Spatial SQL, OpenGIS,
LEGAL.
5. Modelos Espaco-Temporais
Gilberto Câmara, Taciana Lemos Dias, Marco Casanova

Modelos e estruturas de dados espaco-tempo. Linguagens de


consulta espaço-temporais. Modelos dinâmicos.
6. Geometria Computacional
Clodoveu Davis, Gilberto Ribeiro de Queiroz

Algoritmos basicos: ponto em poligono, simplificacao de linhas,


interseccao de poligonos.

7. Indexação e Métodos de Acesso para Dados Espaciais (disponível em


Agosto/2004)
Marco Antônio Casanova, Gilberto Câmara

Indexação espacial. Métodos de acesso em memória principal: R-tree, quad-tree, k-d-


tree, VR-tree. Estruturas hierárquicas. Métodos de acesso em memória secundária e
incorporação de persistência. Operações de seleção espacial e junção espacial: técnicas
de otimização. Medidas de desempenho.
8. Interoperabilidade e Ontologias
Frederico Fonseca, Paulo Lima, Gilberto Câmara

O problema da interoperabilidade sintática e semântica.


Conversão de dados. Uso de ontologias para interoperabilidade.

9. Bibliotecas Digitais e Internet (disponível em Agosto/2004)


Gilberto Ribeiro de Queiroz, Gilberto Câmara.

Conceitos de bibliotecas geográficas digitais. Internet como meio de


disseminação de informação geográfica. Modelos cliente-servidor:
estratégias de transferência de informação. Acesso remoto a bancos
de dados. Bancos de Dados de grandes dimensoes. O problema
da escalabilidade. Bancos de Dados de Imagens.

10. Implementação de Bancos de Dados Geográficos


Karine Reis Ferreira, João Argemiro Paiva.

Exemplos de implementação de bancos de dados geográficos:


ORACLE SPATIAL e a bibilioteca de software livre TerraLib.
! " # $ % &
'
()*' +
, - & .
! /-

/ 0
1 " " &
& & & '
&
- & , $
! &

2 & 1
'

3 . '
- 1 /

4
& 5 0 & - 2 - 5 5

1-1
6 & & 7
8
- " & 9
)*' &

. /
& / 9
• % : $ )*'
6 &
• % : )*' &$ -
; < -
/ #
• % : )*'
$

=#
(
+ # )*'
" :
. - -
( - + -
)*'

&
2 - )*'
" <
/ 2 - - -
)*' $ /-
- "

- / , & &

- " & ' 9

!
"

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

Entrada e Integr. Consulta e Análise Visualização


Dados Espacial Plotagem

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.

& - ' (4JJK&+


4.2 & K.2 # , .
9
&. " -

" : .

- &

! & " ' "

( ; !+
- -
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

geoid area cadastro INCRA


22 1500 019331

cadastro INCRA ITR dono


019331 12000 Olacyr

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

é-um é-um é-um é-um

Grade Imagem Imagem Imagem


Regular Temática Niveis de Cinza Síntética

parte-de parte-de

parte-de MATRIZ 2D 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 ; $: :

0$$ " - & "

& " &


&$ ' *) , - "
B " B $
&$
&$ 1 9
&$ &$ / &$ % &$
& ' *) & &$
# , "
"
, &$ /
&$ - /-
7 8
& 5 &$ $ ,

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

Pto 2D Nó 2D lista-de Linha 2D Nó 3D


parte-de

parte-de lista-de lista-de


parte-de
Coordenada conj-de Coordenada
parte-de 2D 3D

" 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

COMPARAÇÃO ENTRE REPRESENTAÇÕES PARA MAPAS TEMÁTICOS

Aspecto Representação Vetorial Representação Matricial


Relações Relacionamentos topológicos entre Relacionamentos espaciais
espaciais entre objetos disponíveis devem ser inferidos
objetos
Ligação com Facilita associar atributos a elementos Associa atributos apenas a
banco de dados gráficos classes do mapa
Análise, Representação indireta de fenômenos Representa melhor fenômenos
Simulação e contínuos com variação contínua no
Modelagem espaço
Álgebra de mapas é limitada
Simulação e modelagem mais
fáceis
Escalas de Adequado tanto a grandes quanto a Mais adequado para pequenas
trabalho pequenas escalas escalas (1:25.000 e menores)
Algoritmos Problemas com erros geométricos Processsamento mais rápido e
eficiente.
Armazenamento Por coordenadas (mais eficiente) Por matrizes

% $ &

7 &

- 5 4 4^ #
. -
- -
. - -

-
" -
< I - - /
& / ( D +

1-29
- ! $ :* ; < 00"

7$ &4 " & "

/ !* ( 1 7 T H8+
- :6
/ - $ #
1 - <
(, Z+ & - -
)*' ; !
& . 2 Z
P ,
- / - -
/
. 5 4 4O /

1-30
= ! $ # :* ; < 00"

7% - 1) - " 16 "

- , -

1 <
-
,
# - - / " -
M2 /-
! & 4K -
-

1-31
' > ?

@ A ( B 9 C D A * '9 . 9 + ! 9 . E ? 9 ! ( ?5 ! '9 & * . E ? 9 ! B 9


9 B 9 ! * ' 9 ( A + ? A ! * E ( F 9 &@ A ! + ' 9 9 * A

Malha triangular Grade regular

Vantagens 1. Melhor representação de relevo 1. Facilita manuseio e


complexo conversão
1. Incorporação de restrições como 1. Adequada para geofísica e
linhas de crista visualização 3D
Problemas 1. Complexidade de manuseio 1. Representação relevo
1. Inadequada para visualização 3D complexo
1. Cálculo de declividade

& -
&
$ C - ( +
$ - (- +

' $ ( ()

. & - (
C & , + C &$
$ 6

* )*' -
& . : - #
& .
: &$
- & -
& .
&$
&
, - $
) ' 0 2 ()' 02+ % )' 02
&
- - / .

1-32
: 1
9 . - A
8 . " - 8 .
-

&
# - -
. / M ,

8 " ' &

% )*' )' 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
((

BENTLEY, J. Multidimensional Search Trees Used for Associative Searching.


Communications of the ACM, 18:509-517, 1975.
BRINKHOFF, T.; KRIEGEL, H.P.; SEEGER, B. Efficient Processing of Spatial Joins
Using R-Trees. In: ACM SIGMOD Conference, Washington, 1993.
Proceedings, Washington, ACM, pp. 237-246, 1993.
DE BERG (ed.), Computational Geometry : Algorithms and Applications. Berlin,
Springer Verlag, 1997.
CÂMARA, G. Modelos, Linguagens e Arquiteturas para Bancos de Dados
Geográficos. Tese de Doutoramento em Computação Aplicada. São José dos
Campos, INPE, Dezembro 1995. (disponível em
<http://www.dpi.inpe.br/teses/gilberto>.
CÂMARA, G.; FREITAS, U.M.; SOUZA, R.C.M.; GARRIDO, J. SPRING: Integrating
Remote Sensing and GIS by Object-Oriented Data Modelling. Computers and
Graphics, vol. 15, n.6, July 1996.
GOODCHILD, M. Geographical information science. International Journal of
Geographical Information Systems, 6 (2): 35-45, 1992a.
GOODCHILD, M. Geographical data modeling. Computers & Geosciences, 1992,
18(4): 401-408, 1992b.
GOMES, J.M.; VELHO, L. Computação Visual: Imagens. Rio, SBM, 1995.
GUTING, R.H. An Introduction to Spatial Database Systems. VLDB Journal, 3(4),
October 1994.
GUTMAN, A. R-trees: a dynamic index structure for spatial searching. In: ACM
SIGMOD CONFERENCE. Proceedings, Boston, ACM, pp. 47-57, 1984.
INTERGRAPH, MGE- The Modular GIS Environment, 1990.
<http://www.intergraph.com/gis>
VAN KREVELD, M.; ROOS,T, NIEVERGELT,J. (eds.) Algorithmic Foundations of
Geographic Information Systems (Lecture Notes in Computer Science, 1340).
Berlin, Springer-Verlag, 1998.
MOREHOUSE, S. The ARC/INFO Geographical Information System. Computers &
Geosciences, 18(4): 435-443, 1991.

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+/

Bancos de Dados Geográficos 2-2


# $ # ,
"

• ' .# #/
' 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%

Bancos de Dados Geográficos 2-3


- @ ! " .
; /M .
N /M .
! / C%
& ' A

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 '

Bancos de Dados Geográficos 2-4


. C B /
! ,
• ) P . # $ "/" 9 '
; "
! ! ' . /
& 7 (

? '
-
.#' > #/ 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' ?
,

Bancos de Dados Geográficos 2-5


S ' @ ! ! &
C%" % ' C% '
A ; ' C% ' ( ! %
F P4 &
- - & C% -
& !
! "

% M

%
- M

)
- C%
! - & !
M

F ' ) &
* ! !

SIG SIG

atributos
atributos

SGBD

Arquivos SGBD

F P 4( ! % F PP( !

Bancos de Dados Geográficos 2-6


! F PP &
C% -
- & C%
@ ;
@
- - C% !
' C% & CE C
& "

? - & 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 '
;

Bancos de Dados Geográficos 2-7


9 LE ;
' H%9 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

= '
' ,

Bancos de Dados Geográficos 2-8


) -

9 .455V/ ; ' @
" .4/ ; !
M .P/ ; ' ! M
.X/ ; ' !
D A .P11P/ ' @ ,
, "

.4/ ; ' " '


, A - A
.$ ,/ .$ /-

.P/ ; "
, .& ./ . / '

.X/ ; "
A
T , . /
A ' .) ,0 /1 ; !
, T .2 3/ * .$ /
'

.V/ ; ( " ' T


' N
$ ,0 !
' ' T

.6/ ; ' " -


' ; .4 /
= .5 / . /

.W/ ; ' ' " '-


; "

Bancos de Dados Geográficos 2-9


; * " ; !
; *
A - .$ / . /
.4 / & .$ / M

' ; " ; ! A ;
A . / .6 .% / 7

; - " ; ! T
A ! T
! !

.Y/ ; ' " T


' . /- ,
7 ; * ' '
! ; ' (
.9 F & 4556/ 9 - V(
; ; .∂ / . °/ '
& .∅/ ( & .¬∅/ ? F
PX -
7 ; '
A ; ;
-
A . / ' V( ;
7
A '
B 5( ; .9 S 4554/ B
; ' ; * ;
9 .455V/

? ;
& ( & S ; ! -
; ; & 7 A
8 * 9 & @
? & 8
' ' !
-
) ! ;
; & B D ; H * C
% .9 455X/ ! -' V( ;

Bancos de Dados Geográficos 2-10


B 5( ; 9 % .%9(5 B/ ! -
' 5( ; .7 4550/

F PX(D ; *

) .

( & "

H " -
A (
& "
' M

? - "
A -
M

% "- & - ' -


& ' ,

Bancos de Dados Geográficos 2-11


H .4551/ @ ; ' !
A & ; . / & ;
.& / & & ; . / 9 ; '-
' '
E9 E ! - 7D ? .) P11P/

; , (
& - (
& ? 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 <

Bancos de Dados Geográficos 2-12


.B < P114/ - A '
' ( %C 9
- L E %%E
; ' - 7E8 L E !
- A L E .E 4550/ 9 A -'
; -
! &
'

!
. ) /
! &
= 7 E 7 , .
/ = N
@ .B 7 B E B 7 , /
@ .) / = -
! '

% : & ' ( - &


' % [ 9 B9HDI 9 ' -
; ' 9
' ' -
' .2 D) S DP ?= BC9D /
% [ 9 B9HDI ? ' T
- &
' ' A - A
' L E"

create table Estados_do_Brasil

nome_estado VARCHAR2(100),

nome_captial VARCHAR2(100),

populacao_03 NUMBER,

fronteira MDSYS.SDO_GEOMETRY

Bancos de Dados Geográficos 2-13


' % [ 9 B9HDI - ' "

% [ HI79" ! N

" 11 . / 14 . / 1P . / 1X
. , / 1V . / 16 . / 1W . / 1Y
. , /M

% [ D %" &
@ : M

% [7 ?H" - & '


% [7 ?H[HI79 ! - ' 3 I Z
-
N N % [ HI79
14 M

% [9E9B[ ?F " - ! &


, ! ; )
& % [ D% ? H9 !
@ N & % [9E9B[ ?F "

• % [ H DH ? [ FF 9H" !
% [ D% ? H9 M

• % [9HI79" M

• % [ ?H9D7D9H H ?"
% [9HI79

% [ D% ? H9 " - ! &

A D( L
& A ! !
A '

) , - ; D(
' ' (
' , T .BCD / '

Bancos de Dados Geográficos 2-14


L P% !
' '

- 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 ; & ! &
"

% [D9E H9" ; * '


' B 5( ; 9 S .4554/
Bancos de Dados Geográficos 2-15
D ' T !
" 9L = E % Q ?H H = ) S ? %9 29DE 7C%I ?H9D 9) H
29DE 7C%I% Q ?H ?I ?H9D ) H ) ?H ? ? ) 29D
) 29DD9%CIM

% [+ HS ?[% H ?) 9" '


T ! - T M

% [??" & *A '


% ; " % [C= FF9D
T , . /M
% [ D9 % [E9? HS , M % [% H ?) 9
T ' M % [ ?H9D 9) H ? % [= ? ?
% [% FF9D9?) 9

) A ;
LE , 0
$ A *A ! F PV
A @ ' & & , !
, &
A *A '

Bancos de Dados Geográficos 2-16


H ' P4

F PV() )

Bancos de Dados Geográficos 2-17


H C9E P 4 ] H C9E 9 7 )
Zona_sensível area_risco
Nome Atributo Tipo Nome Atributo Tipo
2 D) S DP.61/
Nome VARCHAR2(50)
% [ 9 B9HD % [ 9 B9HD
Z I I

LE & % [D9E H9
% [C= FF9D - C% "

SELECT ass.nome, ar.nome

FROM AREA_RISCO ar, AREA_SENSIVEL ass,

USER_SDO_GEOM_METADATA m

WHERE m.table_name = ‘AREA_RISCO’

AND (SDO_RELATE(ass.zona,

SDO_GEOM.SDO_BUFFER(ar.local, m.diminfo,

8000), ‘mask=ANYINTERACT querytype=WINDOW’) = ‘TRUE’);

' ( ! - '
% [C= FF9D & ; '
= 9D[ % [ 9 B[B9H % H

Bancos de Dados Geográficos 2-18


Austern, M. H. Generic Programming and the STL: Using and Extending the C++
Standard Template Library. Massachusetts: Addison-Weslwy, 1998. 548 p.

Booch, G. Object-Oriented Analysis and Design - with applications. California:


Benjamin/Cummings Publishing Company, 1994. 500 p.

Burrough, P. A.; McDonnell, R. A. Principles of Geographical Information Systems.


New York: Oxford University Press, 1998. 332 p.

Câmara, G.; Casanova, M. A.; Hemerly, A. S.; Magalhães, G. C.; Medeiros, C. B.


Anatomia de Sistemas de Informação Geográfica. Campinas: 10ª Escola de
Computação, 1996. 193 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.

Cordeiro, J. P. C.; Câmara, G.; Freitas, U. M.; Barbosa, C. C. F. LEGAL: An Object-


Oriented Map Algebra Language. Instituto Nacional de Pesquisas Espaciais : A ser
publicado.

Drexel University. The Math Forum [online], 2003. <http://mathforum.org/dr.math/>.


Visitado em fevereiro de 2003.

Egenhofer, M. Spatial Information Appliances: A Next Generation of Geographic


Information Systems. 1999. First Brazilian Workshop on GeoInformatics .
Egenhofer, M. A Model for Detailed Binary Topological Relationships. Geomatica, v.
47, n. 3 & 4, p. 261-273, 1993.

Egenhofer, M. J. Spatial SQL: A Query and Presentation Language. IEEE


Transactions on Knowledge and Data Engineering , v. 6, n. 1, p. 86-95, 1994.

Egenhofer, M. J.; Herring, J. R. Categorizing Binary Topological Relations Between


Regions, Lines, and Points in Geographic Databases. Maine, USA: University of
Maine, 1991.

Bancos de Dados Geográficos 2-19


Egenhofer, M.; Clementini, E.; Di Felice, P. Topological relations between regions with
holes. International Journal of Geographical Information Systems , v. 8, n. 2, p.
129-144, 1994.

Egenhofer, M.; Franzosa, R. On the Equivalence of Topological Relations.


International Journal of Geographical Information Systems , v. 9, n. 2, p. 133-152,
1995.

ESRI ArcSDE[online]. <http://arcsdeonline.esri.com/index.htm>. Mar. 2003.


Ferreira, K. R.; Queiroz, G. R.; Paiva, J. A. C.; Souza, R. C. M.; Câmara, G.
Arquitetura de Software para Construção de Bancos de Dados Geográficos com
SGBD Objeto-Relacionais. p. 57-67, 2002. XVII Simpósio Brasileiro de Banco de
Dados.

Frank, A. U. Requirements for Database Systems Suitable to Manage Large Spatial


Databases. Photogrammetric Engineering & Remote Sensing , v. 11, n. 54, p. 1557-
1564, 1988.

Gamma, E.; Helm, R.; Johnson R.; Vlissides, J. Design patterns - elements of
reusable object-oriented software. USA: Addison-Wesley, 1995.

Güting, R. An Introduction to Spatial Database Systems. VLDB Journal, v. 3, 1994.

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.

IBM Corporation. Working with the Geodetic and Spatial DataBlade


Modules[online]. <http://www-
3.ibm.com/software/data/informix/pubs/manuals/geo_spatial.pdf> 2002.

Korth, F. H.; Silberschatz, A. Sistemas de Bancos de Dados. São Paulo: McGraw-Hill,


1994. 693 p.

Köthe, U. STL-Style Generic Programming with Images. C++ Report Magazine, v.


12, n. 1. Jan. 2000.

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.

Bancos de Dados Geográficos 2-20


Murray, C. Oracle® Spatial - User's Guide and Reference. Redwood City, CA:
Oracle Corporation, 2001. (Part Nº A88805-01)

OGC The OpenGIS™ Guide - Introduction to Interoperable Geoprocessing.


Massachusetts, USA: Open GIS Consortium , 1996.

Paiva, J. A. C. Topological Equivalence and Similarity in Multi-Representation


Geographic Database. Maine, USA - University of Maine, 1998.

Ramsey, P. PostGis Manual[online]. <<http://postgis.refractions.net>> 2002.

Ravada, S.; Sharma, J. Oracle8i Spatial: Experiences with Extensible Databases.


SSD'99. R. H. Guting, D. Papadias and F. Lochovsky, p. 355-359, 1999.

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.

TerraLib[online]. <www.TerraLib.org> 2003.

Tomlin, C. D. Geographic Information Systems and Cartographical Modeling.


New York: Prentice-Hall , 1990.

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.

Voisard, A.; Schweppe, H. Abstraction and Decomposition in Open GIS . Berkeley,


California: International Computer Science Institute, 1997. (TR-97-006)

Bancos de Dados Geográficos 2-21


! "#

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

diretamente por vários sistemas gerenciadores de banco de dados (SGBD) existentes


comercialmente. Os modelos de dados conceituais são os mais adequados para capturar a
semântica dos dados e, consequentemente, para modelar e especificar as suas propriedades.
Eles se destinam a descrever a estrutura de um banco de dados em um nível de abstração
independente dos aspectos de implementação. Como exemplo desse tipo de modelo, temos o
modelo entidade-relacionamento proposto por Chen [Chen76], o modelo funcional [SiKe77,
Ship81], o modelo binário [Abri74] e os modelos orientados a objetos [Ditt86]. Já os modelos
de dados físicos são utilizados para descrever as estruturas físicas de armazenamento.
A orientação a objetos é uma tendência em termos de modelos para representação de
aplicações geográficas [OlPM97, KöPS96, PeBS97, AbCa94, Benn96, NaFe94, EgFr92, WOHM90,
DaBo94]. Conforme Câmara et al. [CCHM96, pág.50] “a modelagem orientada a objetos não
obriga o armazenamento em um SGBD orientado a objetos, mas simplesmente visa dar ao
usuário maior flexibilidade na modelagem incremental da realidade.” Os objetos geográficos
se adequam bastante bem aos modelos orientados a objetos ao contrário, por exemplo, do
modelo de dados relacional que não se adequa aos conceitos natos que o homem tem sobre
dados espaciais. Os usuários têm que artificialmente transferir seus modelos mentais para um
conjunto restrito de conceitos não espaciais. Nos últimos anos, modelos de dados orientados a
objetos têm sido desenvolvidos para expressar e manipular as complicadas estruturas de
conhecimento usadas nas diversas aplicações não-convencionais como CAD/CAM,
multimídia, CASE, sistemas de informação geográfica, entre outras. Brodie [Brod84 apud
Lisb97] denomina de modelos semânticos de propósito especial, os modelos desenvolvidos
para atender as demandas das área de aplicações não-convencionais.

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

Bancos de Dados Geográficos 3-2


Modelagem de Dados Geográficos

conceitos abstratos para descrever os dados geométricos, e um maior número de operações


apropriadas, as quais são independente de implementação [MaFr90].
• Forma como as pessoas percebem o espaço – O aspecto cognitivo na percepção espacial é
um dos aspectos que faz com que a modelagem de dados geográficos seja diferente da
modelagem tradicional. Dependendo do observador, da sua experiência e de sua
necessidade específica uma mesma entidade geográfica pode ser percebida de diversas
formas. Uma escola, por exemplo, poderá ser vista como um símbolo, como uma área,
como edificações, depende do observador e do que ele pretende com essa representação.
Além do aspecto cognitivo, existe também a questão da escala, onde a mesma entidade
geográfica pode ser representada por diferentes formas, de acordo com a escala utilizada.
O uso dessas múltiplas representações pode ocorrer simultaneamente, apresentando
formas alternativas de representar uma mesma entidade geográfica, como por exemplo,
um aeroporto que pode ser representado ao mesmo tempo pela área que ele abrange e
pelos símbolos cartográficos que o representam. Poderá também, ser exclusiva, onde cada
representação é válida para visualização em um determinado momento, como por
exemplo, os casos da variação de escala. A percepção de que a interpretação do espaço
modelado varia é muito importante na definição da melhor forma de representar o mundo
real pois, múltiplas representações podem ser necessárias a diferentes propósitos.
• Natureza diversificada dos dados geográficos – Além dos dados geográficos possuírem
geometria, localização no espaço, informações associadas e características temporais, eles
ainda possuem origens distintas. Um exemplo dessa diversidade pode ser visto em
[Kemp92]. Segundo a autora, os dados ambientais, por exemplo, são derivados de dados
disponíveis sobre topografia, clima e tempo, propriedades do solo, propriedades
geológicas, cobertura da terra, uso da terra, hidrografia e qualidade da água. Alguns desses
fenômenos, como elevação e propriedades do solo, variam continuamente sobre o espaço
(visão de campos). Outros, como falhas geológicas e redes de rios, podem ser
discretizados (visão de objetos), enquanto outros podem estar em ambas categorias
dependendo do nível de detalhe considerado.
• Existência de relações espaciais (topológicas, métricas, de ordem e fuzzy) - Essas relações
são abstrações que nos ajudam a compreender como no mundo real os objetos se
relacionam uns com os outros [MaFr90]. Muitas relações espaciais necessitam estar
explicitadas no diagrama da aplicação, de forma a torná-lo mais compreensível. As
relações topológicas são fundamentais na definição de regras de integridade espacial, que
especificam o comportamento geométrico dos objetos.
• Coexistência de entidades essenciais ao processamento e entidades “cartográficas” -
Entidades “cartográficas” representam a visão do mundo através de objetos lineares não
relacionados, ou seja, sem nenhum comprometimento com o processamento [MaFr90]. É
comum, principalmente em aplicações geográficas de áreas urbanas, a presença de

Bancos de Dados Geográficos 3-3


Modelagem de Dados Geográficos

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.

$ % !

Os modelos de dados semânticos foram desenvolvidos com o objetivo de facilitar o projeto de


esquemas de banco de dados provendo abstrações de alto nível para a modelagem de dados,
independente do software de banco de dados ou hardware utilizado [HuKi87].
Segundo [Nava92], um modelo de dados semântico deve possuir as seguintes características:
• Expressividade - O modelo deve distinguir diferentes tipos de dados, relacionamentos e
restrições.

• 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.

Bancos de Dados Geográficos 3-4


Modelagem de Dados Geográficos

• Interpretação única – Cada esquema deve ser interpretado de forma inequívoca.


Além disso, um modelo semântico deve suportar os seguintes conceitos de abstração
[Nava92]:
• Agregação - Segundo Navathe [Nava92], agregação é um conceito abstrato de construção
de um objeto agregado a partir de objetos componentes. O relacionamento entre o objeto
agregado e os componentes é descrito como “é-parte-de”. Num nível mais simples, uma
agregação é usada, por exemplo, para agregar atributos, ou seja, um objeto é definido pelo
conjunto dos atributos que o descreve.
• Classificação e Instanciação - Classificação é o processo de abstração no qual objetos
similares são agrupados dentro de uma mesma classe. Uma classe descreve as propriedades
comuns ao conjunto de objetos. As propriedades podem ser estáticas (estruturais) ou
dinâmicas (comportamentais) [Lisb97]. Segundo Brodie [Brod84 apud Lisb97], a maioria
dos modelos semânticos representa apenas as características estáticas das entidades. As
propriedades dinâmicas são representadas nos modelos orientados a objetos. O
relacionamento existente entre o objeto e a sua classe é denominado “é_membro_de” ou
“é_instância_de” significando que cada objeto é uma instância da classe [Nava92].
• Generalização/especialização - A generalização é um processo de abstração no qual um
conjunto de classes similares é generalizado em uma classe genérica (superclasse). A
especialização é o processo inverso, onde a partir de uma determinada classe mais genérica
(superclasse) são detalhadas classes mais específicas (subclasses). As subclasses possuem
algumas características que as diferem da superclasse. O relacionamento entre cada
subclasse e a superclasse é chamado de “é_um” (is_a). As subclasses automaticamente
herdam os atributos da superclasse [Nava92].
• Identificação - Cada conceito abstrato ou objeto concreto tem identificadores únicos
[Nava92].
Esses conceitos de abstração têm sido utilizados em diferentes combinações e em diferentes
graus nos modelos de dados semânticos. Navathe [Nava92] considera o modelo orientado a
objetos como um modelo similar aos modelos semânticos, podendo também ser considerado
um modelo semântico que possui adicionalmente: herança de propriedades e métodos que
modelam o comportamento dos objetos. Eles possuem também, construtores para a definição
de objetos complexos, o que possibilita a representação de aplicações em áreas consideradas
não convencionais.
São descritos a seguir, de forma breve, os quatro modelos de dados mais utilizados como base
para as extensões geográficas. Uma descrição mais detalhada poderá ser vista nas referências
indicadas.

Bancos de Dados Geográficos 3-5


Modelagem de Dados Geográficos

O modelo Entidade-Relacionamento (ER) [Chen76], é um dos primeiros modelos de dados


semânticos. Ele utiliza apenas três tipos construtores básicos: entidade (conjunto de
entidades), relacionamento (conjunto de relacionamentos) e atributo (Figura 3). Várias
extensões ao modelo ER foram propostas na literatura [ElWH85, TeYF86, SmSm77, GoHo91,
ScSW79, SaNF79, ElNa94], com o objetivo de enriquecer o modelo, com novos conceitos de
abstrações.
Uma entidade é uma representação abstrata de um objeto do mundo real, que possui uma
existência independente e sobre a qual se deseja guardar e recuperar informações. Pode ser
algo concreto como uma pessoa ou abstrato como um cargo. Uma entidade que tem sua
existência dependente de outra é chamada de entidade fraca.
Um relacionamento é uma associação entre duas ou mais entidades. No caso de
relacionamentos binários, estes podem ter sua cardinalidade expressa por 1:1, 1:N, N:1 ou
M:N, indicando o número de vezes que uma entidade pode participar do relacionamento.
Um atributo é uma propriedade que descreve uma entidade ou um relacionamento. Um
atributo identificador, identifica unicamente uma entidade.
O modelo ER possui uma notação gráfica muito simples e poderosa e que por isso mesmo,
tem sido largamente utilizada. A Figura 3 apresenta a notação gráfica do modelo ER.

Nome da Entidade Relacionamento

Nome da Entidade Atributo Atributo descritor


Nome da entidade
Fraca

1 0,N
Quadra Possui Lote

Figura 3 – Construtores Básicos do Modelo ER

“Devido à sua simplicidade de representação e facilidade de aprendizado, tem sido o modelo


de maior sucesso como ferramenta de comunicação entre o projetista de banco de dados e o

Bancos de Dados Geográficos 3-6


Modelagem de Dados Geográficos

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

Bancos de Dados Geográficos 3-7


Modelagem de Dados Geográficos

seus delimitadores. Desta forma, o esquema permite a representação de todos os componentes


do modelo IFO.
O modelo IFO representa os dois tipos de relacionamentos “é_um” (is a): generalização e
especialização. A notação do modelo se encontra na Figura 17.

LIVRE ABSTRATO IMPRIMÍVEL

TIPOS BÁSICOS DE OBJETOS

CLASSE LOCALIZAÇÃO ESTUDANTE

GRADE

ESTUDANTE NÚMERO DA NOME DA RUA


CASA

AGRUPAMENTO AGREGAÇÃO FRAGMENTO SIMPLES

Figura 4 – Notação do Modelo IFO

Rumbaugh et al. [RBPE91] propuseram um método de projeto orientado a objetos chamado


Técnica de Modelagem de Objetos (Object Modeling Technique - OMT). Ele é dividido em
três fases: análise, projeto e implementação. Como a fase de análise se ocupa da modelagem
do mundo real, apenas ela será referenciada nesta seção.

Bancos de Dados Geográficos 3-8


Modelagem de Dados Geográficos

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].

Um objeto é uma abstração que representa elementos do universo de discurso da aplicação,


que podem ser reais como uma pessoa ou abstratos como uma conferência. Cada objeto possui
uma identidade que o distingue pela sua própria existência e não pelas propriedades
descritivas que ele possa ter. Uma classe de objetos descreve um conjunto de objetos com
atributos comuns, o mesmo comportamento (operações) e a mesma semântica. As classes são
representadas graficamente por retângulos divididos em três partes contendo o nome da classe
na parte superior, a lista de atributos na parte do meio e a lista de operações na parte inferior
(ver Figura 5). Atributos são propriedades dos objetos na classe podendo ser básicos ou
derivados. Atributos derivados são calculados a partir de outros atributos. A apresentação dos
atributos é opcional em diagramas. Uma operação é uma ação que pode ser aplicada a um
objeto, isto é, é uma função ou transformação sobre o objeto. Cada operação pode possuir
uma lista de argumentos, que é uma seqüência de atributos e suas respectivas classes, e
opcionalmente, podem retornar um valor de um certo tipo de dado como resultado.
O relacionamento entre objetos e classes é feito através de ligações e associações. Uma
instância de associação é chamada de ligação de objetos. Cada associação é referenciada pelo
seu nome. O número de classes participantes na associação define seu grau. Usam-se papéis
em associações para qualificar a participação de cada classe relacionada. Eles são obrigatórios
para associações onde uma classe participa mais de uma vez. As associações podem ser
binárias (grau 2), ternárias (grau 3) ou de maior ordem. A notação utilizada para representar a
cardinalidade se encontra na Figura 5.
Uma generalização é um relacionamento entre classes que produz uma hierarquia: uma ou
mais de classes generalizam-se em uma classe de nível mais alto. As classes de nível mais
baixo são chamadas de subclasses e a classe de nível mais alto é chamada superclasse. A
herança é o mecanismo de compartilhamento de características utilizando o relacionamento
de generalização. As subclasses herdam os atributos, operações, associações e agregações de
sua superclasse. Cada subclasse pode acrescentar suas próprias características. Não existe
distinção entre generalização e especialização já que são dois diferentes pontos de vista do
mesmo relacionamento. Na especialização as subclasses refinam ou especializam a
superclasse. Cada generalização pode ter um discriminador associado, indicando qual
propriedade está sendo abstraída pelo relacionamento de generalização. Uma generalização
pode ser disjunta ou sobreposta. A generalização é disjunta quando uma instância de uma
superclasse é membro de uma e somente uma das subclasses. Ela será sobreposta quando uma
instância da superclasse for membro de uma ou mais subclasses.

Bancos de Dados Geográficos 3-9


Modelagem de Dados Geográficos

A agregação é um modo de associação onde um objeto agregado é feito de objetos


componentes. A agregação é também chamada de relacionamento “parte_de”. A notação dos
principais construtores gráficos usados no OMT encontram-se na Figura 5. Uma descrição
completa do modelo pode ser obtida em [RBPE91, Rumb96].

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

Parte1-Classe Parte2-Classe Subclasse-1 Subclasse-2

Figura 5 – Construtores Mais Comuns do Modelo OMT

Bancos de Dados Geográficos 3-10


Modelagem de Dados Geográficos

! " #$ $ "

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].

Bancos de Dados Geográficos 3-11


Modelagem de Dados Geográficos

n,m n,m
Nome Classe Nome Classe
Atributos Atributos
Nome do Assunto

n,m n,m
Serviços Serviços

ASSUNTO CLASSE CONCRETA CLASSE ABSTRATA


(CLASSE-&-OBJETO)

Generalização Todo Classe 1

0,N 0,N

1 0,M

Especialização Parte Classe 2

ESTRUTURA DE GENERALIZAÇÃO/ ESTRUTURA TODO -PARTE CONEXÃO DE INSTÂNCIA


ESPECIALIZAÇÃO (AGREGAÇÃO)

Figura 6 – Principais Construtores do Modelo OOA

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

Bancos de Dados Geográficos 3-12


Modelagem de Dados Geográficos

melhor as aplicações geográficas. No entanto, antes de adotar qualquer um deles, convém


observar os níveis de abstração dos dados geográficos, os requisitos de um modelo de dados
geográficos e finalmente, se o que se pretende modelar poderá ser claramente representado no
modelo escolhido.

% &' $ " $ ! () * $ + !, - $

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.

• Nível conceitual - Oferece um conjunto de conceitos formais para modelar as entidades


geográficas, em um alto nível de abstração. Este nível determina as classes básicas
(contínuas e discretas) que serão criadas no banco de dados.

• Nível de representação - As entidades formais definidas no nível conceitual (classes de


campos e objetos) são associadas às classes de representação espacial. As diferentes
representações geométricas podem variar conforme a escala, a projeção cartográfica
escolhida ou a visão do usuário. O nível de representação não tem correspondente na
metodologia tradicional de banco de dados já que aplicações convencionais raramente
lidam com o problema de múltipla representação.

• Nível de implementação - Define padrões, formas de armazenamento e estruturas de


dados para implementar cada tipo de representação.
Para Lisboa [Lisb97], essa divisão em níveis torna evidente que a dicotomia entre visão de
campos e objetos é considerada nos níveis conceitual e de representação, e a dicotomia entre
estruturas vetorias e matriciais é uma questão inerente ao nível de implementação. Encontra-
se em [Lisb97] uma comparação entre os níveis de especificação de aplicações geográficas e
as etapas de projeto de banco de dados (conceitual, lógico e físico). Para Lisboa, a
comparação leva a compreender que cada etapa do projeto de um banco de dados geográfico é
mais complexa que as respectivas etapas do projeto de um banco de dados convencional.

Bancos de Dados Geográficos 3-13


Modelagem de Dados Geográficos

Figura 7 – Níveis de especificação de aplicações geográficas

$ $ * $ + !, - $

Considerando os fatores associados à representação da realidade geográfica e, com base na


experiência de modelagem de aplicações geográficas de Belo Horizonte e nos trabalhos de
[OlPM97, KöPS96, BCMM96, Lisb97, BoFo96, PeBS97, CaBe93, SCGL97, CFSC94], relacionamos a
seguir um conjunto de requisitos necessários a um modelo de dados voltado para aplicações
geográficas.
Um modelo de dados para aplicações geográficas deve:

• fornecer um alto nível de abstração;

• representar e diferenciar os diversos tipos de dados envolvidos nas aplicações geográficas,


tais como ponto, linha, área, imagem, etc.;
• representar tanto as relações espaciais e suas propriedades como também as associações
simples e de rede;
• ser capaz de especificar regras de integridade espacial;
• ser independente de implementação;
• suportar classes georreferenciadas e classes convencionais, assim como os
relacionamentos entre elas;

Bancos de Dados Geográficos 3-14


Modelagem de Dados Geográficos

• 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.

& ' !

Observando os aspectos considerados quanto à complexidade das aplicações geográficas e os


requisitos desejáveis para um modelo de dados geográfico foi proposto o modelo Geo-OMT.
Nele estão agrupados de forma unificada as primitivas geográficas propostas por diversos
autores [KÖPS96, PeBS97, BCMM96, OlPM97, CaBe93, SCGL97, KaCh95, AbCa94, Cama95,
CCHM96], além de introduzir novas primitivas que suprem algumas deficiências percebidas,
como por exemplo, a representação de múltiplas visões das entidades geográficas. A opção de
estender o modelo de objetos OMT [RBPE91], se deu devido à sua capacidade de representar
os aspectos semânticos de uma aplicação, em função de adotar a abordagem de orientação a
objetos e, também, devido ao seu amplo uso na modelagem de aplicações geográficas [LiIo96,
AbCa94, TiSa94, BCMM96, OlPM97, Benn96, Reno97].

A partir das primitivas do modelo OMT convencional, foram introduzidas primitivas


geográficas que aumentam sua capacidade semântica, diminuindo a distância entre o modelo
mental do espaço a ser modelado e o modelo de representação normalmente utilizado.
Destacam-se no modelo a sua expressividade gráfica e a sua capacidade de representação, já
que considerações textuais são substituídas por relacionamentos explícitos (ver seção 1.8.5),
representando a dinâmica de interação entre os vários objetos de natureza espacial ou não.
Conforme [Nava92], a idéia fundamental ao se estender um modelo de dados é enriquecê-lo,
de maneira a torná-lo capaz de suportar novos conceitos de abstração.

. ! !&$ $ +

O modelo Geo-OMT apresenta as seguintes características:

• segue o paradigma de orientação a objetos suportando os conceitos de classe, herança,


objeto complexo e método;

Bancos de Dados Geográficos 3-15


Modelagem de Dados Geográficos

• representa e diferencia os diversos tipos de dados envolvidos nas aplicações geográficas,


fazendo uso de uma representação simbólica que possibilita a percepção imediata da
natureza do dado, eliminando assim, a extensa classe de hierarquias utilizada para
representar a geometria e a topologia dos objetos espaciais;
• fornece uma visão integrada do espaço modelado, representando e diferenciando classes
com representação gráfica (georreferenciadas) e classes convencionais (não-espaciais),
assim como os diferentes tipos de relacionamento entre elas;
• caracteriza as classes em contínuas e discretas, utilizando os conceitos de “visão de
campos” e “visão de objetos” introduzidos por Goodchild [FrGo90, Good92];
• representa a dinâmica da interação entre os vários objetos, explicitando tanto as relações
espaciais como as associações simples;
• representa as estruturas topológicas “todo-parte” e de rede;
• formaliza as possíveis relações espaciais, levando em consideração a forma geométrica da
classe;
• traduz as relações topológicas e espaciais em restrições de integridade espaciais;
• representa os diversos fenômenos geográficos, utilizando conceitos natos que o ser
humano tem sobre dados espaciais;
• possibilita a representação de múltiplas visões de uma mesma classe geográfica, tanto
baseada em variações de escala, quanto nas várias formas de se perceber o mesmo objeto
no mundo real;
• é de fácil visualização e entendimento, pois utiliza basicamente os mesmos tipos
construtores definidos no modelo OMT;
• não utiliza o conceito de camadas e sim o de níveis de informação (temas), não limitando
o aparecimento de uma classe geográfica em apenas um nível de informação;

• é 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.

. $$ $ / ,$ $

O modelo Geo-OMT trabalha no nível conceitual/representação e suas classes básicas são:


Classes Georreferenciadas e Classes Convencionais (Figura 18). Através dessas classes são
representados os três grandes grupos de dados (contínuos, discretos e não-espaciais)
encontrados nas aplicações geográficas, proporcionando assim, uma visão integrada do espaço
modelado, o que é muito importante na modelagem principalmente de ambientes urbanos.

Bancos de Dados Geográficos 3-16


Modelagem de Dados Geográficos

Uma Classe Georreferenciada descreve um conjunto de objetos que possuem representação


espacial e estão associados a regiões da superfície da terra [Cama95], representando a visão de
campos e de objetos proposta por Goodchild [FrGo90, Good92].
Uma Classe Convencional descreve um conjunto de objetos com propriedades,
comportamento, relacionamentos, e semântica semelhantes, e que possuem alguma relação
com os objetos espaciais, mas que não possuem propriedades geométricas. Um exemplo desse
tipo de classe é a que define os proprietários de imóveis cadastrados para fins de tributação
(IPTU), e que possuem relação de propriedade com os lotes e edificações presentes no banco
de dados geográfico.

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

LINHA UNI- LINHA BI-


POLÍGONO PONTO LINHA NÓ
DIRECIONADA DIRECIONADA

Figura 18- Meta Modelo Parcial do Modelo Geo-OMT

A distinção entre classes convencionais e classes georreferenciadas permite que diferentes


aplicações possam compartilhar dados não-espaciais, auxiliando no desenvolvimento dessas
aplicações e na reutilização dos dados [OlPM97].
Tanto as classes georreferenciadas como as classes convencionais podem ser especializadas,
utilizando o conceito de herança da orientação a objetos. O modelo Geo-OMT formaliza a
especialização das Classes Georreferenciadas em classes do tipo Geo-Campo e Geo-Objeto.
As classes do tipo Geo-Campo representam objetos distribuídos continuamente pelo espaço,
correspondendo a grandezas como tipo de solo, topografia e teor de minerais [Cama95].
As classes do tipo Geo-Objeto representam objetos geográficos individualizáveis, que
possuem identificação com elementos do mundo real, como lotes, rios e postes. Esses objetos

Bancos de Dados Geográficos 3-17


Modelagem de Dados Geográficos

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

Ponto Linha Polígono

Figura 19 - Pictogramas da Classe Geo-Objeto

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.

Bancos de Dados Geográficos 3-18


Modelagem de Dados Geográficos

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.

0...1 1...* 1...* 2


Trecho de Rua Segmento Vértice

Trecho
de Rua 2...* 2
Segmento Vértice
Atributos Gráficos

Atributos 3...*
Operações

Quadra

0...1 Atributos Gráficos

Atributos
Quadra
Operações

Figura 20 – Exemplo de Simplificação por Substituição Simbólica

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

Bancos de Dados Geográficos 3-19


Modelagem de Dados Geográficos

A notação gráfica utilizada para Classes Convencionais corresponde à notação usada no


modelo OMT [RBPE91, Rumb96]. Uma classe é representada graficamente por um retângulo
subdividido em três partes contendo, respectivamente, o nome da classe, a lista dos atributos
alfanuméricos e a lista das operações que são aplicadas à classe. A forma simplificada
utilizada é o retângulo contendo apenas o nome da classe (Figura 20b).

Classe Convencional

Nome da Classe

Classe Georreferenciada Atributos


Nome da classe
Operações

Nome
Nome Classe da Classe
Representação
Atributos Gráficos
Simplificada
Atributos

Representação Operações
Simplificada
b)

a)

Figura 20 - Notação Gráfica das Classes Básicas

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

Por representar a distribuição espacial contínua de um fenômeno geográfico sobre o espaço,


qualquer posição no espaço geográfico considerado deverá corresponder a algum valor da
variável representada, obedecendo ao princípio do “planar enforcement” [Good92] (restrição
de preenchimento do plano).

Bancos de Dados Geográficos 3-20


Modelagem de Dados Geográficos

Um exemplo de Geo-Campo são as curvas de nível. Qualquer ponto na superfície modelada


possui uma cota. Enfocando não só o aspecto ambiental, mas também o urbano, um outro
exemplo são as subdivisões territoriais que abrangem todo um município (Figura 21).

Figura 21 – Administrações Regionais de Belo Horizonte

O modelo Geo-OMT possui cinco classes do tipo Geo-Campo: Isolinhas, Polígonos


Adjacentes, Tessselação, Amostragem e Rede Triangular Irregular. Cada uma dessas classes
possui um padrão simbólico de representação (Figura 22).
De acordo com os níveis de especificação de aplicações geográficas, a especialização da
classe Geo-Campo corresponde ao nível de representação.

Rede Triangular Polígonos


Irregular Isolinha Adjacentes Tesselação Amostragem

Nome Nome Nome Nome Nome


da Classe da Classe da Classe da Classe da Classe
Atributos Gráficos Atributos Gráficos Atributos Gráficos Atributos Gráficos Atributos Gráficos

Atributos Atributos Atributos Atributos Atributos

Operações Operações Operações Operações Operações

Ex: TIN Ex: Curvas de Ex: Divisão de Ex: Imagem de Ex: Pontos
Nível Bairros Satélite Cotados

Figura 22 – Geo-Campos

As subclasses da classe Geo-Campo são as seguintes:

Bancos de Dados Geográficos 3-21


Modelagem de Dados Geográficos

• Subclasse Amostragem - Representa uma coleção de pontos regular ou irregularmente


distribuídos por todo o espaço geográfico. Exemplo: estações de medição de temperatura,
modelos numéricos de terreno ou pontos cotados em levantamentos altimétricos de áreas
urbanas (Figura 22).
• Subclasse Isolinhas - Representa uma coleção de linhas fechadas que não se cruzam nem
se tocam (aninhadas). Cada instância da subclasse contém um valor associado. Exemplo:
curvas de nível, curvas de temperatura e curvas de ruído. Deve-se observar que o fechamento
das isolinhas sempre ocorrerá quando se considera o espaço geográfico como um todo, no
entanto, na área em que se está modelando isto poderá não ocorrer (Figura 22).
• Subclasse Polígonos Adjacentes - Representa o conjunto de subdivisões de todo o
domínio espacial em regiões simples que não se sobrepõem e que cobrem completamente este
domínio. Exemplo: tipos de solo, divisão de bairros, divisões administrativas e divisões
temáticas (Figura 22).
• Subclasse Tesselação - Representa o conjunto das subdivisões de todo o domínio espacial
em células regulares que não se sobrepõem e que cobrem completamente este domínio.
Cada célula possui um único valor para todas as posições dentro dela. Exemplo: imagem
de satélite (Figura 22).
• Subclasse Rede triangular Irregular - representa o conjunto de grades triangulares de
pontos que cobrem todo o domínio espacial. Um exemplo de rede triangular irregular é visto
em modelagem de terreno (TIN - rede irregular triangularizada.) (Figura 22)

Classes do tipo Geo-Objeto: Geo-Objeto com Geometria e Geo-Objeto com Geometria e


Topologia. Cada uma dessas classes possui um padrão simbólico de representação
representado na figura 23.
Uma classe do tipo Geo-Objeto com Geometria representa objetos que possuem apenas
propriedades geométricas (Ponto, Linha e Polígono) e é especializada em classes do tipo
Ponto, Linha e Polígono. Exemplos desta classe são, respectivamente, ponto de ônibus, trecho
de logradouro e quadras.
Uma classe do tipo Geo-Objeto com Geometria e Topologia representa objetos que possuem,
além das propriedades geométricas, propriedades topológicas de conectividade, sendo
representados por nós e segmentos orientados. É especializada em classes do tipo Nó, Linha
Uni-direcionada e Linha Bi-direcionada. Exemplos desta classe são as redes de malha viária,
de água e esgoto. Os segmentos orientados traduzem o sentido do fluxo da rede, se uni-
direcional ou bi-direcional, dando mais semântica à representação. “Alguns tipos de
aplicações (ex.: rede de água, redes viárias, cadastro urbano, etc.) possuem características,
onde os relacionamentos do tipo conectividade e adjacência são fundamentais. Alguns SIGs

Bancos de Dados Geográficos 3-22


Modelagem de Dados Geográficos

oferecem suporte ao armazenamento desses tipos de relacionamentos, porém, no nível


conceitual é importante que o projetista consiga representá-los” [LiIo96].

GEO-OBJETO com geometria GEO-OBJETO com geometria e topologia


LINHA LINHA
LINHA PONTO POLÍGONO UNI-DIRECIONADA BI-DIRECIONADA NÓ
Nome Nome Nome Nome Nome Nome
da Classe da Classe da Classe da Classe da Classe da Classe
Atributos Gráficos Atributos Gráficos Atributos Gráficos Atributos Gráficos Atributos Gráficos Atributos Gráficos

Atributos Atributos Atributos Atributos Atributos Atributos

Operações Operações Operações Operações Operações Operações

Ex: Muro Ex: Árvore Ex: Lote Ex: Trecho rede Ex: Trecho rede Ex:Poço de Visita
de esgoto de água

Figura 23- Geo-Objetos

As subclasses da classe Geo-Objetos são as seguintes:


• Subclasse Polígono - representa objetos de área, podendo aparecer conectada, como lotes
dentro de uma quadra, ou isolado, como a representação de uma ilha (Figura 23).
• Subclasse Ponto - representa objetos pontuais, que possuem um único par de coordenadas
(x, y). Na representação do mobiliário urbano é freqüente o uso de símbolos, como por
exemplo na representação de postes, orelhão, hidrante, etc (Figura 23).
• Subclasse Linha - representa objetos lineares sem exigência de conectividade. Como
exemplo podemos citar a representação de muros, cercas e meio-fios (Figura 23).
• Subclasse Nó - representa os objetos pontuais no fim de uma linha, ou os objetos pontuais
nos quais as linhas se cruzam (nó do grafo). Possui a propriedade de conectividade, garantindo
a conexão com a linha. Exemplos de nó podem ser vistos na modelagem de redes. Por
exemplo, o poço de visita na rede de esgoto ou o cruzamento (interseção de vias) na malha
viária (Figura 23).
• Subclasse Linha Uni-direcionada - representa objetos lineares que começam e terminam
em um nó e que possuem uma direção (arco do grafo orientado). Cada linha deve estar
conectada a dois nós ou a outra linha uni-direcionada. Como exemplo podemos citar trechos
de uma rede de esgoto, que indicam a direção do fluxo da rede (Figura 23).
• Subclasse Linha Bi-direcionada - representa objetos lineares que começam e terminam em
um nó e que são bi-direcionados. Cada linha bi-direcionada deve estar conectada a dois nós ou
a outra linha bi-direcionada. Como exemplo podemos citar trechos de uma rede de água, onde
a direção do fluxo pode ser nos dois sentidos dependendo do controle estabelecido (Figura
23).

Bancos de Dados Geográficos 3-23


Modelagem de Dados Geográficos

As instâncias da classe Geo-Objeto não obedecem ao princípio do “planar enforcement”


[Good92], podendo estar disjuntas no espaço ou ocupando o mesmo lugar, como é o caso de
um poste com um semáforo de pedestre e uma placa de sinalização.
A Figura 24 exemplifica o uso da notação gráfica de classes do tipo Georreferenciadas e
Convencionais. O esquema mostra parte de uma aplicação de transporte coletivo, onde a
classe Divisa Municipal estabelece o espaço modelado. A classe Linha de Ônibus se relaciona
com a classe Ponto de Ônibus. Cada Ponto de Ônibus é localizado em frente a um endereço de
imóvel podendo estar próximo ou dentro de um local de referência da cidade. Pela notação
utilizada, fica explícito que a Linha de Ônibus é uma classe convencional, o Ponto de Ônibus
e o endereço são classes de Geo-Objetos do tipo Ponto e a Área de Referência é uma Classe
de Geo-Objeto do tipo Polígono. A Classe Divisa Municipal é um Geo-Campo do tipo
Polígono Adjacente.

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

Bancos de Dados Geográficos 3-24


Modelagem de Dados Geográficos

Figura 24 – Exemplo de Classes do Tipo Geo-Objeto

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

Bancos de Dados Geográficos 3-25


Modelagem de Dados Geográficos

Nome Classe Nome da relação Nome Classe Nome da relação

a) Associação Simples b) Relacionamento Espacial

Nome Classe

c) Hierarquia Espacial

Nome Classe Nome Classe Nome Classe


nome da rede

nome da rede

d) Relacionamento em Rede

Figura 25 – Relacionamentos

Curva de nível Lote

Figura 26 – Relação entre Geo-Campo e Geo-Objeto

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

Bancos de Dados Geográficos 3-26


Modelagem de Dados Geográficos

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.

Bancos de Dados Geográficos 3-27


Modelagem de Dados Geográficos

• Coincide - Utilizado no sentido de igual. Duas instâncias de classes diferentes que


possuem o mesmo tamanho, a mesma natureza geométrica e ocupam o mesmo lugar no
espaço. Essa relação é um caso particular do sobre/sob.
• Cruza - Existe apenas um ponto P (x,y) comum entre as instâncias.
• Atravessa - Uma instância atravessa integralmente outra instância, tendo no mínimo dois
pontos P1 (x1,y1) e P2 (x2,y2) em comum. Este é um caso particular de cruza, que foi separado
por fornecer maior expressão semântica.
• Em frente a - utilizado para dar ênfase à posição de uma instância em relação à outra. Uma
instância está “de face” para outra. Paralelo a poderá ser usado na relação entre linhas, por ser
semanticamente mais significativo.
• À esquerda / à direita - Utilizado para dar ênfase na lateralidade entre as instâncias. No
entanto, a questão de lateralidade deve estar bem definida nas aplicações no SIG, de forma a
ser possível formalizar o que é lado direito e esquerdo.
Algumas relações só são possíveis entre determinadas classes, pois são dependentes da forma
geométrica. Por exemplo, a existência da relação dentro de pressupõe que uma das classes
relacionadas seja um polígono. Neste aspecto, as aplicações tradicionais diferem das
geográficas, onde as associação entre classes convencionais independem de fatores como
forma geométrica. Este é um dos pontos onde a modelagem tradicional difere da modelagem
de dados geográficos. Ao se modelar uma aplicação geográfica, as formas de representação
das entidades geográficas normalmente já serão conhecidas, visto que existe uma
interdependência entre a natureza da representação, o tipo de interpretação e a finalidade que
será dada a cada entidade geográfica. No modelo Geo-OMT isto é considerado para que sejam
estabelecidas as relações que envolvem classes Georreferenciadas. Neste aspecto, o Geo-
OMT atua também no nível de representação.
A Figura 28 exemplifica as possíveis relações espaciais entre as Classes Georreferenciadas. É
apresentado um conjunto mínimo de relações. Outras podem ser derivadas de combinações
das relações já existentes, como também acrescentadas. Concentramos na expressividade
semântica de cada palavra, tentando aproximar ao máximo, o nome das relações à linguagem
natural. A formalização tem por objetivo auxiliar os analistas de sistemas no projeto da
aplicação e facilitar a interpretação do esquema da aplicação por parte dos usuários, uma vez
que o significado semântico de cada nome de relação será conhecido. Deve-se evitar traduções
entre uma linguagem formal e uma natural. Através da formalização são fornecidos quais são
as relações possíveis entre Geo-Objetos e Geo-Campos. As relações à esquerda de e à direita
de, não foram consideradas nas tabelas da Figura 28 por serem possíveis em qualquer
combinação. A relação entre polígonos está exemplificada na Figura 27
.

Bancos de Dados Geográficos 3-28


Modelagem de Dados Geográficos

Disjunto Contém Dentro Iqual Encontram Cobre Coberto por Sobreposição

Figura 27 – Relacionamentos Espaciais entre Polígonos

LINHA / LINHA LINHA / PONTO


A B A
Disjunto Disjunto
Toca Toca/ Adjacente
Cruza d
Perto de
A,B
Coincidente Sobre
Acima/ Abaixo Acima/ Abaixo
Adjacente
d
Perto de
Entre PONTO/POLÍGONO
Paralelo a d
Disjunto B

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

Em frente a Acima/ Abaixo


Toca Em frente a

Figura 28 – Relacionamentos Espaciais

Os relacionamentos são caracterizados pela cardinalidade. A cardinalidade representa o


número de instâncias de uma classe que pode estar associadas a uma instância da outra classe.
A notação de cardinalidade adotada pelo modelo Geo-OMT é a utilizada na Unified Modeling

Bancos de Dados Geográficos 3-29


Modelagem de Dados Geográficos

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

As relações em rede e hierarquia espacial já trazem incorporado em seu significado a sua


cardinalidade, não sendo portanto necessário explicitá-la.

2 + ! 3 () $0 3 ()

A generalização é o processo de definir classes mais genéricas (superclasses) a partir de


classes com características semelhantes (subclasses). Já a especialização é o processo inverso,
classes mais específicas são detalhadas a partir de classes genéricas, adicionando-se novas
propriedades na forma de atributos [Lisb97]. Cada subclasse herda atributos, operações e
associações da superclasse.
No modelo Geo-OMT, as abstrações de generalização e especialização se aplicam tanto a
Classes Georreferenciadas como a Classes Convencionais, seguindo a definição e a notação
do modelo OMT, onde um triângulo interliga uma superclasse à suas subclasses. (Figura 30).
Cada generalização pode ter um discriminador associado, indicando qual propriedade está
sendo abstraída pelo relacionamento de generalização.
No entanto, se as propriedades gráficas (por exemplo, cor, tipo de linha, etc.) variarem nas
subclasses, é utilizada a generalização espacial, onde as subclasses herdam a natureza gráfica
da superclasse mas variam suas propriedades gráficas. Esse tipo de generalização é útil para
registrar que deve existir uma distinção visual entre as subclasses, que não pode ser
desconsiderada na implementação. A notação utilizada na generalização espacial só varia no

Bancos de Dados Geográficos 3-30


Modelagem de Dados Geográficos

tipo de linha utilizada na ligação entre a superclasse e as subclasses. A linha contínua é


substituída pela pontilhada (Figura 30).

Lote Unid.Ambiental
Nome da
Classe

Edificado Não Edificado Parque Reservas


Nome da Nome da Hachura = verde Hachura = amarela
Subclasse Subclasse

Notação OMT Generalização Generalização Espacial

Figura 30 – Generalização

No exemplo da Figura 30 temos a especialização de um lote em lote edificado e lote não


edificado. Fica claro pela notação que não existirá diferença de visualização entre os dois
tipos de lote no entanto, a unidade ambiental especializada em parque e reservas apresentará
um método que a distinguirá visualmente do parque. No referido exemplo, quando a classe
unidade ambiental for reserva, a visualização apresentará uma hachura amarela.
Uma generalização (espacial ou não) pode ser especificada como total ou parcial [LaFl94].
Uma generalização é total quando a união de todas as instâncias das subclasses equivalem ao
conjunto de instâncias da superclasse. A totalidade é representada por um ponto no ápice do
triângulo (Figura 31).

O triângulo vazado representa a restrição de disjunção, e o triângulo com preenchimento


indica a sobreposição de subclasses. A combinação de disjunção e totalidade representa quatro
tipos de restrição. Normalmente, uma generalização é total e disjunta, já que a superclasse é o
resultado da união de subclasses disjuntas. O mesmo não pode ser dito da especialização, que
permite que instâncias da superclasse possam ou não existir nas subclasses.

SuperClasse SuperClasse

SubClasse SubClasse SubClasse SubClasse

Disjunto/Parcial Sobreposta/Parcial

Bancos de Dados Geográficos 3-31


Modelagem de Dados Geográficos

SuperClasse SuperClasse

SubClasse SubClasse SubClasse SubClasse

Disjunto / Total Sobreposta / Total

Figura 31 – Generalização Espacial

Traffic Sign Economic Activity School Terminal

Bus Stop Parking Commerce Industry Public Private Subway Bus

Disjoint/Partial Superimposed/ Partial Disjoint/Total Superimposed/Total

Figura 31a– Exemplo de Generalização Espacial

A Figura 32 mostra o exemplo de uma generalização espacial disjunta e total do nó de uma


rede fluvial. Ele é especializado em estação fluviométrica, usina hidrelétrica e confluência.
Cada nó terá uma representação simbólica diferente. A Figura 32a mostra o nó da rede fluvial
com a especialização espacial, e a Figura 32b substituiu o pictograma padrão que representa
nó de rede , pelo símbolo real que este nó assumirá no banco de dados geográfico. A
indicação de total mostra que o nó deverá assumir uma das três formas (estação fluviométrica,
usina hidrelétrica e confluência) não existindo nenhum outro tipo de nó fluvial além dos
especificados. A indicação de disjunta indica que um nó só poderá assumir um tipo por vez
ou seja, não poderá ser usina hidrelétrica e confluência ao mesmo tempo.

Bancos de Dados Geográficos 3-32


Modelagem de Dados Geográficos

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ó

Estação Usina Hidrelétrica Confluência Estação Usina Hidrelétrica Confluência


Fluviométrica Fluviométrica
Ponto (x, y) Ponto (x, y) Ponto (x, y) Ponto (x, y) Ponto (x, y) Ponto (x, y)
Símbolo = ESTAÇÃO Símbolo = USINA Símbolo = CONFL Símbolo = ESTAÇÃO Símbolo = USINA Símbolo = CONFL
Rotação (Indica margem) Rotação (eixo do rio) Rotação (0) Rotação (Indica margem) Rotação (eixo do rio) Rotação (0)
Ident. Estação Ident. Usina Ident. Estação Ident. Usina
Nome EstaçÃo Nome Usina Nome EstaçÃo Nome Usina
Rotacionar Rotacionar Rotacionar Rotacionar

a) Generalização Espacial b) Generalização Espacial com Símbolo Real

Figura 32 - Generalização Espacial do Nó da Rede Fluvial

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)

Figura 33 – Notação Gráfica Agregação

A Figura 34 exemplifica o uso desta notação. No exemplo, o logradouro é uma agregação de


trechos de logradouro. Se o logradouro existir geograficamente a partir da junção de trechos,
como uma única linha, ele será uma agregação entre Classes Georreferenciadas (agregação
espacial, seção 1.8.8). No entanto, se o logradouro não for representado graficamente,
representando só o cadastro de logradouros, ele será uma agregação entre uma Classe
Convencional e uma Classe Georreferenciada. Neste caso, a visualização do Logradouro
deverá ser feita através dos trechos.

Bancos de Dados Geográficos 3-33


Modelagem de Dados Geográficos

Trecho
Logradouro

Figura 34 – Exemplo de Agregação

5 " ! () $0

A agregação espacial é um caso especial de agregação onde são explicitados relacionamentos


topológicos “todo-parte” [KöPS96, KöPS95, AbCa94].
A utilização desse tipo de agregação impõe restrições de integridade espacial no que diz
respeito à existência do objeto agregado e dos sub-objetos. Além do modelo ganhar mais
clareza e expressividade, a observação dessas regras contribui para a manutenção da
integridade semântica do banco de dados geográfico. Muitos erros no processo de entrada de
dados podem ser evitados, se procedimentos baseados nessas restrições forem implementados.
A estrutura topológica “todo-parte” foi subdividida em: subdivisão espacial, união espacial e
contém. A notação das três estruturas é apresentada na Figura 35.
Na estrutura subdivisão espacial, o todo é subdividido em partes de mesma natureza
geométrica e a geometria do todo é coberta pela geometria das partes (por exemplo, a quadra é
subdividida em lotes. Para existir um lote, a quadra já deve existir (Figura 35).
A estrutura união espacial é o inverso da subdivisão espacial. O todo é formado a partir da
união das partes. A diferença entre elas está na origem da geometria do todo (por exemplo,
uma quadra é uma união lotes. A quadra não existe sem os lotes existirem primeiro. Figura
35).
Na estrutura contém, a geometria do todo contém a geometria da partes. Objetos de natureza
geométrica diferentes podem estar contidos no todo (por exemplo, edificações dentro de um
lote. Figura 35).

Bancos de Dados Geográficos 3-34


Modelagem de Dados Geográficos

Subdivisão espacial Classe


(subdividido em)

Classe
União espacial U
(união de)

Classe
Contém C

Quadra Quadra Lote

U C

Lote Lote Edificação

Figura 35 – Agregação Espacial

6 + ! 3 () . ! !, -

A generalização3 pode ser vista como uma série de transformações em algumas


representações das informações espaciais, com o objetivo de melhorar a legibilidade e
compreensão dos dados. Por exemplo, “uma entidade geográfica pode ter diversas
representações espaciais conforme a escala utilizada. Uma cidade pode ser representada por
um ponto num mapa de escala pequena e por um polígono num mapa de escala grande”
[MeBo96]. Este tipo de mudança na representação cartográfica é chamado de generalização e
está relacionado com a representação gráfica.
No entanto, além do apresentado acima, o que se percebe no desenvolvimento de aplicações
geográficas, principalmente em áreas urbanas, é que de acordo com a visão do usuário é
necessário que formas distintas representem a mesma entidade geográfica, em uma mesma
escala e ao mesmo tempo. Dentro da orientação a objetos, este conceito é naturalmente

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].

Bancos de Dados Geográficos 3-35


Modelagem de Dados Geográficos

entendido e representado. O objeto geográfico representado é o mesmo, com os atributos


alfanuméricos comuns, porém variando as características geográficas. Podemos exemplificar
esta colocação tomando como exemplo o sistema de informação geográfica da Prefeitura de
Belo Horizonte, onde o ambiente geográfico deve ser compartilhado por diversos órgãos e por
diversos tipos de aplicações. Para a Secretaria de Turismo, a localização de pontos turísticos é
feita através de símbolos que, distribuídos pela cidade, identificam os locais turísticos. No
entanto, muitos locais turísticos são referências da cidade, sendo utilizados para localização de
ponto de ônibus “mais próximo” na aplicação de transporte coletivo. Se a aplicação próximo
a, fosse levar em conta apenas a localização dos símbolos turísticos para efetivar sua consulta,
o estádio de futebol Mineirão, que tem o seu símbolo no meio do campo de futebol, estaria
longe de qualquer ponto de ônibus. Dentro do ponto de vista de proximidade, as referências
utilizadas são transformadas em polígonos que envolvem a área referenciada. Em termos do
modelo conceitual, tanto o símbolo de turismo quanto a área que envolve o Mineirão
representam o mesmo objeto, devendo por isto estar explicitamente demonstrado no esquema
da aplicação. Existe ainda a possibilidade da representação fotográfica do símbolo turístico.
Neste caso, teremos três formas de visualizar o mesmo objeto.
Para que fosse possível explicitar os dois casos apresentados acima, o modelo Geo-OMT
utiliza a primitiva espacial chamada de Generalização Cartográfica representando uma classe
(superclasse) que é percebida por diferentes visões, que alteram a sua natureza gráfica. A
superclasse não tem representação gráfica, as subclasses possuem representação gráfica e
herdam os atributos alfanuméricos da superclasse.
A generalização cartográfica pode ser de dois tipos: variação pela forma e variação por
escala. A variação pela forma é utilizada na representação da convivência simultânea das
múltiplas formas geométricas de uma mesma classe, dentro de uma mesma escala. A
descrição geométrica da superclasse é deduzida a partir do uso das subclasses. Por exemplo,
um rio pode ser percebido como um espaço entre suas margens, como um polígono de água
ou como um fluxo (linha direcionada), formando a rede hidrográfica (Figura 36).

Bancos de Dados Geográficos 3-36


Modelagem de Dados Geográficos

Figura 36 – Diferentes Visões de um Rio

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

Bancos de Dados Geográficos 3-37


Modelagem de Dados Geográficos

Figura 37 - Generalização Cartográfica – Variação pela Forma

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

Indica uma Indica uma


classe classe
Georreferenciada Georreferenciada

Nome Escola
Cidade da Classe
intervalo escala

Atributos
Alterar forma
visualização E
E

Escola Escola
Cidade Cidade

Área da Escola

Figura 38 – Generalização Cartográfica - Variação por Escala

A primitiva generalização cartográfica é um caso particular da generalização, não


representando classes que, por motivos de melhor visualização em diferentes escalas, mantêm
sua natureza gráfica original porém, variam de tamanho, espessura de traço ou tipo de
símbolo. Essa variação somente de representação, e não da forma geométrica, é vista no
modelo Geo-OMT como uma operação aplicada à classe, com função de alterar a
visualização. O exemplo na Figura 39 mostra o símbolo de uma árvore variando com a escala.
À medida que a escala diminui o símbolo aumenta. Apesar da escala variar, o tipo geométrico
continua sendo ponto portanto, não será modelado como generalização cartográfica.

Bancos de Dados Geográficos 3-38


Modelagem de Dados Geográficos

Várias formas de visualizar uma árvore,


mantendo o mesmo tipo geométrico

Nome
da Classe
Atributos Gráficos

Atributos
Alterar
visualização

Figura 39 – Variação de Visualização de Um Símbolo

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

Total / Sobreposto Total / Disjunto


SuperClasse
SuperClasse

F E
Subclasse Subclasse
Subclasse Subclasse

Variação pela Forma Variação pela Escala

Figura 40 - Generalização Cartográfica

Bancos de Dados Geográficos 3-39


Modelagem de Dados Geográficos

Total / Superimposed Total / Disjoint

Hospital City

Shape Scale

Hospital Site Hospital Building City Point City Boundaries

Variation according Variation according


to shape to scale

Figura 40a –Exemplo de Generalização Cartográfica

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

Bancos de Dados Geográficos 3-40


Modelagem de Dados Geográficos

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.

Bancos de Dados Geográficos 3-41


Modelagem de Dados Geográficos

Regras de Dependência Espacial


Subdivisão Espacial 1. O objeto da classe primitiva deve dar origem a pelo menos dois objetos da
O objeto primitivo é classe derivada.
subdividido em áreas
menores originando 2. Qualquer porção do espaço contido dentro do objeto primitivo deve
objetos derivados. conter um e somente um objeto derivado, não podendo haver
O objeto primitivo é uma sobreposição de áreas, nem espaços vazios.
instância da classe que
foi subdividida dando 3. Os limites geográficos dos objetos derivados devem estar totalmente
origem à classe derivada
contidos no limite geográfico do objeto primitivo, podendo coincidir
parte, porém não extrapolá-lo.

17. A alteração do limite geográfico do objeto primitivo implica em alteração


nos limites geográficos dos objetos derivados.

5. A alteração do limite geográfico de um dos objetos derivados implicará na


alteração do limite geográfico de outros objetos derivados, de forma a não
existir espaços vazios dentro do objeto primitivo.

6. A exclusão de um objeto primitivo implicará na exclusão de todos os


objetos pertencentes à classe derivada.

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

Bancos de Dados Geográficos 3-42


Modelagem de Dados Geográficos

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.

3. A alteração do limite geográfico do objeto derivado só poderá ser feita


através da alteração dos limites dos objetos primitivos.

17. A exclusão de um dos objeto primitivos implica na alteração do limite do


objeto derivado.

5. A exclusão de todos os objetos primitivos que originaram o objeto


derivado, implicará na exclusão do objeto derivado.

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.

3. Qualquer objeto contido só deve pertencer a uma única instância dentro


de determinada classe. Outras classes poderão conter os mesmos objetos
porém para cada classe o objeto só estará contido em apenas uma
instância.

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.

Bancos de Dados Geográficos 3-43


Modelagem de Dados Geográficos

Regras de Generalização Espacial


Total/disjunta 1. A geometria que descreve uma superclasse é herdada pelas subclasses,
porém cada subclasse deve possuir atributos gráficos diferentes, como
tipo de traço, cor ou simbologia.

2. Todas as instâncias da superclasse tem que ser instância de uma e somente


uma subclasse.

Parcial/disjunta 1. A geometria que descreve uma superclasse é herdada pelas subclasses,


porém existirão instâncias da superclasse que não pertencem a nenhuma
das subclasse devendo ter os atributos gráficos da superclasse

2. As instâncias da superclasse podem ou não pertencer a uma subclasse.

Regra de Disjunção
1. A interseção entre a geometria dos objetos pertencentes à classes disjuntas deve ser
vazia.

A regra de disjunção é importante na manutenção da integridade em relação à entrada de


dados. Por exemplo, a classe Trecho é disjunta da classe Edificação. Isso implica que não
pode existir nenhum trecho que cruze uma edificação. Caso isso seja necessário, a edificação
(instância) deve primeiro ser excluída. A operação de criação de trecho e edificação poderá
garantir essa regra.

Bancos de Dados Geográficos 3-44


Modelagem de Dados Geográficos

Regras de GeoCampo
Isolinha 1. Uma isolinha não pode interceptar outra isolinha

2. Uma isolinha deve ser contínua

Tesselação 1. Qualquer ponto do espaço geográfico deve pertencer a uma e somente


uma célula de cada classe do tipo tesselação.

Polígonos 1. Qualquer ponto do espaço geográfico deve pertencer a uma e somente


Adjacentes uma instância de uma classe do tipo polígono adjacente.

2. As instâncias desta classe devem ser todas adjacentes, não devendo existir
nenhum espaço vazio.

RedeTriangular 1. Qualquer ponto do espaço geográfico deve pertencer a um triângulo da


Irregular rede de triangulação.

2. Não existe sobreposição de instâncias destas classes. Cada objeto ocupa


uma única posição no espaço, não havendo sobreposição.

Amostragem 1. Não existe sobreposição de instâncias de uma mesma classe do tipo


amostragem.

Regras de Associação Espacial


Proximidade 1. As relações de proximidade são consideradas relações fuzzy devendo
portanto, ter parâmetros que forneçam o que é considerado perto ou
longe.

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.

2. Todo segmento orientado intermediário estará conectado a dois nós.

3. Os segmentos orientados inicial e final começam e terminam em um


nó.

Bancos de Dados Geográficos 3-45


Modelagem de Dados Geográficos

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.

2. Os segmentos orientados inicial e final devem estar conectados a um


segmento orientado posterior e um anterior, respectivamente. Todos
de uma mesma classe.

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.

* ! $

O modelo Geo-OMT adota o conceito de temas (assuntos) e não o de camada ou layers


presentes em muitos outros modelos. No nível conceitual, um tema agrega classes de mesmas
características, no entanto, uma mesma classe pode ter característica comum com outros
temas. Citamos, por exemplo, o caso de Parques que podem pertencer tanto ao tema “Meio-
Ambiente”, como ao tema “Esporte e Lazer”. A transcrição de um tema para as camadas
lógicas (layers) normalmente dará origem a mais de uma camada. Por exemplo, o tema
hidrografia é composto pelas seguintes classes: Rio, Lago, Bacia Hidrográfica, Sub-bacia
Hidrográfica. Normalmente cada classe será uma camada. No entanto, isto dependerá do SIG
utilizado e dos objetivos da aplicação.
Aplicações geográficas normalmente envolvem uma quantidade muito grande de temas
principalmente em área urbana que envolve temas referentes a estrutura urbana, saúde,
educação, zoneamento, controle de trânsito, uso do solo, hidrografia, saneamento, energia,
telefonia, entre outros. As aplicações geográficas para uma prefeitura geralmente envolvem
todos esses temas e, dentro de cada tema, um grande número de classes.
O modelo Geo-OMT introduz o diagrama de temas como forma de visualizar os diversos
níveis de informação envolvidos em uma aplicação geográfica, fornecendo um nível de
abstração mais elevado. Ele é muito útil em projetos de grande dimensão fornecendo uma
visão global de todo o ambiente da aplicação auxiliando na compreensão da abrangência do
projeto georreferenciado. O uso de temas auxilia na subdivisão da modelagem em partes.
No esquema da aplicação, a notação utilizada para representar um tema consiste em englobar,
com um polígono pontilhado, as classes pertencentes a um mesmo tema. Dentro do polígono
deverá constar o nome que identifica o tema. Note que algumas classes apresentarão

Bancos de Dados Geográficos 3-46


Modelagem de Dados Geográficos

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

APOIO DE ACIDENTE GEOMORFO-


ALTIMETRIA HIDROGRAFIA GEOLOGIA VEGETAÇÃO ZONEAMENTO
CAMPO GEOGRÁFICO LOGIA

SISTEMA ELEMENTOS PARCELAMENTO PARCELAMENTO


VIÁRIO URBANOS REAL DO SOLO LEGAL DO SOLO

OBRAS PATRIMÔNIO MEIO LIMPEZA REFERÊNCIAS


TRÂNSITO UTILITIES EDUCAÇÃO SAÚDE HABITAÇÃO TRIBUTÁRIO CULTURA CENSO
PÚBLICAS MUNICIAPL AMBIENTE URBANA CIDADE

TRANSPORTE ILUMINAÇÃO
ENERGIA ÁGUA ESGOTO DRENAGEM TELEFONIA
COLETIVO PÚBLICA

Figura 41 – Diagrama de Temas

Bancos de Dados Geográficos 3-47


Modelagem de Dados Geográficos

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

Figura 42 – Parte do Esquema da Aplicação de Circulação Viária

Bancos de Dados Geográficos 3-48


Modelagem de Dados Geográficos

( "# ! ")

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].

GEO- EXT. MGEO+ OMT GISER GEO- GMOD MODULO-


OMT IFO EXT. OOA R

1. Representa o conceito de campos 4 4 4 4


2. Representa o conceito de objeto 4 4 4 4 4 4 4 4
3. Diferencia relações espaciais das 4
associações simples

17. Suporta relações de agregação 4 4 4 4 4 4 4 4


5. Possui primitivas para agregação 4 4 4
espacial

6. Representa relação topológica de 4 4 4


conectividade

7. Possui primitivas para representar 4 4 4


classes Georreferenciadas e classes
Convencionais.

8. Representa múltiplas views de uma 4 4 4 4 4


mesma entidade

9. Possui primitivas para 4


representação de múltiplas views

10. Possui regras de integridade 4


espacial

11. Modela a temporalidade dos dados 4 4 4 4


geográficos

Tabela 2 – Requisitos das Aplicações Geográficas X Modelos de Dados Geográficos

Bancos de Dados Geográficos 3-49


Modelagem de Dados Geográficos

Somente o modelo Geo-OMT diferencia, de forma explícita, as relações espaciais das


associações simples. Normalmente nos modelos apresentados, apenas lendo o nome da
relação é possível diferenciar os dois tipos de associações. O estabelecimento de regras de
integridade espacial associadas às primitiva de representação também não é considerado nos
outros modelos. Dos modelos apresentados, apenas o modelo GISER consegue representar a
alteração de atributos visuais de uma classe, através de uma restrição visual da relação
display. Entretanto a representação do modelo Geo-OMT, além de mais clara, mantém a
mesma notação utilizada na generalização, só trocando para linha pontilhada, a linha que
associa as classes envolvidas.
A seguir estão exemplificados os diferentes tipos de modelagem.

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

Geo-Campo Curva de Nível Contour

Nível de Representação

Figura 43 – Esquema para Geo-Campo

1 + 9: & / ; ! !, -

Bancos de Dados Geográficos 3-50


Modelagem de Dados Geográficos

Geo-OMT GeoOOA MODUL-R


BACIA BACIA

BACIA

GISER
consist SPATIAL consist
Entity
BACIAname
OBJECT
surface
of of

GMOD
Geo-Objeto BACIA Polygon

Figura 44 – Esquema para Geo-Objeto

1 (8 $ $0 $

a) Geo-OMT b) GeoOOA c) MODUL-R


Divisa
Municipal Divisa Municipal
Divisa
Municiapl

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

Figura 45 – Relações Espaciais

1 + ! 3 () $0 ! !

Bancos de Dados Geográficos 3-51


Modelagem de Dados Geográficos

Geo-OMT GISER
Representação
visual

Trecho

Restrições
displays
visuais

Classificação Viária

Via Via Logradouro 1 discreted N


Coletora Arterial Entity
Trecho
name
Feature by

varies over

Rede Malha
viária
Space

Figura 47 – Generalização Espacial

Bancos de Dados Geográficos 3-52


Modelagem de Dados Geográficos

11 + ! 0 '

Geo-OMT Nó Rede da
Trecho de Rio
Fluvial
Rede Fluvial

GeoOOA

1 1,N Rede 1,N 1 Nó da Rede


Trecho de Rio
Fluvial Fluvial

Nó do grafo

GISER
Nó da Rede determines
Fluvial topology of

Rede Fluvial SPATIAL


Located at U
SPACE OBJECT

determines
Trecho de Rede topology of
Fluvial

MODUL-R Connected
Graph

REDE fLUVIAL

Nó Rede 0,N 2,N


Trecho Rio
Fluvial Conectado

Figura 46 - Estrutura de Rede

Bancos de Dados Geográficos 3-53


Modelagem de Dados Geográficos

12 < 0 $ ! 0! $ (8 $9+ = ,! >= ? $

a) Geo-OMT b) MODUL-R c) GeoOOA

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

Figura 48– Múltiplas Representações

Bancos de Dados Geográficos 3-54


Modelagem de Dados Geográficos

* + ") ,! - ' !

2 ! $0 ! : < !@ $

O espaço geográfico modelado corresponde ao município de Belo Horizonte. O município é


subdivido em vinte e duas regiões denominadas setores. Cada quadra só pertence a um setor.
As quadras são subdivididas em lotes. Cada lote é representado tanto pela sua delimitação
quanto pela sua frente (testada do lote). Cada testada de lote dá frente para um ou mais
logradouros.
A malha viária é representada por segmentos de logradouro, denominados trechos. Um
segmento de logradouro é a parte do logradouro compreendida entre dois cruzamentos. A
conexão dos segmentos forma uma rede de logradouros (malha viária), onde o sentido da rede
acompanha o sentido de crescimento da numeração. De acordo com a classificação viária, os
trechos de logradouro podem ser trechos de via coletora, via local, via arterial ou via de
ligação regional. Os trechos são associados ao cadastro de logradouros, onde estão todos os
atributos referentes ao logradouro como nome, apelido, etc. Os trechos são dispostos no
centro da área compreendida pelos meio-fios, identificando o centro do logradouro.
A circulação viária é uma rede que fornece o sentido de tráfego. É formada por segmentos
orientados e nós de circulação. Os nós identificam a mudança de direção. Os trechos da
circulação viária são paralelos aos trechos de logradouro respeitando a direção de mão e
contra-mão.
O itinerário de ônibus tem uma relação estreita com a circulação viária. Uma mudança no
sentido de tráfego implica numa mudança nos itinerários que passam por ali. O itinerário de
ônibus é formado pelos trechos do itinerário, que são compreendidos pelos pontos de parada e
cruzamentos. A cada ponto de parada (nó da rede) corresponde uma placa de sinalização,
identificando, na calçada, um ponto de ônibus. A placa de ponto de ônibus faz parte da
sinalização vertical de trânsito. Para cada placa de ponto de ônibus, existe a informação de
todas as linhas que param naquele ponto. Algumas linhas possuem mais de um itinerário, que
varia com o horário e dia da semana. Para controle dos diferentes itinerários existentes em
algumas linhas de ônibus, cada linha foi subdivida em sublinhas, onde cada sublinha
representa um itinerário. Cada placa de parada de ônibus está associada a um endereço ao qual
ela dá frente. A Figura 49 mostra um detalhe da tela referente à aplicação de itinerário de
ônibus. As linhas direcionadas representam os trechos de um itinerário de ônibus, a placa na
calçada representa o ponto de ônibus e o ponto de parada (nó da rede) é representado por um
símbolo na sequência da linha do trecho. A Figura 50 exemplifica a circulação viária e a

Bancos de Dados Geográficos 3-55


Modelagem de Dados Geográficos

Figura 51 mostra o esquema da aplicação de transporte coletivo. Nele foi usada a notação
simplificada do Modelo Geo-OMT.

Figura 49 – Rede do Itinerário de Ônibus

Bancos de Dados Geográficos 3-56


Modelagem de Dados Geográficos

Trecho de via

Trecho de conversão

Nó de circulação

Figura 50 – Exemplo da Circulação Viária

Bancos de Dados Geográficos 3-57


a da Aplicação de Transporte Coletivo
Lote
Logradouro
1 0...* 1...*
Trecho Nó Trecho Nó
0...* Circulação conversão Itinerário Itinerário ônibus Itinerário F
Circul. Viária
Quadra Paralelo a 1...*
Sinalização
F Vertical
1 Cadastro Placa
Em cima 0...*
0...* 1
1 1 Tipo Nó
Lote Lote Trecho
2...* Malha Viária Cruzamento
Em frente a
1 1 coincidente 0...*
1...* 1...* Cruzamento Pto. Parada 0...1 Em frente a 1
Coincide End
1 Em frente a Pto. Ônibus
1 0...*
1...*
Entre
Ocupação Classificação Viária
1...*
2 Pertence
1 0...* 0...*
Lote Via Via Via Ligação
Territorial Via Local Meio-Fio
Edificado Coletora Arterial Regional
1...* Adjacente Perto = 5m

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.

Figura 52 – Exemplo de Trecho da Rede de Esgoto


Divisa
Divisa
Municipal
Municipal

Bacia de
Esgoto

Sub-bacia
de esgoto
C

0...* 0...*
Nó rede Trecho
esgoto Rede de Esgoto rede esgoto

tipo de nó tipo de rede

Poço Visita Ponta seca PV com Rede Rede Rede


(PV) ponta seca coletora emissária interceptora

Ligação Estação Lançamento Lançamento


usuário Tratamento rede pluvial curso d'água

Figura 53 – Esquema Simplificado da Rede de Esgoto


Nó da rede
de esgoto

tipo de nó

Poço de Visita Ponta seca PV com


(PV) ponta seca

Ligação Estação de Lançamento Lançamento


Usuário Tratamento em rede pluvial curso d'água

Figura 54 – Substituição do símbolo padrão pelo símbolo real

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

1 EDIFICADO TERRIT. 1...*


C
PERTENCE
C 1
1...* 1
EDIFICAÇÃO NÚMERO
1...* PORTA 0...* PERTENCE 1 LOGRADOURO

0...1 1 0...* 1
CORRESPONDE

EM FRENTE
POSSUI

ASSOCIADO

IMÓVEL 1...* PERTENCE


IPTU

TRECHO CRUZAMENTO
1 MALHA VIÁRIA
TIPO IMÓVEL

0...*
0...* IMÓVEL
IMÓVEL 0...1
TERRITO-
PREDIAL
RIAL

1...*

POSSUI

Figura 55 – Esquema parcial da Base Cadastral

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)

A partir da descrição acima e do esquema na figura 56, avaliar a clareza do esquema


quanto:
- existência de entidades gráficas e alfanuméricas
- tipo da entidade gráfica
- relacionamentos espaciais
- restrições de integridade espaciais
Gerar o esquema equivalente utilizando o Geo-OMT
Figura 56 – Esquema do MUB

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 Perto de (raio = 500m) 0...* 0...*


Perto de (raio = 500m)
Logradouro
0...* 0...*
1...*
Quadra Endereço
C
0...* 0...* 1
Pertence
C

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

Imóvel IPTU tipo de atividade

Borracharia Floricultura Ferro Velho



Divisa
Municipal

1...*
Distrito Área Verde Rio
Sanitário

C Perto de (raio = 500m 0...* 0...*


Perto de (raio = 500m)
Logradouro
1...* 0...* 0...*
Quadra Endereço
C
0...* 0...* 1
Pertence
C

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

LEGENDA – MODELO DE DADOS Geo-OMT

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

Operações Ex- Muro


Nome
da Classe Classe Georreferenciada
Geo-objeto Ponto (símbolo)
Atributos Gráficos
Nome
Atributos da Classe

Operações Ex- Árvore


Nome
da Classe Classe Georreferenciada
Geo-objeto Polígono
Atributos Gráficos
Nome
Atributos da Classe

Operações Ex- Lote


Nome
da Classe Classe Georreferenciada
Geo-objeto Linha uni-direcionada
Atributos Gráficos
Nome
Atributos da Classe

Operações Ex- Trecho da rede de esgoto


Nome
da Classe Classe Georreferenciada
Geo-objeto Linha bi-direcionada
Atributos Gráficos
Nome
Atributos da Classe

Operações Ex- Trecho da rede de água


Nome
da Classe Classe Georreferenciada
Geo-objeto Nó
Atributos Gráficos
Nome
Atributos da Classe

Operações Ex- Poço de visita


Nome
da Classe Classe Georreferenciada
Geo-campo Rede triangular irregular
Atributos Gráficos
Nome
Atributos da Classe

Operações Ex- TIN


Nome
da Classe Classe Georreferenciada
Geo-campo Isolinha
Atributos Gráficos
Nome
Atributos da Classe

Operações Ex- Curva de Nível


Nome
da Classe Classe Georreferenciada
Geo-campo Polígonos Adjacentes
Atributos Gráficos
Nome
Atributos da Classe

Operações Ex- Divisão de regiões administrativas


Nome
da Classe Classe Georreferenciada
Geo-campo Tesselação
Atributos Gráficos
Nome
Atributos da Classe

Operações Ex- Imagem de Satélite


Nome
da Classe Classe Georreferenciada
Geo-campo Amostragem
Atributos Gráficos
Nome
Atributos da Classe

Operações Ex- Pontos cotados (altimetria)


Significado
Representação Gráfica
Nome Classe
Generalização
As subclasses herdam os atributos da superclasse

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

SuperClasse Generalização Espacial


disjunta/total
A superclasse é a união de subclasses disjuntas
SubClasse SubClasse

SuperClasse Generalização Espacial


sobreposta/total
a união de instâncias das subclasses equivalem ao
conjunto das instâncias da superclasse, existindo
SubClasse SubClasse

instâncias que pertençam a mais de uma subclasse


SuperClasse Generalização Espacial
disjunta/parcial
Nem todas instâncias da superclasse estão
representadas nas subclasses disjuntas.
SubClasse SubClasse

SuperClasse Generalização Espacial


sobreposta/parcial
Nem todas instâncias da superclasse estão
representadas nas subclasses e as instâncias existentes
SubClasse SubClasse

nas subclasses podem pertencer simultaneamente a


mais de uma subclasse.
Nome Classe
Nome da relação Associação Simples

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

Nome da Classe Agregação

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...* Cardinalidade


Zero ou mais

Nome da classe
0...1 Cardinalidade
Zero ou um

Nome da classe
1...* Cardinalidade
Um ou mais

Nome da classe
1 Cardinalidade
Exatamente um
. /

[AbCa94] ABRANTES, Graca, CARAPUCA, Rogerio. Explicit representation of data


that depend on topological relationships and control over data consistency.
In: FIFTH EUROPEAN CONFERENCE AND EXHIBITION ON GEOGRAPHICAL
INFORMATION SYSTEMS – EGIS/MARI’94, 19917. Proceedings...v.1,p.869-877.
(http://wwwwsgi.ursus.maine.edu/gisweb/egis/eg94100.html)

[AbHu87] ABITEBOUL, Serge, HULL, Richard. IFO: a formal semantic database


model. ACM Transactions on Database Systems, v.12, n.4, p.525-565, 1987.

[Abri74] ABRIAL, J. Data semantics. In: KLIMBIE, J., KOFFEMEN, K.(Eds.). Data
Base management.North-Holland, amsterdam, 1974, p.1-59.

[BaCN92] BATINI, C.,CERI, S., NAVATHE, S.B. Conceptual database design: an


entity relationship approach. Redwood, CA: Benjamim Cummings, 1992.

[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.

[Benn96] BENNETT, David A. A framework for the integration of geographical


information systems and modelbase management. International Journal of
Geographical Information Science, London, v.11, n.4, p.337-357, 1997.

[BePa89] BÉDARD, Yvan, PAQUETTE, François. Extending entity-relationship


formalism for a spatial information systems. . In: 9th AUTOCARTO, 1989.
Proceedings... p.818-828.

[Bert67] BERTIN, Jaques. Sémiologie graphique: les diagrammes, les réseaux, les
cartes. Paris: Mounton et Gauthier-Villars, 1967. 431p.

[BoFo96] BORGES, Karla A. V., FONSECA, Frederico T. Modelagem de dados


geográficos em discussão. In: GIS BRASIL96, 1996, Curitiba. Anais... p.525-
532.

[Borg97] BORGES, Karla A. V. Modelagem de dados geográficos –uma extensão do


modelo OMT para aplicações geográficas. Belo Horizonte, MG: ESCOLA
DE GOVERNO DE MINAS GERAIS, Fundação João Pinheiro, 1997.
(Dissertação de Mestrado).
[Bote95] BOTELHO, Márcio A. Incorporação de facilidades espaço-temporais em
banco de dados orientados a objetos. Campinas, SP: UNICAMP, 1995.
(Dissertação de Mestrado).

[Brod84] BRODIE, M. L. On the development of data models. In: BRODIE, M. L.,


MYLOPOULOS, J., SCHMIDT, J. W. (Eds.). On conceptual modeling. New
York: Spring-Verlag, 19817. p.19-48.

[BuJF95] BUNDY, G., JONES, C., FURSE, E. Holistic generalization of large-scale


cartographic data. In: MÜLLER, J. C., LAGRANGE, J. P., WEIBEL, R. GIS
and generalization: metodology and practice. GISDATA I, serie editors.
Londres: Taylor & Francis, 1995. Cap.8, p.106-119.

[Butt95] BUTTENFIELD, Barbara P. Object-oriented map generalization: modeling


and cartographic considerations. In: MÜLLER, J. C., LAGRANGE, J. P.,
WEIBEL, R. GIS and generalization: metodology and practice. GISDATA I,
serie editors. Londres: Taylor & Francis, 1995. Cap.7, p.91-105.

[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.

[Cama95] CÂMARA, Gilberto. Modelos, linguagens e arquiteturas para bancos de


dados geográficos. São José dos Campos, SP: INPE, 1995. (Tese de
Doutorado).

[CCHM96] CÂMARA, G., CASANOVA, M., HEMERLY, A., MAGALHÃES, G.,


MEDEIROS, C. Anatomia de Sistemas de Informação Geográfica.
Campinas: Instituto de Computação, UNICAMP, 1996. 197p.

[Cere96] CEREJA, Nevton. Visões em sistemas de informações geográficas: modelos e


mecanismos. Campinas, SP: UNICAMP, 1996. (Dissertação de Mestrado).

[Ceza97] CÉZAR Neto, Joel. Gerador de esquema físico relacional a partir de um


diagrama TMO para ambiente WWW. Belo Horizonte, MG. UFMG, 1997.
(Dissertação de Mestrado).

[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.

[Chen76] CHEN, P. The entity-relationship model - toward a unified view of data.


ACM Transactions on Database Systems, v.1,n., p.9-36,1976.
[ClFO93] CLEMENTINI, E., FELICE P., OOSTEROM, P. A small set of formal
topological relationships suitable for end-user interaction. In: 3rd SYMPOSIUM
SPATIAL DATABASE SYSTEMS, 1993, Proceedings...p.277-295.

[CoYo91] COAD, P., YOURDON, E., 1991, Object-Oriented Analysis., 2nd edition.
Englewood Cliffs, New Jersey: Prentice Hall.

[Cros93] CROSBIE, Peter. Reality of object-oriented GIS. In: 31st ANNUAL


CONFERENCE OF THE URBAN AND REGIONAL INFORMATION SYSTEMS
ASSOCIATION – URISA’93, Atlanta, 1993. Proceedings...v.1, p.188-199.

[DaBo94] DAVIS Jr., Clodoveu, BORGES, Karla A. V. Object-oriented GIS in pratice.


In: 32nd ANNUAL CONFERENCE OF THE URBAN AND REGIONAL INFORMATION
SYSTEMS ASSOCIATION – URISA’94, Milwaukee, 19917. Proceedings... p.786-
795.

[Dang90] DANGERMOND, Jack. A classification of software components commonly


used in Geographic Information Systems. In: MARBLE, Duane, PEUQUET,
Donna. Introductory readings in Geographic Information Systems. London:
Taylor & Francis, 1990. p.30-51

[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.

[EgFr91] EGENHOFER, Max J., FRANZOSA, Robert D. Point-set topological spatial


relations. International Journal of Geographical Information Systems,
London, v.5, n.2, p.161-174, 1991.

[EgFr92] EGENHOFER, Max J., FRANK, Andrew U. Object-oriented modeling for


GIS. Journal of Urban and Regional Information Systems Associations,
Madison, v.4, n.2, p.3-19, Fall 1992.

[EgHe90] EGENHOFER, Max J., HERRING, J. A mathematical framework for the


definition of topological relationships. In: 4th INTERNATIONAL SYMPOSIUM ON
SPATIAL DATA HANDLING, 1990. Proceedings...p.803-813.

[EKFM90] EGENHOFER, M. J., KUHN, W., FRANK, A. U., MCGRANAGHAN, M.


Addresses different aspects of formalizing human communication about
geographic space. Santa Barbara, CA: National Center for Geographic
Information and Analysis (NCGIA), 1990. Technical Report 90-13.

[ElNa94] ELMASRI, R., NAVATHE, S. Fundamental of database systems. 2nd Edition.


Menlo Park, CA: Addison-Wesley, 19917. 873p.

[ElWH85] ELMASRI, R., WEELDREYER, J., HEVNER, A. The category concept: an


extension to entity-relationship model. International Journal on Data and
Knowledge Engineering, v.1, n.1, 1985.

[Feut93] FEUTCHWANGER, M. Towards a geographic semantic data model. Simon


Fraser University, 1993. (PhD thesis).

[Fran92] FRANK, Andrew U. Spatial concepts, geometric data models, and geometric
data structures. Computers & Geoscience, London, v.18, n.4, p.409-417,
1992.

[Fran96] FRANK, Andrew U. Qualitative spatial reasoning: cardinal directions as an


example. International Journal of Geographical Information Systems,
London, v.10, n.3, p.269-290, 1996.

[Free75] FREEMAN, J. The modelling of spatial relations. Computer Graphics and


Image Processing, n.4, p.156-171, 1975.

[FrGo90] FRANK, Andrew U., GOODCHILD, Michael F. Two perspectives on


geographical data modeling. Santa Barbara, CA: National Center for
Geographic Information and Analysis (NCGIA), 1990. Technical Report 90-
11.

[Gatr91] GATRELL, A. C. Concepts of space and geographical data. In: MAGUIRE,


D. J., GOODCHILD, M. F., RHIND, D. W. Geographical Information
Systems: principles and aplications. Longman Scientific & Technical, 1991.
Cap.9, p.119-1317.

[GoHo91] GOGOLLA, M., HOHENSTEIN, U. Towards a semantic view of an extended


entity-relationship model. ACM Transactions on Database Systems, v.16, n.3,
1991.

[Good92] GOODCHILD, Michael F. Geographical data modeling. Computers &


Geoscience, London, v.18, n.4, p.401-408, 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).

[KöPS95] KÖSTERS, G., PAGEL, B., SIX, H. Object-oriented requirements


engineering for GIS-applications. In: ACM-GIS INTERNATIONAL WORKSHOP
ON ADVANCES IN GEOGRAPHIC INFORMATION SYSTEMS, 1995, Baltimore.
Proceedings...p.61-69.

[KöPS96] KÖSTERS, G., PAGEL, B., SIX, H. GIS-application development with


GeoOOA. International Journal of Geographical Information Science,
London, v.11, n.4, p.307-335, 1997.

[LaFl94] LAENDER, Alberto H. F., FLYNN, Donal J. A semantic comparison of


modelling capabilities of the ER and NIAM models. In: ELMASRI, R.,
KOURAMAJIAN, V., THALHEIM, B.(eds.). Entity-Relationship approach –
ER’93. Berlin: Springer-Verlag, 19917. p.242-256.

[LaTh92] LAURINI, Robert, THOMPSON, Derek. Fundamentals of Spatial


Information Systems. London: Academic Press, 1992. 680p.

[LeCh95] LEE, Y. C., CHIN, F. L. An iconic query language for topological


relashionships. International Journal of Geographical Information Systems,
London, v.9, n.1, p.25-46, 1995.

[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.

[Lisb97] LISBOA F., Jugurta. Modelos conceituais de dados para sistemas de


informações geográficas. Porto Alegre: CPGCC da UFRGS, 1997. EQ- 12.

[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.

[MWLS95] MÜLLER, J. C.; WEIBEL, R.; LAGRANGE, J. P.; SALGÉ, F.


Generalization: state of art and issues. In: MÜLLER, J. C., LAGRANGE, J.
P., WEIBEL, R. GIS and generalization: metodology and practice. GISDATA
I, serie editors. Londres: Taylor & Francis, 1995. Cap.1, p.3-17.

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

[Nava92] NAVATHE, Shamkant B. Evolution for data modeling for databases.


Communications of the ACM, v.35, n.9, p.112-123, 1992.

[OlPM97] OLIVEIRA, Juliano L., PIRES, Fátima, MEDEIROS, Claudia. B. An


environment for modeling and design of geographic applications.
GeoInformatica, Boston, n.1, p.29-58, 1997.

[PaTh97] PAPADIAS, Dimitris, THEODORIDIS, Yannis. Spatial relations, minimum


bounding rectangles, and spatial data structures. International Journal of
Geographical Information Science, London, v.11, n.2, p.111-138, 1997.

[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.

[Peuq84] PEUQUET, Donna J. A conceptual framework and comparasion of spatial


data models. Cartographica, n.21, p.666-113, 19817.

[Pime95] PIMENTEL, Flávio Leal A. Uma proposta de modelagem conceitual para


dados geográficos: o modelo MGEO+. Recife, PE: UFPE, 1995. (Dissertação
de Mestrado).

[PuEg88] PULLAR, D. V., EGENHOFER, M. J. Towards the defaction and use of


topological relations among spatial objects. In: 3rd INTERNATIONAL
SYMPOSIUM ON SPATIAL DATA HANDLING (Columbus: International
Geographical Union), 1988. Proceedings...p.225-242.
[Rati97] RATIONAL Software Corporation. The Unified Language: notation guide,
version 1.1 July 1997. (http://www.rational.com).

[RBPE91] RUMBAUGH, J., BLAHA, M., PREMERLANI, W., EDDY, F.,


LORENSEN, W. Object-Oriented Modeling and Design. New Jersey:
Prentice-Hall, 1991.

[Reno97] RENOLEN, Agnar. Conceptual modelling and spatiotemporal information


systems: how to model the real world. In: 6th SCANDINAVIAN RESEARCH
CONFERENCE ON GIS (SCANGIS’97), Estocolmo, 1997. Proceedings...
(http://www.iko.unit.no/home/agnar)

[RuLa95] RUAS, A., LAGRANGE, J. P. Data and knowledge modelling for


generalization. In: MÜLLER, J. C., LAGRANGE, J. P., WEIBEL, R. GIS and
generalization: metodology and practice. GISDATA I, serie editors. Londres:
Taylor & Francis, 1995. Cap.6, p.73-90.

[Rumb96] RUMBAUGH, James. OMT insights: perspectives on modeling from the


Journal of Object-Oriented Programming. New York: SIGS Books, 1996.
390p.

[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.

[ScSW79] SCHEUERMANN, P., SCHIFFNER, G., WEBER, H. Abstraction


capabilities and invariant properties modeling within the entity-relationship
approach. In: 1st INTERNATIONAL CONFERENCE ON ENTITY-RELATIONSHIP
APPROACH, 1979, Los Angeles, CA. Proceedings....

[Ship81] SHIPMAN, D. The functional data model and the data language DAPLEX.
ACM Transactions on Database Systems, v.6 n.1, 1981.

[SiKe77] SIBLEY, E., KERSCHBERG, L. Data architecture and data model


considerations. Proceedings of the National Computer Conference. American
Federation of information Processing Socientes, n.46,1977

[SmSm77] SMITH, J., SMITH, D. Database abstraction: aggregation and generalization.


ACM Transactions on Database Systems, v.2, n.2, 1977.

[StMa97] STRAUCH, Júlia, MATTOSO, Marta. Orientação a objetos aplicada aos


GIS. Fator GIS, n.20, p.58-60, 1997.
[TeYF86] TEOREY, T., YANG, D., FRY, J. A logical design methodology for
relational databases using the extended entity-relationship model. ACM
Computing Surveys, v.18, n.2, 1986.

[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.

[WoHM90] WORBOYS, Michael F., HEARNSHAW, Hilary M., MAGUIRE, David J.


Object-oriented data modelling for spatial databases. International Journal of
Geographical Information Systems, London, v.4, n.4, p.369-383, 1990.

[Worb94] WORBOYS, Michael F. Object-oriented approaches to geo-referenced


information. International Journal of Geographical Information Systems,
London, v.8, n.4, p.385-399, 19917.

[Worb94a] WORBOYS, Michael F. A unified model for spatial and temporal


information. The Computer Journal, v.37, n.1, p.26-34, 19917.
“Inventar uma linguagem poderia significar:
inventar, com base em leis naturais (ou, em
concordância com elas), uma aparelhagem para
uma determinada finalidade; tem, porém., um outro
sentido também, análogo aquele em que falamos na
invenção de um jogo.”

! " #
$
$ % %
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

Hospital hospSJC = NEW(“Hospitais Municipal SJC”);

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.

COLLECTION fazendas_Toninho (Fazendas);


// Ache s fazendas de Painho !!
fazendas_Toninho= (SELECT fazenda
FROM fazenda IN Fazendas,
estrada IN Estradas,
WHERE (estrada.”NAME” = “Linha_Verde” AND
fazenda.”OWNER” = “Magalhães” AND
(estrada TOUCH fazenda OR
estrada CROSS fazenda OR
distance(fazenda, estrada) <= 5km)));

9$ $
, 3 4- "& 01, /
. . JJJ ( 6
# J JJJ 07/5

8
1 % 6 FAZENDAS
6 ) cadastro CADASTRO_INCRA
# " " ME
) 6 6 )
" " ' ( %
' I 01, / ( % #

fazendas

geoid area cadastro INCRA


22 1500 019331

cadastro INCRA ITR dono


019331 12000 Olacyr

cadastro

K ME) $ ) 6 6 )

// Dados recuperados por selecao espacial


COLLECTION fazendas_PP Fazenda;
// Selecao das fazendas
fazendas_PP= ( SELECT fazenda
FROM fazenda IN Fazenda ,
regiao IN Regioes,
cadastro IN Cadastro_INCRA
WHERE (fazenda.num = cadastro.num AND
cadastro.ITR >= 10.000 AND
fazenda.area >= 1.000 AND
regiao.nome = “Pontal do Paranapanema” AND
fazenda INSIDE regiao));

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

-./ 01 2 . ' 3 0 ' 1

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>.

cons. 0193516 secun.

primária tr. 1567

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 " ' )
• ' )
• # " '

• ; " & " FUZZY, !


% % TJ U
• ' %& (
• ' & )
• ' & ) ) 6

4 &" & #& " &! " (& ' "!

" &
%# ) 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);

4% &" , ( $ " " (& ' "!

SWITCH
) W # " 6 '
" " $ $
- ( %
"
CREATE Aptidao (“classe”: STRING)
IS_A CELLSPACE;

chuva = RETRIEVE (“chuva92”);


solos= RETRIEVE (“solos94”);
aptidao= NEW (“Aptidao_94”, Aptidao);

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
" #

7 # &" (& & #" $#"

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

WHILE (MORE (b1))


BEGIN
IF (VALUE(b1) > 200)
THEN
IF (ivdn = 0)
THEN
ivdn = (VALUE(b2) - VALUE(b1))
/(VALUE(b2) + VALUE(b1));
b1 = NEXT (b1);
b2 = NEXT (b2);
END

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

Tempo de banco de dados

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

* * '4 ?) / '' 7" A 4 '8


!" 'A 6 '4 ?) / '' 6" -* +
& 8 * H . Z R" 1!"#
/ = = 'A !
8'. /( 4 J 8 67772 9 8> 4 4? 4 !"# @
* * + S
* #

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

& < "


& # '* 3 Z /
9H K 677 " * %
%8 *
% # & $
* % - = , %
< # ; =
+ L + # * * )
* &
- #E #
* % + * & # &
* M =
L &
& 9 8> 4 677 "#
& * * & "
* % #@
* % % = * #
& * %
- = , % <
#; + L + #
* -* ) *
& -
"# E #
* % * & # &
* M
= H
#
& &+
* % #
& * % &
& # * -* * %
9 8> 4 677 "#
* =
C L & & M

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

Objeto não existe


Objeto existe Objeto não existe Propriedade Relacionamento
e não possui
e possui história IeJ entre objetos
história

"

Transferência deTransição entre Transição entre Transição do tipo Transição do


propriedade mesmo objeto objetos diferentes emissão tipo separação

3* 7# 7 " @ & * % "@ &

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

3* 7# 4 <& * & & %

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? " * %
* "

% & & &


% * *+ <
D & *
/%9 & &
* +
M / # 3* 7#!
&
+ * 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 * #
?

gmt1 obj1 obj1


gmt1 gmt1

####### ####### 6

obj1 obj1
gmt1 gmt1

####### ####### 6

obj1 obj1 obj2 obj2

gmt1 gmt1 gmt1 gmt1

####### ####### 6

obj2 obj2
obj1 obj1 obj1

###########! ############ 6

obj1 obj1 obj1


gmtA gmtA obj2 obj2
gmt1 gmt1 gmtA gmt1
gmtA

####### ####### 6

obj1 obj2 gmtA obj1 gmtA obj2 gmtA obj1 obj2


gmt1 gmt2 gmt1 gmt2
gmt1 gmt2

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" ] *

$ %*!" ] & %* %*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

Diversas funções de SIG dependem fundamentalmente de resultados obtidos em


algumas disciplinas da computação, da matemática e da estatística, entre outras áreas.
Especificamente na computação, as técnicas derivadas da área de bancos de dados são
especialmente importantes, uma vez que são responsáveis pelos mecanismos de
armazenamento e recuperação de dados geográficos. No entanto, como o diferencial do
SIG está no uso de informação georreferenciada, em geral visualizável graficamente,
duas outras disciplinas da computação adquirem grande importância nesse contexto:
processamento digital de imagens e computação gráfica. A primeira é essencial para o
uso de imagens em SIG, em aplicações que vão desde a conversão de dados até o
sensoriamento remoto. A segunda reúne as técnicas de tratamento e visualização de
dados vetoriais, que por sua vez se beneficiam dos avanços obtidos em uma área de
pesquisas nova, porém importante: a geometria computacional.

A geometria computacional procura desenvolver e analisar algoritmos e estruturas de


dados para resolver problemas geométricos diversos. Neste particular, tem um ponto
importante de contato com a área de projeto e análise de algoritmos, uma vez que
também procura caracterizar a dificuldade de problemas específicos, determinando a
eficiência computacional dos algoritmos e usando técnicas de análise de complexidade
assintótica [Knut73a]. Existe também uma preocupação em desenvolver soluções para
problemas clássicos de geometria, construindo estruturas mais apropriadas para a
representação geométrica robusta no ambiente computacional, que tem limitações
conhecidas quanto à precisão numérica e a capacidade de armazenamento de dados.

Os mesmos problemas ocorrem na área de topologia, em que se procura desenvolver


soluções, geralmente baseadas em estruturas de dados, para representar as relações
espaciais que são independentes da geometria, tais como contenção, adjacência e
conectividade. Além da caracterização e comparação das estruturas topológicas
propriamente ditas, a geometria computacional preocupa-se com os algoritmos
necessários para compor e manter estas estruturas a partir da geometria básica dos
objetos.

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:

• dada uma região do espaço, identificar o que está contido nela;


• dado um ponto, determinar que objetos geográficos o contêm.

Com isso, a indexação espacial é utilizada a todo momento na operação de um SIG, em


situações corriqueiras como a execução de um zoom ou a identificação de um objeto na
tela com o mouse.

As seções seguintes abordam alguns dos principais algoritmos e estruturas de dados


aplicados freqüentemente em SIG, nas áreas de geometria vetorial, topologia e
indexação espacial.

1.1 Geometria computacional aplicada a SIG

Num sentido amplo, a geometria computacional compreende o estudo de algoritmos


para resolver problemas geométricos em um computador. Nesta seção, os algoritmos
geométricos utilizados para resolver problemas típicos de um SIG vetorial serão
enfatizados, procurando transmitir uma noção dos recursos utilizados pelos sistemas na
solução de problemas geográficos. O enfoque será o de mostrar como os algoritmos
funcionam, indicando também, porém com menor ênfase, a sua complexidade.

1.1.1 Definições básicas


Em um SIG vetorial, cada objeto é codificado usando um ou mais pares de coordenadas,
o que permite determinar sua localização e aparência visual. Adicionalmente, os objetos
são também caracterizados por atributos não-espaciais, que os descrevem e identificam
univocamente. Este tipo de representação não é exclusivo do SIG: sistemas CAD e
outros tipos de sistemas gráficos também utilizam representações vetoriais. Isto porque
o modelo vetorial é bastante intuitivo para engenheiros e projetistas, embora estes nem
sempre utilizem sistemas de coordenadas ajustados à superfície da Terra para realizar
seus projetos, pois para estas aplicações um simples sistema de coordenadas cartesianas
é suficiente. Mas o uso de vetores em SIG é bem mais sofisticado do que o uso em
CAD, pois em geral SIG envolve volumes de dados bem maiores, e conta com recursos
para tratamento de topologia, associação de atributos alfanuméricos e indexação
espacial. Por outro lado, os vetores que se constrói tipicamente em um SIG são menos
sofisticados geometricamente que aqueles possíveis em um CAD. Enquanto em um
SIG, em geral, se pode apenas representar pontos e conjuntos de segmentos de reta, em
um CAD é possível ter também círculos, arcos de círculo, e curvas suavizadas como
spline e Bezier. Além disto, o tratamento da terceira dimensão em SIG é ainda
rudimentar, enquanto os sistemas CAD são utilizados para operações tridimensionais
bem mais complexas, como modelagem de sólidos.

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.

Ponto: um ponto é um par ordenado (x, y) de coordenadas espaciais.

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.

Linha poligonal: Sejam v 0 , v1 , , v n −1 n pontos no plano. Sejam


s0 = v 0 v1 , s1 = v1v 2 , , sn − 2 = v n − 2 v n −1 uma seqüência de n - 1 segmentos, conectando
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.

Observe-se, na definição acima, a exclusão da possibilidade de auto-interseção. Os


segmentos que compõem a poligonal só se tocam nos vértices. Formalmente, poligonais
que não obedecem a este critério são chamadas poligonais complexas. De modo geral,
os SIG não impedem que poligonais complexas sejam criadas; no entanto, dificilmente
este tipo de linha ocorrerá na natureza. Além do mais, poligonais complexas podem
criar dificuldades na definição da topologia e em operações como a criação de buffers
(ref. Interna).

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.

Assim, quando utilizamos a expressão vetores, estamos nos referindo a alguma


combinação de pontos, poligonais e polígonos, conforme definidos acima. Combinações
porque teoricamente poderíamos utilizar mais de um tipo de primitiva gráfica na criação
da representação de um objeto. Por exemplo, pode-se ter objetos de área mais
complexos, formados por um polígono básico e vários outros polígonos contidos no
primeiro, delimitando buracos. Pode-se também ter objetos compostos por mais de um
polígono, como seria necessário no caso do estado do Pará, que além da parte
“continental” tem a ilha de Marajó e outras como parte de seu território.

1.1.1.1 Classes de vetores


Apesar de estarmos sempre concebendo representações sob a forma de pontos, linhas e
áreas para objetos em SIG, existem algumas variações com relação à adaptação destas
representações à realidade, ou seja, considerando a forma com que estes objetos
ocorrem na natureza. A opção entre as alternativas a seguir é feita na fase de modelagem
conceitual do SIG, e deve ser feita com bastante cuidado.

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.

1.1.1.2 Problemas de nomenclatura


Um problema que aflige a todos os usuários de SIG é a grande variedade de diferentes
nomenclaturas para elementos vetoriais. A linha poligonal, conforme definida, pode ser
denominada de diversas formas em SIG e CAD: linha, polilinha, arco, link, 1-cell,
cadeia, e outras. Algumas destas denominações incluem considerações topológicas. Por
exemplo, um arco é muitas vezes definido como um elemento que conecta dois nós e
que pode ter ou não uma direção, e nó (ou 0-cell) é uma denominação alternativa para
ponto ou símbolo. O mesmo ocorre com relação a polígonos, denominados às vezes
como áreas, regiões ou ainda 2-cells.

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.

Ponto: um ponto é um par ordenado (x, y) de coordenadas espaciais.

Linha poligonal: Sejam v 0 , v1 , 

, v n −1 n pontos no plano. Sejam


s0 = v 0 v1 , s1 = v1v 2 , , sn − 2 = v n − 2 v n −1 uma seqüência de n - 1 segmentos, conectando


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;

Programa 1.1 - Tipos abstratos de dados para Ponto, Retângulo e Poligonal


Um grande problema para a implementação de rotinas geométricas está relacionado com
a precisão numérica. Como se sabe, a representação de números no computador é finita,
uma vez que uma seqüência finita de bits apenas consegue representar uma seleção
limitada de números de ponto flutuante [Schn97]. Esta limitação em geral não é
considerada nos desenvolvimentos teóricos. O fechamento desta lacuna de precisão é
deixado a cargo do programador, o que conduz a freqüentes problemas numéricos e de
topologia nas aplicações reais.

Assim, em muitas situações, para minimizar o problema de precisão e melhorar o


desempenho no tratamento da geometria, SIG e outros tipos de sistemas optam por
representar coordenadas por meio de variáveis inteiras2. Isso viabiliza cálculos mais
robustos e precisos, mas em contrapartida aparece a possibilidade de overflow numérico
em determinadas circunstâncias. Em SIG, este problema torna-se ainda mais complicado
devido aos sistemas de coordenadas utilizados mais freqüentemente. O sistema UTM
(Universal Transverso de Mercator), por exemplo, divide o globo longitudinalmente em
60 fusos. Cada fuso cobre 6 graus de longitude, e é identificado por seu meridiano
central. Em cada fuso, um sistema cartesiano de coordenadas é estabelecido, usando
metros como unidades. O eixo y (ou seja, Norte) tem origem no Equador, e o eixo x
(Leste) é posicionado de modo que a coordenada x seja equivalente a 500.000 metros
sobre o meridiano central. As coordenadas y, que no hemisfério sul seriam negativas,
são somadas a um fator constante de 10.000.000 metros. Assim, coordenadas UTM
podem basicamente variar entre 0 e 1.000.000 metros em x, e entre 0 e 10.000.000

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.

No entanto, este limite nos força a prestar atenção a operações de multiplicação


envolvendo coordenadas, ou valores derivados. Dependendo da ordem de grandeza dos
valores a e b, o numerador da Equação 1.8 pode exceder os limites de representação. O
valor de a pode se tornar arbitrariamente grande, à medida em que a reta se torna mais
vertical. O valor de b também pode ser grande, dependendo do valor de a e da ordem de
grandeza das coordenadas de um dos pontos extremos. Este problemas poderiam ser
resolvidos com uma mudança de eixos, mas o processo seria muito complicado,
computacionalmente intensivo e sujeito a erros. Seria também possível usar variáveis de
ponto flutuante para estas operações, mas neste caso estariam sendo introduzidos erros
de arredondamento e mais esforço computacional.

Um enfoque alternativo é apresentado em [Schn97], onde são descritas as bases da


geometria computacional de precisão (ou resolução) finita. A idéia básica consiste em
apoiar as coordenadas de quaisquer pontos ou vértices em uma malha regular baseada
em valores inteiros. Qualquer ponto com coordenadas fracionárias (por exemplo, um
ponto de interseção entre segmentos) é deslocado para o nó mais próximo desta grade
regular. Este enfoque robustece bastante o tratamento numérico das coordenadas de
pontos e vértices, e ainda garante consistência na representação topológica. No entanto,
ainda não está presente em SIG comerciais.

1.1.2 Formulações e algoritmos básicos

1.1.2.1 Triângulos e produtos vetoriais


Diversos problemas de geometria computacional utilizam resultados básicos de
problemas mais simples em sua solução. Alguns destes resultados básicos vêm da
análise geométrica do mais simples dos polígonos, e o único que sempre é plano: o
triângulo.

Á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.

Figura 1.1 - Produto vetorial dos vetores U e V, equivalente ao dobro da área do


triângulo ABC
O primeiro método pode ser descrito como se segue. Sejam U e V vetores. A área do
paralelogramo com lados U e V é U × V (Figura 1.1). O produto vetorial pode ser
calculado a partir do seguinte determinante:


 

i j k


zU = ( yU zV − zU yV )i + ( zU xV − xU zV ) j + ( xU yV − yU xV ) k
 

xU yU
xV yV zV


 

onde i , j , k são vetores unitários nas direções x, y e z respectivamente. Como se está


tratando de vetores bidimensionais, temos zU = zV = 0, e portanto a área S do triângulo é
dada por

( xU yV − yU xV )
S=
2

Mas, na realidade, U = B - A, e V = C - A. Portanto, a expressão acima pode ser reescrita


como

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

A área calculada pela expressão acima será positiva se os vértices A, B e C formarem


um circuito em sentido anti-horário, e negativa se formarem um circuito no sentido
horário. A área será exatamente zero se os três vértices estiverem alinhados.
A expressão acima pode ser também obtida quando se calcula o determinante dos três
pares de coordenadas, substituindo a coordenada z por 1:

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.

O cálculo efetivo da área de um triângulo, em números reais, desprezando o sinal, pode


ser feito usando a função áreaTriângulo (Programa 1.2). Como pode ser
interessante obter a área orientada, ou seja, com sinal, o Programa 1.2 também inclui a
função áreaOrientadaTriângulo.
função áreaOrientadaTriângulo(Ponto A, Ponto B, Ponto C): real

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;

função áreaTriângulo(Ponto A, Ponto B, Ponto C): real

início
retorne abs(áreaOrientadaTriângulo(A, B, C));
fim.

Programa 1.2 - Funções áreaTriângulo e áreaOrientadaTriângulo


Coordenadas baricêntricas. Para determinar se um determinado ponto pertence ou não
a um triângulo, utiliza-se um método baseado em coordenadas baricêntricas [FiCa91].

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)

onde λ1, λ2 e λ3 são números reais e λ1 + λ2 + λ3 = 1 . Os coeficientes λ1, λ2 e λ3


são denominados coordenadas baricêntricas de p em relação a p1, p2 e p3.

Prova - Com as coordenadas dos pontos p, p1, p2 e p3, e a equação


λ1 + λ2 + λ3 = 1 , constrói-se um sistema de três equações e três incógnitas para
encontrar as coordenadas baricêntricas:

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

A análise do sinal das coordenadas baricêntricas indica a região do plano em que se


encontra p, em relação ao triângulo p1p2p3 (Figura 1.2). Observe-se que, para isso, as
áreas devem ser orientadas, ou seja, com sinal.

λ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

Figura 1.2 - Sinais das coordenadas baricêntricas


Este resultado leva à implementação de uma função bastante útil, que determina se um
ponto está contido em um triângulo (Programa 1.3).
função pontoEmTriângulo(Ponto P,
Ponto P1, Ponto P2, Ponto P3): booleano

início
real lambda1, lambda2, lambda3, S;

S = áreaOrientadaTriângulo(P1, P2, P3);


lambda1 = áreaOrientadaTriângulo(P, P2, P3) / S;
lambda2 = áreaOrientadaTriângulo(P1, P, P3) / S;
lambda3 = áreaOrientadaTriângulo(P1, P2, P) / S;

retorne ((lambda1 > 0) e (lambda2 > 0) e (lambda3 > 0))


fim.

Programa 1.3 - Função pontoEmTriângulo

1.1.2.2 Pontos e segmentos


Schneider [Schn97] define exaustivamente os tipos de situações de posicionamento
relativo entre pontos e segmentos de reta, por meio de predicados. Estes predicados
estão listados na Tabela 1.1 e na Tabela 1.2.
Tabela 1.1 - Posicionamento relativo de ponto e segmento
B em(P, AB) Ponto é interior ao segmento; pontos extremos são
excluídos.
P

B emExtremo(P, AB) Ponto coincide com um ponto extremo do


segmento
P
A

Tabela 1.2 - Posicionamento relativo entre dois segmentos


D iguais(AB, CD) Ambos os pontos extremos coincidem
B

C
A

D
B seEncontram(AB, CD) Compartilham exatamente um ponto extremo

C
A

D B superpostos(AB, CD) São colineares e compartilham um trecho comum


C

D alinhados(AB, CD) São colineares e não têm ponto em comum


C
B

D paralelos(AB, CD) Têm a mesma inclinação e não são iguais nem


B
superpostos
C

B seTocam(AB, CD) Não são superpostos e um dos pontos extremos de


C
D
um segmento pertence ao outro segmento
A

B seInterceptam(AB, CD) Têm um ponto em comum e não se encontram nem


C
se tocam
D
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

(a) (b) (c)

Figura 1.3 - Posicionamento relativo de ponto e segmento orientado


Uma implementação possível para este teste está apresentada no Programa 1.4. Observe-
se que, em comparação com a função áreaTriângulo, o cálculo da área está
incompleto: não há a necessidade de efetuar a divisão por 2.
função lado(Ponto A, Ponto B, Ponto C): inteiro
/* determina se C está à direita, à esquerda ou alinhado com AB */
/* direita: retorna -1; esquerda: retorna 1; alinhado: retorna 0 */
início
inteiro S;

S = A.x*C.y - A.y*C.x + A.y*B.x - A.x*B.y + C.x*B.y - C.y*B.x;


se (S < 0) então retorne -1;
se (S > 0) então retorne 1 senão retorne 0;
fim.

Programa 1.4 - Função lado


A mesma formulação vale para determinar a posição relativa entre dois vetores U e V.
Se o resultado do produto vetorial U × V for positivo, então o giro de U a V é anti-
horário (Figura 1.4a); caso contrário, o giro é no sentido horário (Figura 1.4b). Também
aqui, se o resultado for nulo, significa que os vetores são colineares (Figura 1.4c). Este
resultado é importante para a ordenação de raios no algoritmo de fecho convexo de
Graham [Sedg90] (vide seção 1.1.6).
A
C C

U
V
V
B
B

U A
A B U V
C

(a) U x V > 0 (b) U x V < 0 (c) U x V = 0

Figura 1.4 - Posicionamento relativo entre dois vetores


Com a função lado, somada a um teste simples de coincidência de pontos, denominado
sobre (Programa 1.5), pode-se implementar os dois predicados da Tabela 1.1
(Programa 1.6) e, utilizando estes, pode-se implementar alguns dos predicados
relacionados na Tabela 1.2, como iguais, seEncontram, superpostos,
alinhados e seTocam (Programa 1.7).
função sobre(Ponto A, Ponto B): booleano
/* testa se A e B coincidem */
início
retorne ((P.x = A.x) e (P.y = A.y));
fim.

Programa 1.5 - Função sobre

função em(Ponto P, Ponto A, Ponto B): booleano


/* testa se P está “dentro” de AB, mas não coincide com A ou B */
início
se (lado(A, B, P) = 0) /* P pertence à reta AB */
então início

/* se AB não for vertical, testar em x; senao, em y */


se (A.x != B.x)
então retorne (((A.x < P.x) e (P.x < B.x)) ou
((A.x > P.x) e (P.x > B.x)) )

senão retorne (((A.y < P.y) e (P.y < B.y)) ou


((A.y > P.y) e (P.y > B.y)) );

fim então
senão
retorne falso;
fim.

função extremo(Ponto P, Ponto A, Ponto B): booleano


/* testa se P coincide com um ponto extremo de AB */
início
retorne (sobre(P, A) ou sobre(P, B));
fim.

Programa 1.6 - Funções de comparação entre ponto e segmento


função iguais(Ponto A, Ponto B, Ponto C, Ponto D): booleano
/* testa se AB e CD são iguais (coincidentes) */
início
retorne ((sobre(A, C) e sobre(B, D)) ou
(sobre(A, D) e sobre(B, C)));
fim.

função seEncontram(Ponto A, Ponto B, Ponto C, Ponto D): booleano


/* testa se AB e CD se encontram (um ponto extremo coincidente) */
início
se iguais(A, B, C, D) então retorne falso;

retorne ((sobre(A, C) e não em(D, A, B) e não em(B, C, D)) ou


(sobre(A, D) e não em(C, A, B) e não em(B, C, D)) ou
(sobre(B, C) e não em(D, A, B) e não em(A, C, D)) ou
(sobre(B, D) e não em(C, A, B) e não em(A, C, D));
fim.

função superpostos(Ponto A, Ponto B, Ponto C, Ponto D): booleano


/* testa se AB e CD são alinhados e têm um trecho em comum */
início
se ((lado(A, B, C) = 0) e (lado(A, B, D) = 0))
então retorne (em(C, A, B) ou em(D, A, B) ou
em(A, C, D) ou em(B, C, D));
fim.

função alinhados(Ponto A, Ponto B, Ponto C, Ponto D): booleano


/* testa se AB e CD são alinhados e não têm um trecho em comum */
início
se ((lado(A, B, C) = 0) e (lado(A, B, D) = 0))
então retorne (não em(C, A, B) e não em(D, A, B) e
não em(A, C, D) e não em(B, C, D));
fim.

função seTocam(Ponto A, Ponto B, Ponto C, Ponto D): booleano


/* testa se AB e CD se tocam */
início
se (alinhados(A, B, C, D) ou superpostos(A, B, C, D))
então retorne falso
senão retorne (em(C, A, B) ou em(D, A, B) ou
em(A, C, D) ou em(B, C, D));
fim.

Programa 1.7 - Funções iguais, seEncontram, superpostos,


alinhados e seTocam
No caso do predicado paralelos, a solução mais simples consiste em calcular e
comparar os coeficientes angulares das retas que contêm os segmentos, tomando os
cuidados necessários para o caso de retas verticais. Para evitar problemas numéricos,
pode-se usar a formulação descrita abaixo.

Para que a reta AB seja paralela à reta CD, devemos ter

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)

Desenvolvendo, temos uma forma mais elegante, e mais freqüente na literatura:

x A ( y D − yC ) + x B ( yC − y D ) + xC ( y A − y B ) + x D ( y B − y A ) = 0 (1.5)

Note-se na Equação 1.5 que apenas são realizadas operações de multiplicação e


subtração, eliminando a necessidade de testes para casos especiais, como retas verticais.
A implementação da função paralelos está no Programa 1.8. É dada preferência na
implementação à Equação 1.4, uma vez que, quando as operações de subtração são
realizadas antes da multiplicação, corre-se menos risco de overflow. Observe-se os
testes de alinhamento, superposição e igualdade realizados no início da função,
necessários para eliminar as outras três situações em que o coeficiente angular das retas
também coincide.
função paralelos(Ponto A, Ponto B, Ponto C, Ponto D): booleano
/* testa se A e B são paralelos */
início
se (alinhados(A, B, C, D) ou
superpostos(A, B, C, D) ou
iguais(A, B, C, D))
então retorne falso;

retorne (((B.y - A.y) * (D.x - C.x) -


(D.y - C.y) * (B.x - A.x)) = 0);
fim.

Programa 1.8 - Função paralelos


Existem diversas maneiras de implementar o predicado seInterceptam. A
alternativa mais conveniente consiste em usar um método baseado no produto vetorial
para detectar a interseção entre dois segmentos, fazendo o exame dos triângulos que
podem ser formados por quaisquer três dos quatro pontos extremos. Será utilizada para
isso a função lado, descrita anteriormente (Programa 1.4).

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

Figura 1.5 - Interseção própria de segmentos

A B
C

P B
D

(a) (b)

Figura 1.6 - Interseção imprópria de segmentos


A implementação do teste de interseção entre dois segmentos pode ser dividida em duas
etapas [CLR90]. Inicialmente, é utilizado um teste rápido, para determinar se os
retângulos definidos pelos segmentos se tocam. Se os retângulos não se tocarem em x ou
em y, os segmentos também não terão interseção, mas não se pode afirmar o contrário
(Figura 1.7b). Este teste é semelhante ao de interseção própria. Os segmentos AB e CD
poderão se tocar (Figura 1.7a) caso

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

Figura 1.7 - Interseção de retângulos envolventes mínimos


A implementação deste teste, a função interseçãoRetângulos, está apresentada
no Programa 1.9.
função interseçãoRetângulos(Ponto A, Ponto B, Ponto C, Ponto D):
booleano

início
Ponto P, Ponto Q, Ponto P1, Ponto Q1;

P.x = min(A.x, B.x);


P.y = min(A.y, B.y);
Q.x = max(A.x, B.x);
Q.y = max(A.y, B.y);
P1.x = min(C.x, D.x);
P1.y = min(C.y, D.y);
Q1.x = max(C.x, D.x);
Q1.y = max(C.y, D.y);

retorne ((Q.x >= P1.x) e (Q1.x >= P.x) e


(Q.y >= P1.y) e (Q1.y >= P.y));
fim.

Programa 1.9 - Interseção de retângulos envolventes mínimos


O segundo estágio consiste em verificar se os segmentos efetivamente se interceptam.
Isto ocorre quando os pontos extremos de um segmento ficam de lados opostos da reta
definida pelo outro, e vice-versa. Os resultados do produto vetorial têm que ter sinais
opostos (Figura 1.8a). Se apenas um dos produtos for nulo, então um ponto extremo de
um segmento está contido na reta definida pelo outro (Figura 1.8b). Se ambos os
produtos forem nulos, os segmentos são colineares (Figura 1.8c), com interseção (a
possibilidade de colinearidade sem interseção foi descartada pelo teste dos retângulos).
O teste precisa ser aplicado duas vezes, usando cada segmento como base, ou seja, não
basta verificar se C e D estão de lados opostos da reta definida por AB, também é
preciso verificar se A e B estão de lados opostos da reta CD.
C B C B D

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

Figura 1.8 - Verificação de interseção


Para implementar este teste, utiliza-se o teste de posicionamento relativo entre ponto e
reta (função lado), gerando o predicado seInterceptam (Programa 1.10). Nesta
função está contida uma chamada ao teste rápido de interseção de retângulos, para que
os produtos vetoriais só sejam calculados caso estritamente necessário.
função seInterceptam(Ponto A, Ponto B, Ponto C, Ponto D): booleano

início
inteiro abc, abd, cda, cdb;

se não interseçãoRetângulos(A, B, C, D)
então retorne falso;

abc = lado(A, B, C);


abd = lado(A, B, D);
cda = lado(C, D, A);
cdb = lado(C, D, B);

retorne ((abc * abd < 0) e (cda * cdb < 0));


fim.

Programa 1.10 - Função seInterceptam


Se, em alguma situação, o caso de interseção em um dos pontos extremos puder ser
considerado, basta incluir uma chamada às funções seEncontram e seTocam,
gerando uma nova função, seInterceptamImprópria (Programa 1.11).
função seInterceptamImprópria(Ponto A, Ponto B, Ponto C, Ponto D):
booleano

início
retorne (seEncontram(A, B, C, D) ou
seTocam(A, B, C, D) ou
seInterceptam(A, B, C, D));
fim.

Programa 1.11 - Função seInterceptamImprópria


O predicado restante, disjuntos, é implementado com testes para os demais casos,
chegando a uma conclusão por exclusão: dois segmentos são disjuntos se não são iguais,
nem se encontram, nem se tocam, nem são paralelos, nem se interceptam, nem se
superpõem (Programa 1.12).
função disjuntos(Ponto A, Ponto B, Ponto C, Ponto D): booleano

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.

Programa 1.12 - Função disjuntos


A função seInterceptam serve para determinar, rapidamente e com o mínimo de
problemas numéricos possível, se um par de segmentos tem interseção, o que é
suficiente em diversas situações. O cálculo das coordenadas deste ponto de interseção
exige um pouco mais de esforço.

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.

A formulação é a seguinte: sejam AB e CD dois segmentos de reta quaisquer no plano


(Figura 1.5). A reta que passa por A e B tem a seguinte equação:

y = a1 x + b1 . (1.6)

Como na reta AB temos

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

O mesmo se aplica à reta CD, produzindo

y = a 2 x + b2 , (1.7)

y D − yC
a2 = e b2 = y C − a 2 x C .
x D − xC

Resolvendo o sistema formado pelas equações 1.6 e 1.7, temos


b2 − b1 b2 a1 − b1a 2
x= ey= (1.8)
a1 − a 2 a1 − a 2

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:

min( x A , x B ) ≤ x P ≤ max ( x A , x B ) e min( y A , y B ) ≤ y P ≤ max ( y A , y B )

e também

min( x C , x D ) ≤ x P ≤ max ( x C , x D ) e min( y C , y D ) ≤ y P ≤ max ( y C , y D ) .

É necessário permitir a condição de igualdade, nos testes acima, de modo a considerar o


caso de retas verticais ou horizontais. Portanto, para garantir que a interseção seja
própria, será ainda necessário comparar diretamente o ponto de interseção com os
pontos extremos dos segmentos.

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 )

As coordenadas do ponto de interseção I serão:

x I = x A + s( x B − x A )
(1.10)
y I = y A + s( y B − y A )

mas a interseção somente será própria se 0 < s < 1 e 0 < t < 1.

Observe-se que o valor de denom é equivalente à expressão à esquerda da Equação 1.5,


e mais uma vez é mais conveniente implementá-la sob a forma da Equação 1.4. Se
denom for igual a zero, então os segmentos são paralelos e não existe ponto de
interseção. No caso, é mais conveniente calcular o valor de denom e não utilizar a
função paralelas para detectar este caso especial, uma vez que denom será utilizado
no cálculo de s e t.

A implementação está no Programa 1.13. A função pontoInterseção retornará um


valor booleano, indicando se existe ou não o ponto de interseção próprio, enquanto o
ponto propriamente dito, se existir, será retornado na variável I.

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;

denom = ((B.y - A.y) * (D.x - C.x) - (D.y - C.y) * (B.x - A.x));


se (denom = 0)
então retorne falso;

s = (A.x * (D.y - C.y) +


C.x * (A.y - D.y) +
D.x * (C.y - A.y)) / denom;
t = - (A.x * (C.y - B.y) +
B.x * (A.y - C.y) +
C.x * (B.y - A.y) / denom;

se ((s > 0) e (s < 1) e (t > 0) e (t < 1))


então início
I.x = A.x + s * (B.x - A.x);
I.y = A.y + s * (B.y - A.y);
retorne verdadeiro;
fim
senão retorne falso;
fim.

Programa 1.13 - Função pontoInterseção

1.1.2.3 Robustez numérica das implementações


Como já mencionado, um dos principais problemas que afetam os algoritmos
geométricos é a robustez numérica da implementação. Como se sabe, a representação de
números reais em computador é limitada, em termos de precisão. No entanto, o
desenvolvimento teórico dos algoritmos é baseada na hipótese de que se dispõe de
operadores aritméticos com precisão infinita, ignorando em sua concepção os possíveis
erros de arredondamento.

No momento da implementação prática, o programador em geral ignora este problema, e


passa a conviver com uma série de problemas que são tratados caso a caso. Isso ajuda a
explicar parte da instabilidade de comportamento que infesta os SIG comerciais,
especialmente quando se trata de operações sobre objetos geográficos vetoriais. A
correção destes problemas é feita, em geral, introduzindo “tolerâncias” em lugar de
testes exatos. Por exemplo, a comparação “se denom = 0” na função
pontoInterseção pode ser implementada na prática como “se denom < ε”,
para evitar overflow numérico na expressão seguinte, e para diminuir prováveis
problemas de arredondamento. Ainda assim, existe dúvida sobre qual valor de ε utilizar.

A concepção e a descrição dos algoritmos apresentados na seção anterior procurou


evitar ao máximo possíveis problemas numéricos. Dentre todas as funções apresentadas
na seção anterior, apenas três contém riscos relativos à robustez numérica de
implementação: as funções lado, paralelos e pontoInterseção Todas as
outras funções que poderiam apresentar problemas numéricos, como em,
superpostos e alinhados, utilizam diretamente uma dessas funções. O problema
numérico da função lado está na exatidão do teste de alinhamento dos três pontos,
análogo ao cálculo da diferença entre inclinações na função paralelos e ao cálculo
de denom em pontoInterseção. Seria possível estabelecer uma tolerância para as
comparações nestas situações? No caso de aplicações de SIG, a tolerância precisaria
variar de acordo com o sistema de coordenadas e com a escala da representação. Uma
possibilidade também seria a determinação da tolerância por parte do usuário,
considerando estes fatores, para cada camada de informação vetorial.

O’Rourke [ORou94] observa que a introdução generalizada de tolerâncias pode causar


problemas em outras áreas, como na detecção de pontos coincidentes (função sobre), e
sugere que o único método infalível de solução seria implementar os algoritmos usando
números racionais, ao preço de tornar o código excessivamente complexo. Novamente,
o caminho de solução mais interessante parece ser o proposto pela geometria
computacional de precisão finita [Schn97], mas ao custo de uma maior complexidade na
implementação de funções básicas como as de interseção entre dois segmentos.

1.1.3 Interseção de n segmentos


Informalmente, este problema pode ser enunciado da seguinte maneira: dados n
segmentos de reta no plano, determinar se existe alguma interseção entre quaisquer dois
destes segmentos. Um problema correlato seria: dados n segmentos de reta no plano,
determinar todas as interseções que ocorram.

A idéia para solução do primeiro problema vem da análise de intervalos em uma


dimensão. Considere-se que, em vez de n segmentos, tenha-se n intervalos entre
números reais, do tipo [xL, xR], onde x L ≤ x R . Uma solução exaustiva seria analisar
todos os n2 pares de intervalos existentes, comparando-os sempre dois a dois, e
interrompendo o processamento assim que a primeira interseção fosse detectada.

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)

Figura 1.9 - Verificação de interseção em intervalos na reta


Em duas dimensões, o problema torna-se um pouco mais complicado, já que não existe
maneira de produzir uma ordenação adequada para segmentos no plano. A técnica
empregada é clássica na geometria computacional, e é denominada de varredura do
plano (plane sweep). Esta técnica faz uso de duas estruturas de dados básicas, uma para
registrar a situação da linha de varredura (sweep line status), e a outra que registra
eventos ocorridos durante a varredura (event-point schedule).

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

Figura 1.10 - Relação de ordenação entre segmentos


Com esta relação é construída uma ordenação total dos segmentos, que muda à medida
em que a linha é deslocada da esquerda para a direita. Nesse processo de varredura do
plano, três coisas podem ocorrer:

• o ponto extremo à esquerda de um segmento é encontrado; o segmento é, portanto,


inserido na ordenação;

• o ponto extremo à direita de um segmento é encontrado; o segmento é, portanto,


retirado da ordenação;

• um ponto de interseção entre dois segmentos s1 e s2 foi encontrado; portanto, s1 e s2


trocam de posição na ordenação.

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.

Portanto, é necessário operar duas estruturas de dados no processo. A primeira (sweep


line status) é a responsável por manter a ordenação das interseções dos segmentos com a
linha de varredura, e é usualmente implementada como um dicionário [PrSh88] ou
como uma árvore red-black [CLR90]. As operações que o sweep line status deve
suportar são inserção (insere, complexidade O(log n)), exclusão (exclui, também
O(log n)), e duas funções para determinar qual segmento está imediatamente acima e
imediatamente abaixo de um segmento dado na ordenação (acima e abaixo, O(1)). A
segunda estrutura de dados (event-point schedule) é responsável por manter a seqüência
das abscissas que serão analisadas pela linha de varredura, e é implementada como uma
fila de prioridades. Deve suportar as clássicas operações de inclusão (insere), retirada
do elemento de mais alta prioridade (min) e uma função que testa a presença de um
determinado elemento na estrutura (membro), todas com complexidade O(log n).

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 a abscissa corresponder a um ponto extremo à esquerda de algum segmento,


inserir o segmento no sweep line status. Verificar se existem interseções entre este
segmento e os segmentos que estão imediatamente acima e abaixo dele na linha de
varredura. Caso exista interseção, a abscissa do ponto de interseção deve ser
calculada e inserida no event-point schedule, caso já não pertença a ele.

• 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.

• Se for um ponto de interseção entre dois segmentos, trocar a posição destes


segmentos no sweep line status. Informar a existência de um ponto de interseção e
suas coordenadas.
O algoritmo final está delineado no Programa 1.14. Para melhorar a legibilidade, foram
omitidos detalhes da implementação e uso das estruturas de dados básicas, como as
listas e a fila de prioridades.
procedimento interseçãoNSegmentos
início
FILA A;
FILA_DE_PRIORIDADES E;
SWEEP_LINE_STATUS L;
Segmento s, s1, s2, s3, s4;
Ponto I;

ordenar os 2N pontos extremos por x e y;


organizar os pontos extremos em uma fila de prioridades E;
A = nil;
enquanto (E != nil) faça início
p = min(E);
se (p é extremo à esquerda) então início
s = segmento do qual p é ponto extremo;
insere(s, L);
s1 = acima(s, L);
s2 = abaixo(s, L);
se (seInterceptam(s1.p1, s1.p2, s.p1, s.p2)) então
insere(s1, s, A);
se (seInterceptam(s2.p1, s2.p2, s.p1, s.p2)) então
insere(s, s2, A);
fim
senão início
se (p é extremo à direita) então início
s1 = acima(s, L);
s2 = abaixo(s, L);
se (pontoInterseção(s1.p1,s1.p2, s2.p1,s2.p2, I)) então
se (I.x > p.x) então insere(s1, s2, A);
exclui(s, L);
fim
senão início /* p é uma interseção */
s1 = segmento que intercepta s2 em p;
s2 = segmento que intercepta s1 em p;
/* sendo s1 acima de s2 à esquerda de p */
s3 = acima(s1, L);
s4 = abaixo(s2, L);
se (seInterceptam(s3.p1, s3.p2, s2.p1, s2.p2)) então
insere(s3, s2, A);
se (seInterceptam(s1.p1, s1.p2, s4.p1, s4.p2)) então
insere(s1, s4, A);
trocar s1 e s2 de posição em L;
fim;
fim;
/* processamento das interseções */
enquanto (A != nil) faça início
retira(s, s1, A);
x = abscissa da interseção de s e s1;
se (membro(x, E) = FALSO) então início
saída(”Existe interseção entre “,s,” e “, s1);
insere(x, E);
fim;
fim;
fim;
fim.

Programa 1.14 - Interseção entre N segmentos


Com relação à complexidade deste algoritmo, observa-se que, inicialmente, a operação
de ordenação consome tempo O(n log n). As operações executadas a cada passo no
event-point schedule consomem O(log n), correspondente ao pior caso das três
operações mutuamente exclusivas que atuam sobre o sweep line status. O teste de
interseção propriamente dito (pontoInterseção) é executado em tempo constante.
O número de iterações do laço principal é 2n + K, onde K é o número de interseções, o
que corresponde ao número de eventos que são inseridos no event-point schedule. O
laço mais interno, de tratamento das interseções, pode potencialmente ser executado a
cada iteração do laço principal, sendo portanto executado O(n + K) vezes. Como cada
execução do teste de presença na fila de prioridades é executada em tempo logarítmico,
 n
temos o tempo O(log(n + K)). Mas como K ≤   = O(n 2 ) , então o tempo fica sendo
 2
simplesmente O(log(n)). Portanto, o tempo total do laço externo é O((n + K) log n)
[PrSh88].

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].

Em SIG, o algoritmo de detecção de interseções entre n segmentos tem muita utilidade


na dedução de relações topológicas (como toca ou cruza), na detecção de interseções
entre poligonais, entre polígonos ou entre poligonais e polígonos. Também serve para
verificar a qualidade de dados digitalizados, testando se uma dada poligonal ou polígono
possui auto-interseções indesejáveis.

1.1.4 Simplificação de poligonais


Muitas entidades do mundo real podem ser modeladas como linhas ou, mais
genericamente, poligonais. Essas entidades são freqüentes em bases de dados
geográficas, onde correspondem tipicamente a cerca de 80% do volume de dados
vetoriais [McSh92]. São usadas para representar feições tais como rios, estradas, ruas,
linhas de transmissão e adutoras. Os nomes dados pelos SIG comerciais a essas
entidades, no entanto, variam muito: linha, polilinha (polyline), line string, arco, 1-cell,
poligonal, cadeia (chain), e outros [Davi97]. A complexidade das representações
lineares em SIG pode variar de simples segmentos de reta (dois pares de coordenadas),
como um trecho de tubulação de esgoto, até poligonais contendo milhares de pares de
coordenadas, como um rio ou uma curva de nível.

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.

1.1.4.1 Caracterização do Problema


Linhas poligonais são utilizadas em muitas situações para aproximar e representar
vetorialmente os limites de objetos complexos encontrados em aplicações de
cartografia, SIG, computação gráfica, reconhecimento de padrões e outros [ImIr86]. O
problema de simplificação de linhas é particularmente importante em cartografia e SIG,
e é estudado intensivamente desde os anos 60, quando ocorreram as primeiras
experiências com o uso de instrumentos de transcrição de mapas para o computador,
como a mesa digitalizadora. No processo de digitalização de linhas com esses
instrumentos, freqüentemente são introduzidos vértices em excesso, vértices que, se
descartados, não provocariam uma alteração visual perceptível na poligonal. Assim, um
primeiro objetivo para algoritmos de simplificação de linhas é “limpar”
(significativamente, o verbo utilizado em inglês é weed, “capinar”) a poligonal de
pontos claramente desnecessários, do ponto de vista de sua visualização [Weib95],
mantendo a qualidade de sua aparência gráfica.

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.

Medidas de proximidade. Assim, o problema de simplificação de linhas consiste em


obter uma representação mais grosseira (formada por menos vértices, e portanto mais
compacta) de uma poligonal a partir de uma representação mais refinada, atendendo a
alguma restrição de aproximação entre as duas representações. Essa restrição pode ser
definida de várias maneiras [McMa86], mas é em geral alguma medida da proximidade
geométrica entre as poligonais, tais como o máximo deslocamento perpendicular
permitido (Figura 1.11a) ou o mínimo deslocamento angular permitido (Figura 1.11b).
Na Figura 1.11a, o vértice 2 será mantido, uma vez que a distância entre ele e a reta que
passa pelos vértices 1 e 3 é superior à permitida. Na Figura 1.11b, o vértice 3 será


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)

Figura 1.11 - Medidas de proximidade para simplificação de linhas


Dentre todas as medidas possíveis, a mais utilizada é a distância perpendicular. Este fato
provavelmente deriva de trabalhos antigos, como o de Perkal ([Perk66] apud [Bear91]).
Perkal propôs o conceito de banda epsilon como sendo a região ao redor da poligonal
que contém todos os pontos do plano situados a uma distância menor que ou igual a ε,
em uma tentativa de simular o comportamento da linha cartográfica, que tem largura
definida [Peuc75]. Foi também definido que uma poligonal é ε-convexa se todos os
pontos dela tivessem raio de curvatura superior a ε. Caso isso não ocorra, a banda
epsilon se auto-intercepta, indicando perda de legibilidade. Este raciocínio valida o
trabalho com distâncias perpendiculares, embora nos algoritmos que a utilizam não
esteja explícito qualquer teste de ε-convexidade5.

O conceito de banda de tolerância, apoiado no cálculo de distâncias perpendiculares, é


utilizado em grande parte dos algoritmos de simplificação que serão apresentados a
seguir. Um problema eventualmente abordado na literatura é a escolha do parâmetro de
tolerância (ε), e sua correlação com a escala da representação simplificada.

Uma regra freqüentemente utilizada em cartografia é a chamada Lei do Radical


[ToPi66], que determina que o número de objetos a serem mantidos em uma operação
de generalização deve ser proporcional à raiz quadrada da mudança de escala. Esta regra
foi deduzida a partir da observação empírica da tendência apresentada pelos cartógrafos
em manter aproximadamente mesma quantidade de objetos em um mapa de
determinada escala. Considerando seu sucesso para esta finalidade prática, foi tentada
sua adaptação para determinar a variação da tolerância em função da escala, e para
definir o número de segmentos a manter em cada poligonal simplificada. No entanto,

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.

Um enfoque mais interessante é o que determina a tolerância com base no tamanho do


menor objeto visível em uma determinada escala [LiOp92]. Este tamanho pode ser dado
em termos de uma distância medida no espaço de coordenadas do mapa plotado, ou seja,
em milímetros do papel, independente da escala utilizada. Assim, é definida uma
correspondência linear entre a escala e a tolerância linear adotada. Não existe, contudo,
consenso sobre este critério. Existem indicações que o valor ideal seria função não
apenas da escala, mas também da complexidade da poligonal [Horn85][Butt89]. Por
exemplo, um parâmetro fixo poderia simplificar suficientemente uma poligonal mais
simples, e não simplificar suficientemente uma poligonal mais complexa. Este
fenômeno pode ocorrer até mesmo dentro de uma dada poligonal, em situações da
natureza que fazem com que a estrutura do fenômeno representado pela poligonal mude.

Apesar de todos os problemas relatados, a escolha de um parâmetro fixo de tolerância


parece ser mais indicado para aplicações práticas do que, por exemplo, a minimização
do número de segmentos da poligonal [GHMS93], ou o acoplamento da distância linear
com algum critério de otimização geométrica [Crom88][CrCa91]. A escolha do
parâmetro de tolerância linear ideal é ainda discutida, não havendo consenso na
literatura. Para aplicações práticas, no entanto, vai-se levar em especial consideração as
necessidades da aplicação proposta. Portanto, a escolha do parâmetro de tolerância, seja
ele linear, angular ou de área, buscará eficiência geométrica e computacional na
generalização de poligonais para representação em tela.

Cálculo de distâncias ponto-reta. Grande parte dos algoritmos de simplificação que


serão apresentados a seguir necessita realizar de maneira eficiente cálculos de distância
entre um ponto dado e uma reta definida por outros dois pontos. A maneira mais
interessante de calcular essa distância é utilizar o produto vetorial, conforme
apresentado na seção 1.1.2, para determinar a área S do triângulo formado por um ponto
A e uma reta definida por outros dois (B e C), de acordo com a equação 1.1. Assim, a
distância do ponto A à reta definida pelos pontos B e C pode ser calculada como:

| 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.

Algoritmos hierárquicos e não-hierárquicos. O resultado do algoritmo de


simplificação pode ser (1) uma nova poligonal formada por um subconjunto dos pontos
da poligonal original, ou (2) uma poligonal que é formada por pontos distintos dos que
formam a poligonal original, à exceção do primeiro e do último [ZhSa97]. No primeiro
caso, se a aplicação de tolerâncias progressivamente menores simplesmente causam a
inclusão de novos vértices à nova poligonal, o algoritmo é dito hierárquico [Crom91].
Mais formalmente, o algoritmo hierárquico é aquele em que todos os vértices
selecionados para produzir uma poligonal de n vértices serão também selecionados
quando for gerada uma poligonal com n+1 vértices.

Na literatura existem propostas de utilização de algoritmos hierárquicos para construir


bases de dados geográficas independentes de escala [BCA95][OoSc95]. Estes estudos
indicam que os algoritmos hierárquicos são mais eficientes na redução do tempo
operacional, já que a simplificação fica reduzida a uma operação de recuperação de
dados ou, caso tenha sido formada uma estrutura de dados adequada, a uma operação de
pruning [Crom91]. Por outro lado, os algoritmos não-hierárquicos tendem a produzir
representações mais eficientes, com relação à preservação de algumas características
geométricas da linha [BCA95], de acordo com parâmetros geométricos estabelecidos na
literatura (vide seção 0).

Classificação dos algoritmos. Uma classificação dos algoritmos de simplificação de


linhas foi proposta em [McMa87a], considerando a porção da linha que é processada a
cada passo (Tabela 1.3).

Tabela 1.3 - Classificação dos algoritmos de simplificação de poligonais


Categoria Descrição Exemplos

Algoritmos de pontos Não consideram as relações geométricas k-ésimo ponto [Tobl64]


independentes entre vértices vizinhos; operam de forma
independente da topologia seleção aleatória de
pontos [RSM78]

Algoritmos de Usam as características dos vértices vizinhos Jenks [Jenk81]


processamento local imediatos para determinar seleção/rejeição
do ponto Visvalingam-Whyatt
[ViWh93]

Algoritmos de Pesquisam além dos vizinhos imediatos, Lang [Lang69]


processamento local avaliando seções da poligonal de cada vez.
restrito estendidos O tamanho das seções depende de critérios Opheim [Ophe81]
baseados em distâncias, ângulos ou número
de vértices

Algoritmos de Pesquisam além dos vizinhos imediatos, Reumann-Witkam


processamento local avaliando seções da poligonal de cada vez. [ReWi74]
estendido irrestrito O tamanho das seções é limitado pela
complexidade geomorfológica da poligonal, Zhao-Saalfeld [ZhSa97]
e não por critérios determinados no
algoritmo

Algoritmos globais Consideram a poligonal inteira no Douglas-Peucker


processamento. Selecionam pontos críticos [DoPe73]
iterativamente.

A classificação acima não considera as propostas incluídas em [PAF95], onde são


apresentadas duas novas formas de representação simplificada de poligonais. A primeira
delas é a representação freqüencial, baseada em séries de Fourier e wavelets, que tentam
capturar as tendências oscilatórias presentes em alguns tipos de linhas, como curvas de
nível e hidrografia. A segunda é a representação da poligonal com uma seqüência de
curvas algébricas (conjuntos de arcos cúbicos), adequada para estradas e outras feições
construídas pelo homem. Esta adoção de recursos diferentes para a simplificação de
elementos diferentes conduz à necessidade de dividir a linha em seções que sejam
razoavelmente homogêneas em relação a alguns parâmetros geométricos, tais como
sinuosidade, complexidade, homogeneidade local e densidade de pontos. De modo
geral, no entanto, os algoritmos de simplificação existentes não conseguem captar este
tipo de comportamento da linha, com a possível exceção dos algoritmos globais, e ainda
assim com problemas [ViWh93].

Avaliação da qualidade da simplificação. A avaliação da qualidade da simplificação


foi proposta por McMaster [McMa86] com base em uma série de medidas geométricas.
Estas medidas são divididas em duas categorias: medidas de atributos de uma única
linha, e medidas de deslocamento entre a poligonal original e a poligonal resultante. São
ainda divididas em grupos, de acordo com a grandeza geométrica que está sendo
avaliada em cada caso. Estas medidas estão listadas na Tabela 1.4.

Tabela 1.4 - Medidas para avaliação da qualidade da simplificação de linhas


I. Medidas de A. Dados sobre o 1. Razão de mudança no comprimento da linha
atributos lineares comprimento
B. Dados sobre vértices 2. Razão de mudança no número de vértices
3. Diferença do número médio de vértices por unidade de
comprimento
4. Razão de mudança do desvio padrão de número de vértices
por unidade de comprimento
C. Dados sobre ângulos 5. Razão de mudança da angularidade (somatório dos ângulos
entre vetores consecutivos)
6. Razão de mudança da angularidade à esquerda (positiva)
7. Razão de mudança da angularidade à direita (negativa)
8. Diferença na mudança angular média por unidade de
comprimento
9. Diferença na mudança angular média para cada ângulo
individual
10. Razão de mudança do número de ângulos positivos
11. Razão de mudança do número de ângulos negativos
12. Diferença na mudança angular positiva média para cada
ângulo individual
13. Diferença na mudança angular negativa média para cada
ângulo individual
D. Dados sobre 14. Razão de mudança do número de segmentos curvilíneos
curvilinearidade (seqüências de ângulos positivos ou negativos)
15. Razão de mudança da média do número de segmentos
curvilíneos
16. Razão de mudança do comprimento médio dos segmentos
curvilíneos
17. Razão de mudança do desvio padrão do comprimento
médio dos segmentos curvilíneos
II. Medidas de E. Dados de diferenças 18. Somatório das diferenças vetoriais por unidade de
deslocamento vetoriais comprimento
linear
19. Número de diferenças vetoriais positivas por unidade de
comprimento
20. Número de diferenças vetoriais negativas por unidade de
comprimento
21. Somatório das diferenças vetoriais positivas por unidade de
comprimento
22. Somatório das diferenças vetoriais negativas por unidade de
comprimento
F. Dados de diferenças 23. Diferença de área total (área entre as poligonais)
poligonais
24. Número de polígonos-diferença positivos por unidade de
comprimento
25. Número de polígonos-diferença negativos por unidade de
comprimento
26. Diferença de área positiva por unidade de comprimento
27. Diferença de área negativa por unidade de comprimento
G. Dados de perímetro 28. Perímetro total das diferenças de área (comprimento ao
redor dos polígonos de diferença) por unidade de comprimento
29. Perímetro total das diferenças de área positivas
(comprimento ao redor dos polígonos de diferença) por
unidade de comprimento
30. Perímetro total das diferenças de área negativas
(comprimento ao redor dos polígonos de diferença) por
unidade de comprimento
Foram analisadas em [McMa86] todas as 30 medidas listadas na Tabela 1.4, para 31
poligonais cartográficas diferentes6, com características geomorfológicas variadas. As
poligonais foram inicialmente digitalizadas e “limpas”, até que se tornassem, quando
plotadas, cópias fiéis das linhas contidas nos mapas originais. Em seguida, o mesmo
algoritmo de simplificação (no caso, o algoritmo Douglas-Peucker) foi aplicado a cada
uma delas, com várias tolerâncias, obtendo-se as medidas acima para cada situação. Ao
final do processo, após uma análise estatística rigorosa, o autor concluiu pela
possibilidade de se reduzir o número de medições a apenas seis, que são suficientemente
descorrelacionadas para permitir uma comparação adequada. Estas medidas são:

Mudança percentual no número de vértices: fornece uma indicação do grau de


compactação atingido, mas só pode ser usada para verificar a qualidade da simplificação
em conjunto com outras medidas. Mais formalmente, pode ser definida como:

n′
MPCV = × 100
n

onde n ′ é o número de vértices da poligonal simplificada, e n é o número de vértices da


poligonal original.

Mudança percentual no desvio padrão do número de coordenadas por unidade de


comprimento: mede a regularidade da inserção de vértices ao longo da poligonal,
indicando se a linha resultante assumiu uma densidade uniforme de vértices em relação
à linha original. Ou seja:

σ (n ′) l ′
MPCN = × 100
σ ( n) l

onde l ′ é o comprimento da poligonal simplificada, e l é o comprimento da poligonal


original.

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.

Deslocamento vetorial total por unidade de comprimento: indica o deslocamento


geométrico total da linha com relação à original. Ou seja,
n ′−1

∑ d (v , P)
i =0
i
DVT =
l

onde P é a poligonal original, e a função d calcula a distância perpendicular entre um


ponto dado e uma poligonal (Figura 1.11a).

Deslocamento de área total por unidade de comprimento: como a anterior, indica o


deslocamento geométrico total da linha, só que considerando a área entre a poligonal
simplificada e a original:

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.

Mudança percentual do número de segmentos curvilíneos: quando processos de


suavização são aplicados juntamente com a simplificação, muitos segmentos curvilíneos
poderão ser eliminados. Cada segmento curvilíneo é caracterizado por uma seqüência de
mudanças angulares (ângulos entre segmentos consecutivos) à direita ou à esquerda.
Esta medida indica o grau de suavização obtido na simplificação, pela eliminação de
segmentos curvilíneos, e pode ser definida como:

NSC ′
MPCS = × 100
NSC

onde NSC’ e NSC representam, respectivamente, o número de segmentos curvilíneos na


poligonal simplificada e na original.

Com base nas medidas propostas em [McMa86], um estudo posterior [McMa87b]


comparou nove algoritmos, chegando à conclusão de que quatro deles apresentavam
comportamento superior: Douglas-Peucker, Opheim, Reumann-Witkam e Lang. A
avaliação visual, no entanto, indica que o algoritmo Douglas-Peucker se comportou
melhor quanto ao deslocamento de área. No entanto, é o mais computacionalmente
complexo dos quatro. O artigo conclui que o algoritmo de Lang é mais adequado para
certas tarefas de mapeamento menos exigentes, tais como mapeamento temático. Estes
algoritmos, e outros, serão apresentados em detalhes em seguida. Alguns algoritmos de
interesse específico deste trabalho, tais como Visvalingam-Whyatt e Zhao-Saalfeld, não
fizeram parte do estudo, pois são mais recentes do que ele.

Algoritmos. Existem vários algoritmos na literatura que se propõem a resolver o


problema de simplificação de poligonais. Conforme discutido na seção 0, a comparação
entre os algoritmos não pode se ater simplesmente à análise de sua complexidade
computacional. São muito importantes parâmetros de avaliação da qualidade da
representação geométrica resultante [Mari79][McMa86][Whit85], além da avaliação do
grau de compactação atingido. Considerando as aplicações em generalização, é também
necessário avaliar as possibilidades de geração de estruturas de dados hierárquicas, para
possibilitar a produção dinâmica de novas representações.

Em seguida serão apresentados alguns dos algoritmos de simplificação de linhas


propostos na literatura7. A seleção dos algoritmos foi feita com base na sua importância
histórica, no grau de correção cartográfica, em sua eficiência computacional, e também
com base na aplicabilidade ao problema de generalização dinâmica. Em todas as
descrições abaixo, será utilizada a letra n para denotar o número de pontos na linha
original, e n’ indicará o número de pontos na linha simplificada.

1.1.4.2 k-ésimo vértice [Tobl64]


Este algoritmo foi proposto por Tobler em 1964, para um experimento de generalização
de mapas para a Marinha americana [Tobl64]. É possivelmente o mais antigo algoritmo
de simplificação conhecido, e também o mais simples. A idéia é formar a nova
poligonal selecionando um vértice a cada k, sendo k determinado pelo usuário, e
desprezando os demais. O grau de generalização obtido é bastante grosseiro, uma vez
que o algoritmo não considera qualquer fator geométrico, correndo portanto o risco de
descaracterizar completamente a linha.

Observe-se que a mesma lógica é utilizada para simplificar imagens digitais,


selecionando arbitrariamente um pixel a cada k, em um processo conhecido como
subamostragem [Jain89], que é um caso particular da reamostragem pelo método do
vizinho mais próximo, quando se reduz o tamanho da imagem [Wolb90]. O método tem
também pouco sucesso pois, apesar de ser simples, tende a provocar o efeito de aliasing
sobre a imagem.

Complexidade computacional. O(n/k) = O(n’)

1.1.4.3 Vértice aleatório [RSM78]


Proposto por Robinson et al. [RSM78], este algoritmo pouco acrescenta ao do k-ésimo
vértice. Parte do princípio de que a linha cartográfica é composta por vértices

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.

Complexidade computacional. O(n’)

1.1.4.4 Jenks [Jenk81]


Este algoritmo considera uma seqüência de três vértices na linha, calculando a distância
do vértice intermediário à reta definida pelos outros dois [Jenk81]. Quando esta
distância é inferior a uma tolerância dada, o vértice central é eliminado, e o algoritmo é
reiniciado com o primeiro, o terceiro e o quarto vértices. Se a distância exceder a
tolerância, o segundo vértice é mantido, e o processamento recomeça a partir dele
(Figura 1.11a). Apesar de não apresentar um tratamento mais sofisticado da geometria
da linha, este algoritmo consegue eliminar os vértices efetivamente desnecessários, ou
seja, que estão alinhados com os vértices anterior e posterior, e portanto são
geometricamente dispensáveis. Em especial, este comportamento é melhor caracterizado
quando a tolerância é bastante pequena.

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.

Complexidade computacional. O pior caso do algoritmo de Jenks ocorre quando todos


os vértices são eliminados. Assim, cada iteração vai testar se o vértice vi ( 2 ≤ i ≤ n − 2 )
vai ser ou não mantido, calculando as distâncias dos vértices entre v2 e vi à reta definida
por v1 e vi+1, totalizando portanto i - 2 cálculos de distância. Este comportamento pode
ser traduzido pelo seguinte somatório:
n −1
 (n − 2)(n − 1) 
(n − 2) ⋅ ∑ (i − 2) = (n − 2) ⋅  − 2 ⋅ ( n − 2) 
i =2  2 

A complexidade computacional do algoritmo de Jenks no pior caso é, portanto, O(n2).

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.

1.1.4.5 Reumann-Witkam [ReWi74]


Este algoritmo [ReWi74] utiliza, em cada iteração, duas linhas paralelas a cada
segmento da poligonal para determinar uma região de eliminação de vértices.
Naturalmente, a tolerância é precisamente a metade da distância entre as paralelas. A
poligonal é analisada seqüencialmente, sendo buscado o primeiro segmento que
intercepta uma das duas paralelas. Sendo vi vi+1 o segmento localizado, o vértice vi é
mantido e todos os intermediários, entre o vértice inicial e vi, são descartados.
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

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

Figura 1.12 - Algoritmo Reumann-Witkam


No exemplo da Figura 1.12, observe-se que, até o vértice v19, poucos vértices haviam
sido eliminados. Aplicando as paralelas a partir de v19, na direção do segmento v19 v20, é
possível eliminar os vértices v20 a v22 (Figura 1.12a). O processamento é retomado a
partir do vértice v23 (Figura 1.12b), desta vez eliminando o vértice v24. Reiniciando de
v25, elimina-se v26 (Figura 1.12c). O processamento termina em seguida, eliminando v28
e terminando no último vértice, v29 (Figura 1.12d). No total, doze vértices foram
eliminados.

O algoritmo Reumann-Witkam é, segundo a classificação proposta por McMaster


[McMa87a], do tipo processamento local estendido irrestrito, pois a verificação é
iniciada em um determinado vértice, e prossegue até que algum segmento tenha
interceptado uma das paralelas, ou até que a linha termine. Opheim [Ophe81] propôs
uma variação deste enfoque em que são impostos limites quanto à seção da linha que é
analisada, produzindo assim um algoritmo com processamento local estendido restrito.
São definidos uma distância mínima (dmin) e uma distância máxima (dmax), que
funcionam limitando, juntamente com as paralelas, uma região que contém todos os
vértices que serão eliminados. Como no Reumann-Witkam, o processamento recomeça
no primeiro vértice do primeiro segmento que sai da região limitada. Esta variação
apresenta a tendência a preservar melhor a aparência das curvas, pois evita que vértices
muito próximos e vértices muito distantes do vértice de partida sejam eliminados.
Conseqüentemente, o grau de compactação é ainda menor do que o que se pode alcançar
com o algoritmo Reumann-Witkam.

Na Figura 1.13a é apresentada a região de eliminação de vértices do algoritmo Opheim.


Qualquer vértice que fique dentro da área marcada será eliminado, a menos que seja o
primeiro vértice de um segmento que intercepta as linhas paralelas. É o caso do vértice
v7 na Figura 1.13b, que não será eliminado, e servirá de ponto de partida para a próxima
iteração. O vértice v6, também na Figura 1.13b, não será eliminado pois está a uma
distância inferior a dmin com relação ao vértice de partida, v5. A mesma situação se
repete a partir de v7, pois v8 precisa ser mantido e v9 se torna o novo vértice de partida
(Figura 1.13c). Partindo de v9, finalmente temos a eliminação de v10.

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)

Figura 1.13 - Algoritmo Opheim


Complexidade computacional. Como se pode perceber, cada vértice é considerado
apenas uma vez, buscando a interseção de segmentos da poligonal com as retas
paralelas. Caso a interseção ocorra, o procedimento é reiniciado a partir do último
vértice analisado, mantendo o padrão de varredura. Assim, este algoritmo é claramente
linear sobre o número de vértices: O(n). O mesmo se aplica à variação proposta por
Opheim.

Apesar de eficiente computacionalmente, seu desempenho cartográfico, por outro lado,


deixa bastante a desejar, pois tende a eliminar poucos vértices. Além disso, tende a não
eliminar pontos situados em curvas mais abertas, como o vértice v2 no caso do exemplo
da Figura 1.12. Por isso, este algoritmo foi posteriormente modificado por Roberge
[Robe85], que o robusteceu matematicamente com testes de linhas críticas verticais e
com uma verificação de pontos de inflexão. Roberge propôs também um fator de
extensão da linha crítica, visando permitir a eliminação de vértices em curvas de grande
raio.

1.1.4.6 Lang [Lang69]


Este algoritmo, proposto por Lang [Lang69], requer dois parâmetros de entrada: uma
distância de tolerância, semelhante à do algoritmo de Jenks, e um parâmetro (p) de look-
ahead, ou seja, uma quantidade de vértices que devem ser considerados a cada etapa do
processo. Por exemplo, se p for igual a 5, serão analisados os vértices v1 a v6. Nesse
caso, será calculada a distância entre os vértices v2, v3, v4 e v5 à reta que passa por v1 e
v6. Se a alguma distância obtida for maior que a tolerância, o algoritmo retrocede um
ponto (no caso, até v5) e recomeça, se necessário fazendo o mesmo enquanto existirem
vértices intermediários. Se todas as distâncias intermediárias forem menores que a
tolerância, os vértices intermediários são eliminados, e o próximo passo será iniciado no
último vértice extremo encontrado, considerando novamente p pontos à frente. No
exemplo da Figura 1.14, foi necessário recuar de v5 (Figura 1.14a) até v3, eliminando
apenas v2 (Figura 1.14d), uma vez que existiam em cada uma das etapas intermediárias
(Figura 1.14b e c) vértices fora da faixa de tolerância. O algoritmo recomeça a partir de
v3, o último vértice mantido, e vai analisar em seguida o trecho entre v3 e v8.
1 1

6
tolerância tolerância

(a) (b)

3
4

8
tolerância
tolerância

(c) (d)

Figura 1.14 - Algoritmo Lang


Este algoritmo se comporta bem do ponto de vista geométrico [McMa87a], sendo capaz
de preservar razoavelmente as características da linha original. No entanto, sofre a
influência do parâmetro de look-ahead: valores diferentes levarão a resultados
diferentes. Apesar disso, sua implementação é interessante por fixar a quantidade
máxima de pontos que serão analisados a cada etapa, possibilitando um
dimensionamento estático de memória em tempo de compilação, caso se limite o valor
de p.

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.

Complexidade computacional. O pior caso ocorre quando nenhum ponto é eliminado, e


portanto o algoritmo precisa fazer o look-ahead n / p vezes e retroceder, em cada passo,
p − 1 vezes. Em cada um dos n / p passos, o algoritmo executa ( p − 1)( p − 2) 2
cálculos de distância ponto-reta. Assim, o algoritmo é O(n), mas com um fator constante
que cresce ao ritmo de O(p2). Particularmente, quando n = p , teremos complexidade
O(n2) para o algoritmo.

No melhor caso, todos os p − 1 pontos intermediários serão eliminados na primeira


passada, e portanto teremos p − 1 cálculos de distância para cada um dos n / p passos,
e portanto o algoritmo é O(n). Observe-se que temos um compromisso entre o tempo de
processamento, dependente de p, e o grau de compactação: valores maiores de p
possibilitarão uma compactação maior, mas provocarão um aumento no custo
computacional em relação ao caso linear. Assim, a escolha do valor ideal para p é
dificultada, e dependerá de uma análise do processo de digitalização com relação à
quantidade de vértices desnecessários.

1.1.4.7 Douglas-Peucker [DoPe73]


Este é o mais conhecido e utilizado algoritmo de simplificação de pontos. Foi proposto
em 1973 por Douglas e Peucker [DoPe73], e é reconhecidamente o melhor em termos
de preservação das características da poligonal original [Mari79][McMa87a],
especialmente se utilizado com tolerâncias pequenas [ViWh90]. Curiosamente, o
algoritmo foi proposto quase que simultaneamente por Ramer [Rame72] e Duda e Hart
[DuHa73], embora visando aplicações diferentes. O algoritmo Douglas-Peucker
permanece sendo o mais citado na literatura de geoprocessamento, uma vez que foi
originalmente publicado em um periódico da área de cartografia.
Procedimento Douglas-Peucker(linha, numvert, tol)

Procedimento DP(a, f, tol)

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.

Programa 1.15 - Algoritmo Douglas-Peucker


Funcionamento. O algoritmo é recursivo (Programa 1.15), e a cada passo processa o
intervalo de pontos contido entre um vértice inicial (chamado de âncora) e um vértice
final (denominado flutuante). É estabelecido um corredor de largura igual ao dobro da
tolerância, formando duas faixas paralelas ao segmento entre o âncora e o flutuante
(Figura 1.16), como no algoritmo de Lang. A seguir, são calculadas as distâncias de
todos os pontos intermediários ao segmento básico, ou seja, contidos entre o âncora e o
flutuante. Caso nenhuma das distâncias calculadas ultrapasse a tolerância, ou seja,
nenhum vértice fica fora do corredor, então todos os vértices intermediários são
descartados. Caso alguma distância seja maior que a tolerância, o vértice mais distante é
preservado, e o algoritmo é reiniciado em duas partes: entre o âncora e o vértice mais
distante (novo flutuante), e entre o vértice mais distante (novo âncora) e o flutuante. De
acordo com este processo, os pontos tidos como críticos para a geometria da linha, a
cada passo, são mantidos, enquanto os demais são descartados.

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

Figura 1.15 - Linha original, 29 vértices


Para a análise deste algoritmo e dos próximos será utilizada a poligonal da Figura 1.15.,
com 29 vértices. As figuras seguintes ilustram melhor o comportamento do algoritmo
Douglas-Peucker. Inicialmente, são calculadas as distâncias dos vértices 2 a 28 até a reta
definida pelos vértices 1 e 29. O vértice mais distante nesta primeira iteração é o 15, a
uma distância muito superior à tolerância (Figura 1.16). Assim, o vértice 15 é
selecionado e o procedimento é chamado recursivamente duas vezes, entre os vértices 1
e 15 e entre os vértices 15 e 29. Continuando pela primeira chamada, o vértice mais
distante da reta entre 1 e 15 é o 9, também a uma distância superior à tolerância, e
portanto é selecionado (Figura 1.17). Duas novas chamadas recursivas são feitas, e
agora estão empilhados os intervalos 1-9, 9-15 e 15-29. No intervalo 1-9, temos também
que preservar o vértice 3, e portanto ficamos na pilha com os intervalos 1-3, 3-9, 9-15 e
15-29 (Figura 1.18). Analisando agora o intervalo 1-3, verificamos que o vértice 2 pode
ser dispensado (Figura 1.19). Ao final, são preservados os vértices 1, 3, 4, 6, 9, 15, 16,
17, 22, 24, 27 e 29, ou seja, 41% do número original de vértices (Figura 1.20).

A utilização de recursividade no processamento do algoritmo já inspirou


implementações paralelas [Mowe96], em que cada nova subdivisão do problema vai
sendo atribuída a um processador diferente, sendo gerada ao final uma lista dos vértices
selecionados. No entanto, a grande diferença entre o melhor e o pior caso de
processamento (vide análise de complexidade computacional) podem ser um problema,
uma vez que poderá haver pouco equilíbrio entre as tarefas atribuídas a cada
processador [HeSn92].

15

29

tolerância

Figura 1.16 - Douglas-Peucker, primeiro passo: seleção do vértice 15


15

29

9
1

tolerância

Figura 1.17 - Douglas-Peucker, segundo passo: seleção do vértice 9


15

3
29

9
1

tolerância

Figura 1.18 - Douglas-Peucker, terceiro passo: seleção do vértice 3


15

3
2 29

9
1

tolerância

Figura 1.19 - Douglas-Peucker, passo 4: eliminação do vértice 2


O resultado deste algoritmo é aclamado pela literatura como sendo o que mais respeita
as características (ou, como no título do artigo de Douglas e Peucker, a “caricatura”) da
linha cartográfica [Mari79][Jenk89][McMa87a]. Assim, este algoritmo veio a ser a
escolha dos desenvolvedores de software comercial na implementação de funções de
simplificação de linhas para processamento pós-digitalização [LiOp92], ou seja, para
limpeza de vértices desnecessários. O uso do algoritmo Douglas-Peucker em
generalização, no entanto, é comprometido pelo seu comportamento em situações de
generalização mais radical, ou seja, com tolerâncias maiores [ViWi95]. Conforme a
situação, o algoritmo pode ser levado a escolher vértices que terminam por deixar a
linha com uma aparência pouco natural [ViWh93], com tendência a apresentar “picos”
(como no exemplo da Figura 1.21, entre os vértices 17, 24 e 29), com ângulos agudos e
mudanças bruscas de direção.

15
16

17

3 29
4

9
22
1

6 24
tolerância

Figura 1.20 - Douglas-Peucker, final


Se a mesma linha da Figura 1.15 for processada novamente com uma tolerância, por
exemplo, quatro vezes maior que a apresentada, seriam preservados apenas os vértices
1, 9, 15, 17, 24 e 29, todos pertencentes à solução anterior (Figura 1.21). Portanto, o
algoritmo de Douglas-Peucker é hierárquico, pois os pontos são sempre selecionados na
mesma ordem, e a tolerância serve para determinar até que ponto o processamento deve
ser realizado.
15

17

29

9
1

24

tolerância

Figura 1.21 - Douglas-Peucker, simplificação radical


Se a tolerância for igual a zero, todos os vértices serão eventualmente selecionados. O
armazenamento das subdivisões nos permite representar a hierarquia dos vértices em
uma árvore binária [Crom91][Oost93]. Em cada nó desta árvore é representado um
vértice selecionado, e é armazenado o valor da distância calculado por ocasião da
seleção, que corresponde ao valor maxd do Programa 1.15 (Figura 1.22). Tendo sido
estabelecido um valor de tolerância, basta caminhar na árvore em preordem para
determinar quais vértices serão selecionados. Quando um nó interno contiver um valor
de distância inferior à tolerância, o vértice correspondente e todos os descendentes
poderão ser eliminados, não sendo necessário continuar com o caminhamento. Observe-
se, no entanto, que a árvore binária pode ser bastante desbalanceada, e dificilmente será
completa, o que virá a dificultar o seu armazenamento no banco de dados.
15
2.632

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

Figura 1.22 - Árvore binária formada a partir do exemplo da Figura 1.15


Complexidade computacional. Como no caso do quicksort [Knut73], a análise da
complexidade computacional do algoritmo Douglas-Peucker depende da escolha do
vértice mais distante, análogo ao pivô do algoritmo de classificação, o que vai
determinar o número de cálculos de distância ponto-reta necessários (analogamente ao
número de comparações no caso do quicksort). Para eliminar a influência do parâmetro
de tolerância na análise do pior caso do algoritmo, é necessário considerar que todos os
vértices serão selecionados, ou seja, n ′ = n , o que equivale a fazer a tolerância igual a
zero.

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

Como geralmente n >> 2 , pode-se simplificar a Equação 1.11 para obter:

 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

A solução da Equação 1.13 é, portanto, a complexidade computacional do algoritmo


Douglas-Peucker no pior caso: O(n2). O pior caso também pode ocorrer quando o
objetivo é formar a estrutura de dados exemplificada na Figura 1.22, pois aquela
situação equivale a processar toda a poligonal considerando tolerância zero.

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

O comportamento em situações reais, portanto, depende fortemente do parâmetro de


tolerância e da escolha do vértice mais distante em cada passo. Tolerâncias baixas,
significando a preservação de uma quantidade maior de vértices, indicam um tempo de
processamento maior. Por outro lado, tolerâncias grandes fazem com que o
processamento seja resolvido com poucas iterações, e portanto em menos tempo. Uma
análise considerando tolerância zero e quebra em um vértice intermediário escolhido
aleatoriamente indica que o tempo de execução médio é um fator de 2 ⋅ log(e) ≅ 2,885
sobre o caso linear [HeSn92].

A literatura contém propostas para melhorar o desempenho do algoritmo Douglas-


Peucker com o uso de técnicas de geometria computacional. Hershberger et al.
[HeSn92] observam que, quando a divisão do problema produz um subproblema com
tamanho quase igual ao original, o algoritmo Douglas-Peucker precisa recomeçar o
processamento do zero, sem armazenar ou levar em conta qualquer conhecimento sobre
a geometria da linha que poderia ter sido obtido na primeira iteração. Assim,
propuseram uma variação baseada no path hull, uma estrutura de dados baseada no
fecho convexo9 aplicado a uma linha [DGHS88], buscando maior eficiência na etapa de
seleção do vértice mais distante.

Figura 1.23 - Os pontos do conjunto convexo C mais distantes


da reta r estão em uma das tangentes a C paralelas a r
A modificação proposta parte do princípio de que o vértice mais distante, utilizado para
a divisão, é necessariamente um dos que compõem o fecho convexo dos vértices da
poligonal. Esta constatação parte de um lema da geometria computacional que garante
que, dados um conjunto convexo C e uma reta r, os pontos de C mais distantes de r
estarão em uma das duas tangentes a C paralelas a r (Figura 1.23). Se C é um polígono
convexo, então apenas os seus vértices precisam ser considerados para determinar o
ponto mais distante de uma dada reta. Considerando a implementação deste conceito, o
path hull é definido da seguinte maneira:

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.

Um aspecto que caracteriza o algoritmo Douglas-Peucker, e que é utilizado em vários


outros algoritmos, é o conceito de banda de tolerância, às vezes chamado de corredor
de tolerância. Visvalingam e Whyatt [ViWh93] observam que, embora a utilização do
critério de largura de banda para determinar pontos a eliminar seja bastante razoável, a
escolha do vértice mais distante como ponto crítico ou ponto característico da linha é
questionável do ponto de vista cartográfico. Dessa forma, contestam também a
classificação do Douglas-Peucker como algoritmo global, uma vez que, a partir do
momento da separação da linha em duas, a avaliação da linha quanto à continuação do
processo de seleção de pontos passa a não mais abranger todos os vértices. Conforme já
observado, a preservação do ponto mais distante leva à geração e conservação de
“picos” na linha, deteriorando sua aparência em simplificações mais radicais. Alguns
autores atribuem este fato à escolha de um valor único para a tolerância, indicando que é
mais razoável ter variações neste valor de acordo com a geomorfologia da linha
[Horn85][PAF95], mas até o momento nenhuma variação proposta provou resolver
integralmente o problema.

Embora exista um conceito geral de que os vértices selecionados pelo algoritmo


Douglas-Peucker sejam os “críticos”, estudos demonstram que os vértices considerados
críticos por humanos nem sempre coincidem com os selecionados pelo algoritmo. Mais
grave do que isso é a constatação de que os vértices são selecionados de maneira
desbalanceada, isto é, existe a tendência de selecionar vértices demais em áreas mais
ricas em detalhes, e vértices de menos nas regiões geometricamente mais simples,
causando ao mesmo tempo o efeito já descrito de “picos” e o detalhamento excessivo de
áreas pouco significativas no sentido global. Isto é explicado pelo fato do
comportamento do algoritmo ser invariante com relação à escala, ou seja, independente
da escala o algoritmo continua eliminando vértices menos críticos em vez de feições
menos significativas, e no processo vai deixando para trás vértices “críticos” que
terminam por introduzir distorções esteticamente inaceitáveis na linha. Para corrigir esta
distorção, Thapa ([Thap88] apud [ViWh90]) observa que alguns dos vértices críticos
precisam ser eliminados para que se possa obter linhas generalizadas suaves, uniformes
e agradáveis esteticamente. Neste conceito, portanto, existem vértices críticos que não
são tão críticos assim.

Outro problema amplamente reportado na literatura [ViWh90] diz respeito à variação


que se pode obter no resultado final quando se varia a linha âncora-flutuante inicial. É o
caso da aplicação do algoritmo Douglas-Peucker a poligonais fechadas: dependendo do
ponto de partida, ou da estratégia de particionamento da poligonal fechada em duas ou
mais poligonais abertas, um resultado diferente será obtido.

Mais grave ainda é a possibilidade, já também amplamente documentada na literatura


[ViWh90], de que o algoritmo Douglas-Peucker produza, em situações de generalização
mais radical, modificações na topologia da linha (como por exemplo auto-interseções),
ou modificações na sua situação com relação a linhas vizinhas (como interseções entre
curvas de nível simplificadas). Trata-se de um comportamento francamente indesejável,
que precisa ser verificado em implementações mais robustas do algoritmo, com o uso de
rotinas específicas para detectar este tipo de problema.

1.1.4.8 Zhao-Saalfeld [ZhSa97]


Este algoritmo utiliza uma técnica denominada sleeve-fitting, para realizar a
simplificação de poligonais em tempo linear [ZhSa97]. O processo é baseado em uma
medida angular variável para verificar o atendimento ao critério de tolerância, que
apesar disso é expresso em termos de máxima distância perpendicular.

A verificação da tolerância perpendicular através de medidas angulares é feita utilizando


alguns conceitos geométricos. Inicialmente, é definida a medida α(p1, p2) como sendo o
ângulo do vetor p1p2 com a horizontal (eixo X), calculado em sentido anti-horário.
Observe-se que o sentido é importante, e portanto p1 p2 ≠ p2 p1 . A partir de α, é
definido o setor limite, da seguinte forma (Figura 1.24):

Definição 1.2 - O setor limite do ponto p e ângulos α1 e α2 é o conjunto dos pontos


do plano cujo ângulo a está entre α1 e α2. Ou seja,
A( p, α1 , α 2 ) = {q ∈ R 2 |α1 ≤ α ( p, q ) ≤ α 2 } .

α2
α1

Figura 1.24 - Setor limite


Pode-se sempre assumir que, no setor limite, o ângulo inicial α1 é menor que o ângulo
final α2. Para garantir isso, basta somar 360o a α2 quando este for menor que α1. Assim,
é possível definir a operação de interseção de setores limite baseados no mesmo ponto,
da seguinte forma (Figura 1.25):

Definição 1.3 - A interseção de dois setores limite A( p, α1 , α 2 ) e A( p, α 3 , α 4 ) é um


terceiro setor A( p, α ′ , α ′′) = A( p, α1 , α 2 ) ∩ A( p, α 3 , α 4 ) , onde α ′ = max(α1 , α 3 ) e
α ′′ = max(α 2 , α 4 ) . Se α ′ > α ′′ , então A( p, α ′, α ′′) = ∅ .

α4

α2

α3

α1

Figura 1.25 - Interseção de setores limite


No caso da distância perpendicular, o interesse dos algoritmos de simplificação está em
calcular a distância de um vértice vk à reta definida por dois vértices da poligonal, vi e vj,
sendo i< k < j. Testar esta distância contra uma tolerância ε equivale, portanto, a
verificar se vk pertence ao setor limite A(p, α1, α2) sendo α1 = α(vi, vj) - δ, α2 = α(vi, vj)
+ δ, e δ = arco seno(ε / |vivj|) (Figura 1.26). Isto ocorre quando α1 ≤ α (vi , v k ) ≤ α 2 .
Assim, é possível testar se um vértice atende ou não ao critério de tolerância apenas
calculando o ângulo α(vi, vk) em cada passo, uma vez que todos os demais parâmetros
(α1, α2, δ) são constantes locais.

ε
vj
vk ε


vi

Figura 1.26 - Equivalência entre setor limite e tolerância perpendicular


O algoritmo Zhao-Saalfeld é iniciado calculando o setor limite entre o primeiro e o
terceiro vértices, de acordo com o processo descrito acima. O segundo vértice é testado
contra este setor limite. Caso esteja fora dele, o segundo vértice é mantido e o
processamento recomeça a partir dele. Caso contrário, o segundo vértice será
descartado, e nova avaliação do setor limite é feito entre o primeiro e o quarto vértices.
É calculada a interseção entre este setor limite e o setor limite anterior. O terceiro
vértice é testado contra a interseção dos setores, caso o resultado não seja o conjunto
vazio, e aplicam-se as regras de aceitação e rejeição descritas para o segundo vértice. Se
a interseção dos setores limite for anulada, o vértice que está sendo testado (no caso, o
terceiro) é mantido, e o processamento recomeça a partir dele.

Note-se que o algoritmo prossegue de forma incremental, e é possível verificar a


exclusão de grandes seqüências de vértices sem recorrer a verificações de trás para
diante, como no caso do algoritmo de Lang, ou recursões, como no caso do Douglas-
Peucker. No entanto, o método é altamente dependente do parâmetro de tolerância,
produzindo resultados diferentes de acordo com a variação deste parâmetro. Assim, o
algoritmo Zhao-Saalfeld, embora seja bastante eficiente do ponto de vista
computacional, não produz uma hierarquia dos vértices de acordo com sua importância
na poligonal, e portanto tem sua utilização para generalização dinâmica dificultada.
Uma variação, proposta no artigo, permite inclusive a determinação de novos vértices,
totalmente diferentes dos originais, formando uma nova poligonal que cabe dentro do
mesmo sleeve que contém a poligonal original.

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.

Complexidade computacional. Verifica-se que o processo de reavaliação do setor limite


a cada passo confere a este algoritmo um comportamento claramente linear. O único
laço presente é, conforme descrito, aquele em que o setor limite específico para o vértice
corrente é calculado, e é obtida sua interseção com o resultado da interseção do setor
corrente inicial com todos os subseqüentes.

1.1.4.9 Visvalingam-Whyatt [ViWh93]


Este algoritmo propõe uma inversão da lógica utilizada pela maioria dos demais vistos
até agora, que tratam de selecionar os vértices da poligonal que são necessários para
atingir o critério de proximidade. Ou seja, os vértices considerados críticos para a
manutenção das características da linha são selecionados e mantidos. No algoritmo de
Visvalingam-Whyatt, ao contrário, os pontos menos significativos são progressivamente
eliminados [ViWh93].
vi

v i+1

v i-1

Figura 1.27 - Área efetiva do vértice vi


Também no critério de proximidade este algoritmo se distingue dos demais, uma vez
que utiliza o conceito de área efetiva, em vez de distâncias ou ângulos. A área efetiva
correspondente a um vértice vi é a área do triângulo formado pelos vértices vi-1, vi e vi+1
(Figura 1.27). A cada passo, o vértice com menor área efetiva é eliminado, e a área
efetiva dos dois vértices adjacentes a ele é recalculada, desconsiderando o vértice
eliminado (Programa 1.16).
Procedimento Visvalingam-Whyatt(linha, numvert, tol_area)

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.

Programa 1.16 - Algoritmo Visvalingam-Whyatt


O critério de eliminação baseado na área efetiva se inspira precisamente nas medidas
propostas por McMaster [McMa86] (vide seção 1.1.4.1); no entanto, a medida proposta
é global (linha simplificada versus linha original), enquanto no algoritmo a avaliação é
feita a cada passo, ou seja, entre a versão anterior da linha e a versão atual. É possível
armazenar uma lista contendo os pontos eliminados em ordem, juntamente com a área
efetiva correspondente, para que seja possível hierarquizar o resultado e repetir a
simplificação dinamicamente. No entanto, Visvalingam e Whyatt [ViWh90] alertam
para o problema de que não é possível obter um ranqueamento dos vértices
simplificados que seja universalmente aceitável, e demonstram este fato utilizando
comparações entre linhas simplificadas manualmente e usando o algoritmo Douglas-
Peucker. Como o Douglas-Peucker é hierárquico e trabalha recursivamente, em
ocasionalmente são selecionados vértices em situações particulares (por exemplo, no
meio de curvas abertas) em estágios preliminares do algoritmo, impedindo que outros
vértices, perceptivelmente mais críticos (por exemplo, nas extremidades dessas curvas
abertas) sejam selecionados, distorcendo portanto o resultado final.

Um problema o algoritmo Visvalingam-Whyatt, destacado pelos próprios autores, é a


escolha do valor de parada: a partir de que área efetiva o procedimento deve ser
interrompido? Uma correlação direta da área efetiva com a distância perpendicular,
como utilizada no Douglas-Peucker, não pode ser feita, pois a distância entre os vértices
extremos pode variar. No entanto, os experimentos realizados pelos autores indicam que
o algoritmo oferece oportunidades para simplificação mínima (apenas filtragem de
vértices desnecessários), utilizando tolerâncias pequenas, e também para generalização.
Isto provavelmente deriva do fato de se utilizar uma medida local – a área efetiva –
considerada globalmente a cada passo (eliminando o ponto com menor área efetiva entre
todos os remanescentes na linha).

Geometricamente, o algoritmo se comporta de maneira diferente do algoritmo Douglas-


Peucker, uma vez que apresenta uma tendência a “cortar cantos”, e a eliminar
progressivamente as características inerentes ao tamanho da feição (Figura 1.28). O
resultado visual é mais interessante em simplificações mais radicais, pois produz uma
“caricatura” livre das distorções grosseiras que caracterizam os resultados da aplicação
do algoritmo Douglas-Peucker com tolerâncias grandes (na Figura 1.28b foi utilizada
tolerância de 100 metros, equivalente a 2mm em escala 1:50.000), como a geração de
“picos” (Figura 1.28b). Por outro lado, a eliminação de uma quantidade menor de
vértices produz uma simplificação mínima razoável, semelhante à produzida pelo
algoritmo Douglas-Peucker.

(a) (b) (c)

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.

(a) (b) (c) (d)

Figura 1.29 - Lago da Figura 1.28, original (a) e simplificações por


Douglas-Peucker (b) e Visvalingam-Whyatt (c e d), plotado
em escalas 1:100.000 e 1:200.000
Um aspecto ainda melhor poderia ser alcançado caso se permitisse a utilização do
Visvalingam-Whyatt com mais vértices do que os retidos pelo Douglas-Peucker. Na
Figura 1.29d, por exemplo, a representação utilizou o dobro dos vértices que foram
mantidos na Figura 1.29b e Figura 1.29c, obtendo uma aparência mais natural, mas
ainda razoavelmente simples.

Complexidade computacional. A implementação deste algoritmo necessita de alguma


estrutura de dados que facilite a seleção, a cada passo, do vértice cuja área efetiva seja
mínima. A escolha natural é uma fila de prioridades, sob a forma de um heap binário.
Nessa estrutura de dados, a raiz contém sempre o menor elemento, e elementos de um
determinado nível são sempre menores que os elementos do nível hierarquicamente
inferior. Assim, a inserção inicial (criação do heap) é feita em tempo O(n log n),
enquanto a retirada é feita em tempo constante [Zivi96] [Sedg90].

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.

1.1.4.10 Chan-Chin [ChCh96]


Este algoritmo propõe uma formulação diferente para o problema de simplificação,
baseada na constatação de que a maioria dos algoritmos usualmente encontrados na
literatura não oferece qualquer garantia de otimalidade na solução [ChCh96]. A idéia é
obter, por meio de técnicas de otimização bastante conhecidas, a solução para um dos
seguintes problemas:

• mínimo número de segmentos: dada uma poligonal P e uma tolerância ε, construir


uma nova poligonal P’ com distância perpendicular inferior a ε, de modo que esta
poligonal tenha o menor número possível de segmentos;
• mínimo erro: dada uma poligonal P e um número máximo de segmentos (m),
construir uma poligonal aproximada P’ com m ou menos segmentos de modo que o
erro total seja mínimo.

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.

Para a solução do problema do mínimo número de segmentos, o primeiro passo é


construir um grafo G = (V , E ) , onde cada vértice v ∈V representa um vértice vi da
poligonal original P. O conjunto de arestas E é formado por todos os pares (r, s) tais que
o erro correspondente ao segmento vrvs é inferior a ε, ou seja, E = {(r, s) | r < s
e erro(r, s) ≤ ε}. A função erro é exatamente a que determina a distância perpendicular,
conforme utilizada em diversos outros algoritmos, como o Douglas-Peucker. O grafo G
é chamado de ε-grafo de P.

A solução do problema consiste em encontrar o menor caminho em G de v0 até vn-1,


considerando custo unitário para cada aresta de E. Os vértices encontrados nesse
caminho mínimo serão exatamente os vértices da poligonal aproximada P’, e o
comprimento do caminho mínimo informa quantos segmentos existirão em P’. Esta fase
pode ser executada em tempo O(n log n), que é o melhor tempo para o algoritmo
clássico de Dijkstra [Baas88] [Tarj83].

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.

Um outro problema a considerar é determinar se a escolha de vértices que minimizam o


número de segmentos da poligonal resultante é capaz de produzir resultados aceitáveis
do ponto de vista da estética e funcionalidade cartográficas. Além disso, existe o
problema do tempo de processamento e o fato de o algoritmo não produzir uma
hierarquia de vértices na saída, sendo portanto de aplicação pouco indicada para
generalização dinâmica. No entanto, como os resultados produzidos são garantidamente
ótimos quanto ao número de vértices e segmentos, torna-se possível utilizar o resultado
deste algoritmo para verificar e comparar a eficiência dos demais quanto à compactação
da poligonal.
1.1.4.11 Li-Openshaw [LiOp92]
Li e Openshaw [LiOp92] formularam uma série de algoritmos para simplificação de
linhas a partir de um chamado “princípio natural” da generalização. Este princípio parte
da constatação de que existem limites para a capacidade humana de perceber detalhes, e
também limites quanto à resolução dos dispositivos utilizados para visualização, como
os monitores de vídeo dos computadores atuais. Por exemplo, considere-se se um
determinado objeto poligonal, desenhado na tela do computador utilizando sua máxima
resolução. À medida em que se diminui a escala de apresentação, o objeto diminui de
tamanho na tela, utilizando uma quantidade menor de pixels para sua representação.
Eventualmente, a escala diminui tanto que o objeto se transforma em um único pixel, e
depois menos do que isso, sendo então impossível representá-lo na tela em suas
dimensões aproximadas.

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.

Li e Openshaw propuseram três algoritmos diferentes: vetorial, raster, e um terceiro que


combina ambos. No primeiro, é gerado um círculo cujo diâmetro é o dobro tamanho do
SVO sobre o primeiro vértice. Todo detalhamento interior ao círculo é desprezado, e é
substituído por um “centróide”, que é o ponto médio do segmento unindo o vértice
inicial (centro do círculo) e o ponto onde o círculo intercepta a poligonal. Nesse último
ponto, o algoritmo é reiniciado, repetindo a mesma operação até que o vértice final seja
inserido em um círculo. O resultado é interessante, pois força a eliminação de detalhes
de tamanho inferior ao do SVO, produzindo representações bastante suavizadas e de
aspecto real. No entanto, este algoritmo não seleciona vértices da poligonal original, e
portanto é não-hierárquico. Outro problema é que não é forçada a utilização do primeiro
e do último vértices, o que pode gerar inconsistências topológicas na visualização.

Na versão raster do algoritmo é utilizado, em lugar do círculo, um pixel de tamanho


equivalente ao do SVO. O processamento é essencialmente o mesmo da versão vetorial,
com a diferença de estarem sendo escolhidos pixels específicos, dentro de uma matriz,
que ficarão “ligados” para representar a poligonal.

A versão raster-vector combina os pontos positivos das duas alternativas anteriores. É


utilizado um quadrado, como na versão raster, mas que pode estar posicionado
arbitrariamente, como o centróide da versão vetorial. Os resultados da aplicação deste
algoritmo apresentam boa consistência geométrica, especialmente quando comparados
com resultados do algoritmo Douglas-Peucker em simplificações radicais [LiOp92]. No
entanto, os autores apontam problemas na simplificação de corredores estreitos, que
podem ser fundidos em uma só linha, gerando uma aparência indesejável. Outro
problema apontado corresponde aos critérios de escolha do tamanho do SVO para
geração de representações em outras escalas. Testes e experiências realizados pelos
autores indicam como adequado valores da ordem de 0,5 a 0,6 mm.

1.1.4.12 Comparação entre os algoritmos


Como foi visto nesta seção, existem muitos algoritmos para simplificação de poligonais,
com boa eficiência computacional e comportamento geométrico aceitável dentro de
limites. Dentre os algoritmos apresentados, o Douglas-Peucker se destaca por ser o mais
utilizado nos sistemas comerciais, e por viabilizar a construção de uma árvore binária
para estruturar o resultado do processamento. É também um algoritmo que apresenta
bons resultados na simplificação com tolerâncias baixas, com a manutenção de uma
parcela significativa dos vértices. No entanto, seu comportamento geométrico deixa a
desejar em situações de simplificação mais radical, com mudanças de escala
relativamente grandes. O algoritmo Visvalingam-Whyatt parece oferecer uma solução
mais interessante para a simplificação radical, mantendo a possibilidade de estruturar os
resultados para armazenamento. No entanto, a fixação do parâmetro de tolerância pode
ser problemática. O algoritmo Zhao-Saalfeld é uma alternativa interessante e rápida para
a filtragem de vértices desnecessários ao longo do processo de digitalização. Seu
funcionamento incremental, no entanto, dificulta sua utilização para generalização
dinâmica, pois não existe maneira óbvia de estruturar e armazenar seus resultados.

1.1.5 Geometria de polígonos


Uma parcela importante do trabalho de geometria computacional é realizada sobre
polígonos. Estes constituem uma maneira conveniente de representar, em um
computador, entidades do mundo real cuja abstração transmite a noção de área. Estes
tipos de objetos são muito comuns em SIG, sendo muitas vezes denominados “objetos
de área”, e são usados para representar graficamente entidades bidimensionais, tais
como o contorno de edificações, propriedades, regiões de uso do solo e, genericamente,
todo tipo de divisão territorial, tais como estados, municípios, bairros e setores
censitários. A maioria dos polígonos encontrados em bancos de dados geográficos são
muito simples, mas podem existir objetos poligonais muito complicados. Por exemplo,
é muito provável que o formato de uma edificação seja muito mais simples que a
fronteira entre dois municípios, uma vez que o primeiro é criado pelo homem, enquanto
o segundo é tipicamente definido por elementos naturais, tais como rios ou divisores de
águas.

Dado o uso intensivo de polígonos em SIG, e a natureza das aplicações usuais, os


algoritmos empregados para trabalhar com polígonos precisam ser escolhidos
cuidadosamente. Neste sentido, a eficiência pode ser uma decorrência da divisão do
polígono em partes mais simples, como triângulos. Nesta seção, serão apresentados
algoritmos que exigem a divisão do polígono em triângulos, como o cálculo de área e
centro de gravidade, além do algoritmo para triangulação propriamente dito. Além
disso, serão apresentados elementos de aritmética de polígonos, incluindo união,
interseção e criação de buffers.
1.1.5.1 Propriedades básicas e triangulação
Definições. Um polígono é a região do plano limitada por uma coleção finita de
segmentos, formando uma curva fechada simples. Um segmento é o subconjunto
fechado dos pontos de uma reta compreendidos entre dois pontos extremos.

Mais formalmente, um polígono pode ser definido como se segue:

Definição 1.4 - Sejam v 0 , v1 , 

, v n −1 n pontos do plano. Sejam


a 0 = v 0 v1 , a1 = v1v 2 , , a n −1 = v n −1v 0 n segmentos, conectando os pontos. Estes


segmentos limitam um polígono P se, e somente se, (1) a interseção de


segmentos adjacentes é unicamente o ponto extremo compartilhado por eles (ou
seja, ai ∩ a i +1 = vi +1 ), e (2) segmentos não adjacentes não se interceptam (ou
seja, ai ∩ a j = ∅ para todo i, j tais que j ≠ i + 1).

Os pontos vi e os segmentos ai são chamados respectivamente os vértices e as arestas do


polígono. As arestas formam uma curva porque são conectados seqüencialmente, pelos
pontos extremos. A curva é fechada porque o último segmento conecta o último vértice
ao primeiro. A curva fechada é denominada simples porque não existem interseções de
arestas não adjacentes. Se a condição (2) não for observada, ainda assim o objeto é
chamado, em muitas situações, de polígono, mas será um polígono não-simples (Figura
1.30). Em geral, todos os polígonos mencionados de agora em diante serão considerados
simples, a menos que explicitamente se afirme o contrário. A definição acima poderia
ser baseada na definição de linha poligonal, uma vez que o polígono é exatamente uma
poligonal fechada. O fato de ser fechada, no entanto, acrescenta propriedades
importantes, como veremos a seguir.

(a) (b)

Figura 1.30 - Polígonos não-simples (a) e simples (b)


Outro conceito importante envolvendo polígonos é o de convexidade. Um conjunto S de
pontos é dito convexo se, para quaisquer dois pontos p1 e p2 em S o segmento p1p2 está
inteiramente contido em S. Um polígono simples é então dito convexo se seu interior
forma um conjunto convexo.

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.

Observe-se também que a definição acima não considera a possibilidade da existência


de “ilhas” ou “buracos” no polígono, uma vez que o polígono deve conter todos os
pontos do plano no interior da fronteira. Em algumas definições de polígonos
encontradas na literatura, tal possibilidade é explicitamente descartada pelo uso de uma
regra que afirma que nenhum subconjunto das arestas do polígono compartilha a
propriedade do polígono, ou seja, nenhum subconjunto de arestas forma uma curva
fechada simples. Tais objetos, no entanto, freqüentemente aparecem em problemas
práticos, como o contorno de edificação apresentado na Figura 1.31. O edifício tem um
“buraco” em seu contorno, que funciona como coluna de ventilação. A área ocupada
pelo edifício pode ser aproximada por um polígono no qual o que era um buraco passa a
ser conectado com o exterior. Naturalmente, a largura do corredor entre o buraco e o
exterior determina a qualidade da aproximação, tanto visualmente (esteticamente)
quanto numericamente. Esta técnica é amplamente utilizada em SIG, para preservar a
correção de mapas temáticos e a possibilidade de gerar cálculos de área mais
aproximados.

(a) polígono com buraco (b) buraco aproximado

Figura 1.31 - Aproximação de buraco em polígono


Em geometria computacional a seqüência dos vértices de um polígono é dada em
sentido anti-horário, por convenção. Este não é o caso da maioria dos produtos de SIG,
que não exigem qualquer ordenação especial dos vértices de um polígono para aceitá-lo
no banco de dados geográfico. Alguns nem mesmo verificam se o polígono é ou não
simples, antes de aceitar sua inclusão. Isto pode levar a problemas, como veremos
posteriormente.

Alguns problemas e aplicações de geometria computacional usam a noção de polígonos


estrelados [FiCa91]. São polígonos para os quais existe um ponto z, não-externo, tal que
para todos os pontos p contidos no polígono o segmento zp está inteiramente contido no
polígono. O conjunto Z de pontos que compartilham esta propriedade é denominado
núcleo do polígono. Naturalmente, todos os polígonos convexos são em formato de
estrela, e o seu núcleo coincide com o próprio polígono. Outros exemplos de polígonos
estrelados estão apresentados na Figura 1.32.
z

Figura 1.32 - Polígonos estrelados e pontos pertencentes


ao núcleo (z)
O Problema da Galeria de Arte. O Problema da Galeria de Arte é um clássico da
geometria cuja solução conduz naturalmente ao problema de triangulação de polígonos,
importante em geoprocessamento. Neste problema, a planta poligonal de uma galeria de
arte deve ser coberta (vigiada) por um determinado número de guardas estacionários.
Cada guarda pode enxergar tudo ao seu redor mas, naturalmente, não consegue enxergar
através das paredes (arestas do polígono). Isso significa que cada guarda tem uma faixa
de 2π radianos de visibilidade. O problema consiste em determinar quantos guardas são
necessários, no mínimo, para vigiar a galeria.

Definição 1.5 - Um ponto B é visível por um ponto A em um polígono P se, e


somente se, o segmento fechado AB não contém nenhum ponto exterior a P
( AB ⊆ P ). B é dito claramente visível por A se AB não contém nenhum ponto
da fronteira de P ( ∂ P ) que não A e B ( AB ∩ ∂ P = { A, B} ).

Observe-se que esta definição permite que os vértices estejam no caminho da


visibilidade, sem bloquear a visão do guarda. Definições alternativas poderiam excluir
esta possibilidade.

Definição 1.6 - Um conjunto de guardas cobre um polígono P se todo ponto em


P é visível por algum guarda.

Portanto, um guarda é um ponto contido no polígono. Assume-se que os guardas não


impedem a visão uns dos outros. A Figura 1.33 apresenta um polígono de 6 lados que
pode ser coberto por um único guarda. Como veremos adiante, um guarda não é
suficiente para cobrir qualquer polígono de 6 lados.

Figura 1.33 - O guarda G cobre todo o polígono; o ponto X é visível a partir de G


O Problema da Galeria de Arte procura determinar o máximo, dentre todos os polígonos
de n lados, do menor número de guardas necessário para cobrir o polígono. Em outras
palavras, qual é o menor número de guardas necessário no “pior caso” para um polígono
de n vértices. Por exemplo, na Figura 1.33 apenas um guarda foi suficiente para cobrir o
polígono de 6 lados. A Figura 1.34 mostra dois casos de polígonos de 6 lados que
exigem dois guardas. Portanto, a resposta para o Problema da Galeria de Arte é “pelo
menos dois guardas”. A esta altura, diz-se “pelo menos” porque a prova desta
necessidade ainda não foi apresentada.

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.

A técnica de triangulação de polígonos empregada por Fisk usa a noção de diagonais.

Definição 1.7 - Uma diagonal de um polígono P é um segmento cujos pontos


extremos são dois de seus vértices vi e vj tais que vi e vj são claramente visíveis
um pelo outro.

Portanto, pela definição de “claramente visível”, a diagonal não pode interceptar a


fronteira do polígono. Duas diagonais são ditas não-interceptantes se sua interseção
ocorre apenas na fronteira, ou seja, em um dos vértices. Adicionando diagonais não-
interceptantes a um polígono, em qualquer ordem, e terminando o processo quando não
for mais possível inserir novas diagonais, o polígono é particionado em triângulos. Isto é
denominado uma triangulação do polígono, e é sempre possível (vide demonstração em
[ORou94]). Em geral, existem muitas maneiras de triangular um polígono, dependendo
da seqüência de lançamento das diagonais. Foi provado que qualquer polígono pode ser
triangulado usando este processo.

A prova de Fisk inicialmente executa a triangulação de um polígono, formando um


grafo no qual os nós são os vértices, e os arcos são as diagonais e os segmentos da
fronteira. Fisk mostra que este grafo pode sempre ser colorido com três cores. Uma vez
que o processo de coloração seja iniciado pelos vértices de um triângulo arbitrário, os
vértices subseqüentes são sempre forçados a assumir cores, com base no
compartilhamento de diagonais e na adjacência de triângulos (a Figura 1.35 contém um
exemplo). Já que cada triângulo compartilha pelo menos um de seus lados com outro
triângulo (em qualquer polígono com n ≥ 4), o vértice oposto tem sua coloração forçada
pelas escolhas anteriores de cores. Assim, se cada um dos n vértices recebeu uma de três
cores, pode-se concluir que pelo menos uma das cores pode ser encontrada em, no
máximo, n / 3 vértices. Ou seja, G( n ) = n / 3 , porque com um guarda em cada um
dos vértices correspondentes à cor menos usada é possível cobrir todo o polígono.

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.

Definição 1.8 - Um vértice estritamente convexo de um polígono P é um vértice


no qual, quando se caminha em sentido anti-horário pela fronteira do polígono,
faz-se uma curva à esquerda. Analogamente, um vértice reflexo é aquele no qual
se faz uma curva à direita. Observe-se que, quando se caminha pela fronteira de
um polígono em sentido anti-horário, o interior está sempre à esquerda.

Lema 1.1 - Existe sempre pelo menos um vértice estritamente convexo em um


polígono P.

Prova - Selecionar, dentre os vértices de P, aquele com a menor coordenada y.


Se existir mais de um vértice com a mesma ordenada, escolher aquele com a
maior abscissa. Seja vi este vértice. Nesta situação, tem-se y(vi-1) ≥ y(vi) e
y(vi+1) > y(vi), e o interior está totalmente acima de vi. Portanto, é necessário
fazer uma curva à esquerda em vi quando se caminha em sentido anti-horário, de
vi-1 para vi+1 , e portanto vi é um vértice estritamente convexo (vide Figura 1.36
para uma visualização da prova).
v i+1
v i-1 v i-1
v i+1

v i+1

vi vi v i-1 vi

(a) (b) (c)

Figura 1.36 - Curva à esquerda no vértice inferior mais à direita,


que tem de ser estritamente convexo
Lema 1.2 - Todo polígono P com mais de 3 vértices tem uma diagonal.

Prova - Seja vi um vértice estritamente convexo, cuja existência foi garantida


pelo Lema 1.1 . Sejam vi-1 e vi+1 os vértices imediatamente adjacentes a vi. Se o
segmento vi-1vi+1 não for uma diagonal, então ele (i) intercepta ∂ P , ou (ii) ele é
exterior a P (Figura 1.37). Em ambos os casos, o triângulo vi-1vivi+1 contém pelo
menos um outro vértice de P, uma vez que n ≥ 4. Um dos vértices incluídos no
triângulo vi-1vivi+1 irá formar uma diagonal com vi. Este vértice pode ser
encontrado pesquisando em uma linha paralela ao segmento vi-1vi+1 , começando
em vi e deslocando-a em direção a vi-1vi+1 até que um vértice x seja encontrado.
Já que o triângulo vi-1vivi+1 foi varrido desde vi, sem que qualquer outro vértice
tivesse sido encontrado, o segmento vix não intercepta ∂ P num ponto da
fronteira diferente de vi ou x, e portanto constitui uma diagonal.

v i-1 v i+1 v i-1 v i+1 v i-1 v i+1


x
x

vi vi vi

(a) (b) (c)

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.

Teorema 1.2 - Todo polígono de n vértices pode ser triangulado

Prova - Se n = 3, o polígono já é um triângulo. Se n ≥ 4, o polígono pode ser


dividido pela adição de uma diagonal, usando o processo descrito no Lema 1.2 .
Uma diagonal, quando encontrada, divide o polígono em dois sem adicionar
novos vértices. Cada uma das partes é um polígono, compartilhando uma aresta,
que é a diagonal, e cada uma das partes tem menos de n vértices. Prosseguindo,
cada parte pode ser dividida recursivamente até que se chegue a uma
triangulação completa.

A triangulação de um polígono tem diversas propriedades, que são úteis para as


aplicações.

Lema 1.3 - Toda triangulação de um polígono P com n vértices usa n - 3


diagonais e gera n - 2 triângulos.

Prova - A prova é por indução sobre o número de vértices.

Base: Se n = 3, então existem 3 - 3 = 0 diagonais e 3 - 2 = 1 triângulo.

Hipótese indutiva: Se n ≥ 4, então existem n - 3 diagonais e n - 2 triângulos.

Passo indutivo: Sejam n1 e n2 o nú mero de vértices dos polígonos P1 e P2,


obtidos pela divisão de P por uma diagonal d. Naturalmente, n = n1 + n2 + 2,
uma vez que os pontos extremos da diagonal d são contados duas vezes. Se a
hipótese indutiva for verdadeira, então P1 terá n1 - 3 diagonais e gerará n1 - 2
triângulos, e P2 terá n2 - 3 diagonais e gerará n2 - 2 triângulos. No total, existirão
(n1 -3) + (n2 - 3) + 1 = n - 3 diagonais (incluindo d), e (n1 - 2) + (n2 - 2) = n - 2
triângulos, o que confirma a hipótese indutiva.

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 π.

Em seguida, uma série de resultados que correlacionam triangulações a grafos serão


apresentados. Estas propriedades são úteis em diversas situações práticas, como será
apresentado até o fim deste capítulo.

Definição 1.9 - O dual da triangulação de um polígono é um grafo, formado por


nós que correspondem a cada triângulo, e arcos ligando nós cujos triângulos
correspondentes compartilham uma diagonal (Figura 1.38).

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.

Lema 1.4 - O dual de uma triangulação não tem ciclos.


Prova - vide [ORou94].

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.

Figura 1.38 - Uma triangulação e sua árvore dual

1.1.5.2 Área de um polígono


A área de um polígono pode ser calculada em tempo linear com relação ao número de
vértices, usando um somatório simples, baseado na soma de áreas de triângulos.

O cálculo pode ser feito como se segue. Sejam xi e yi as coordenadas do vértice vi do


polígono P, com n vértices. A área do polígono é dada por

1 n −1
A( P) = ∑ ( xi yi +1 − yi xi +1 ) (1.14)
2 i =0

Observe-se que, na expressão acima, quando se tem i = n − 1, é necessário ter x n = x 0 e


y n = y 0 , de acordo com a definição de polígono, caracterizando o seu fechamento.

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].

Caso se deseje simplesmente determinar a orientação dos vértices, existe ainda um


método mais rápido. Basta determinar o vértice inferior e mais à direita do polígono, e
então calcular o produto vetorial das duas arestas que se conectam naquele vértice. Isso
funciona porque, como já apresentado anteriormente, este vértice é necessariamente
convexo, e portanto o ângulo interno baseado nele é menor que 180o. Então, a
orientação global do polígono pode ser deduzida a partir da orientação do triângulo
formado entre este vértice e seus vizinhos imediatos. Este método é também O(n), mas
evita todas as multiplicações e somas necessárias para o cálculo da área.

1.1.5.3 Determinação do centróide de um polígono


Em muitas situações práticas, é necessário determinar, dado um polígono qualquer, seu
centro de gravidade ou centro de massa, mais conhecido em SIG como centróide. Em
SIG, o centróide é muitas vezes criado e relacionado ao polígono para viabilizar o
armazenamento de dados alfanuméricos associados no banco de dados geográfico. É
também usado como ponto de lançamento automático de textos gráficos, para
identificação de elementos em tela e plotados.

O centróide de um polígono pode ser obtido a partir da sua divisão em triângulos,


calculando em seguida a média ponderada dos centros de gravidade dos triângulos
usando suas áreas como peso10. O centro de gravidade de cada triângulo é simplesmente
a média das coordenadas de seus vértices, ou seja, as coordenadas do centro de
gravidade de um triângulo ABC seriam:

x A + x B + xC y + y B + yC
xG = e yG = A
3 3

Embora este processo seja relativamente simples, pressupõe-se a implementação de um


algoritmo de triangulação de polígonos. Os centróides dos triângulos são combinados
usando um processo de média ponderada pela área. Assim, o centróide de um polígono
formado por dois triângulos T1 e T2, cujos centróides são, respectivamente, (xG1, yG1) e
(xG2, yG2) é o ponto (xG, yG), onde

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 )

e o centróide do polígono pode ser determinado de maneira incremental, adicionando


um triângulo e seu centróide por vez e calculando as coordenadas do centróide do
conjunto.

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

Assim, temos que

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)

O resultado pode ser facilmente implementado em um algoritmo com complexidade


O(n), que naturalmente pode fornecer ao mesmo tempo a área do polígono (Programa
1.17).
função centróidePolígono(Poligono P): Ponto
início
real parcela, xc = 0, yc = 0;
inteiro i, i1;
Ponto pt;

para i = 0 até i < P.numVértices faça


início
i1 = ((i + 1) mod P.numVértices);

parcela = ((P.fronteira[i].x * P.fronteira[i1].y) -


(P.fronteira[i].y * P.fronteira[i1].x));

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.

Programa 1.17 - Função centróidePolígono


Mas apesar da simplicidade do processo, não existe garantia de que o centróide será um
ponto pertencente ao polígono. Caso seja necessário encontrar um ponto interno a um
polígono simples dado, pode-se utilizar o seguinte processo, que busca precisamente
identificar rapidamente uma diagonal do polígono [ORou94]:

• identificar um vértice convexo vi (por exemplo, o vértice inferior mais à


direita, conforme demonstrado na seção 1.1.5.1)
• para cada outro vértice vj do polígono verificar:
• se vj estiver dentro do triângulo vi-1vivi+1, então calcular a distância vivj
• armazenar vj em q se esta distância for um novo mínimo
• ao final do processo, se algum ponto interior a vi-1vivi+1 for encontrado, então
o ponto médio do segmento qvi é interior ao polígono; se nenhum ponto
interior for encontrado, então o ponto médio do segmento vi-1vi+1 (ou mesmo
o centróide do triângulo vi-1vivi+1) é interior ao polígono.

Curiosamente, parte da literatura de SIG e mesmo a nomenclatura adotada por alguns


sistemas considera uma definição alternativa de centróide, em que mesmo se situa
“aproximadamente no centro do polígono” [LaTh92]. Assim, o centróide pode ser
determinado por diversos processos, como o centro do retângulo envolvente mínimo, o
centro de um círculo inscrito ou circunscrito ao polígono, ou mesmo definido
intuitivamente pelo usuário. Uma forma freqüentemente usada para determinar um
centróide consiste em simplesmente obter a média aritmética das coordenadas x e y dos
vértices. Embora menos computacionalmente intensivo do que o método apresentado
nesta seção, o processo da média tem seus resultados afetados por características dos
objetos, ou mesmo pelo processo de digitalização dos polígonos. Como se pode
perceber na Figura 1.39, a existência, por alguma razão, de uma concentração de
vértices em uma região do polígono causa um deslocamento indesejável do centróide. O
deslocamento ocorre justamente em direção à região com maior densidade de vértices, o
que pode prejudicar aplicações simples, como o posicionamento de textos gráficos.

Figura 1.39 - Centróides calculados pela média (M) e como centro de gravidade (G)

1.1.5.4 Ponto em polígono


Um dos problemas mais importantes em SIG consiste em determinar se um dado ponto
está dentro ou fora de um polígono. É resolvido, por exemplo, várias vezes cada vez que
se usa o botão do mouse para selecionar um objeto na tela. Embora a solução seja
relativamente simples, é necessário tomar muito cuidado com casos especiais e
problemas numéricos, fazendo com que uma implementação realmente robusta seja
relativamente difícil de alcançar.

O princípio fundamental para determinar se um ponto Q está ou não dentro de um


polígono P consiste em traçar, a partir de Q, uma semi-reta em uma direção qualquer.
Quando esta semi-reta intercepta o polígono um número ímpar de vezes, então o ponto
está dentro do polígono; caso contrário, ou seja, caso exista um número par de
interseções, o ponto está fora (Figura 1.40).

Figura 1.40 - Ponto em polígono


Por conveniência, adota-se em geral uma semi-reta paralela ao eixo dos x passando por
Q e se estendendo para a direita. A contagem do número de interseções pode ser feita
com facilidade, verificando quantos segmentos têm um ponto extremo acima e outro
abaixo de yQ. Destes, é preciso verificar em quantos a interseção com a semi-reta ocorre
em um ponto de abscissa maior que xQ. A maior dificuldade está no tratamento de casos
degenerados, como:

• a semi-reta passa por uma aresta do polígono (Figura 1.41a);

• a semi-reta passa por um vértice do polígono (Figura 1.41b);

• o ponto Q está sobre a fronteira do polígono (Figura 1.41c);

• o ponto Q coincide com um vértice do polígono (Figura 1.41d).


P P

(a) (b)

P P

Q
(c) (d)

Figura 1.41 - Ponto em polígono - casos degenerados


Para estes casos, a solução está em adotar um critério para a contagem de interseções de
modo que:

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

• se a reta passa por um segmento do contorno do polígono, nenhuma interseção deve


ser considerada;

• se o ponto Q pertence a um segmento do contorno (exceto pontos extremos),


considerar como uma interseção.

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;

C.x = min(A.x, B.x);


C.y = min(A.y, B.y);
D.x = max(A.x, B.x);
D.y = max(A.y, B.y);

retorne ((Q.x >= C.x) e (Q.x <= D.x) e


(Q.y >= C.y) e (Q.y <= D.y));
fim.

Programa 1.18 - Função pontoEmRetângulo


Assim, pode-se construir um algoritmo (Programa 1.19), que claramente tem
complexidade O(n), sendo n o número de vértices do polígono. Observe-se que foi
incluído um teste de rejeição rápida (Programa 1.18), comparando o ponto com o
retângulo envolvente mínimo do polígono, considerando que este tenha sido
previamente determinado e armazenado. Este teste, que tem complexidade O(1), pode
representar um ganho de desempenho importante para SIG, onde pontoEmPolígono
é freqüentemente usada.
função pontoEmPolígono(Ponto Q, Poligono P): booleano
início
inteiro i, numInterseções = 0;
Ponto C, D;

se (não (pontoEmRetângulo(Q, P.REMp1, P.REMp2))


então retorne falso;

para i = 0 até i < P.numVértices faça


início
C = P.fronteira[i];
D = P.fronteira[i + 1];

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.

Programa 1.19 - Função pontoEmPolígono


O’Rourke [ORou94] propõe uma variação em que a interseção é considerada apenas se
um dos pontos extremos do segmento da fronteira estiver estritamente acima ou abaixo
da semi-reta, enquanto o outro pode estar do lado oposto ou sobre a semi-reta (Programa
1.2011). Desta forma, é intencionalmente forçada uma situação em que pontos

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;

se (não (pontoEmRetângulo(Q, P.REMp1, P.REMp2))


então retorne falso;

para i = 0 até i < P.numVértices faça


início
i1 = i + n - 1;

se (((P.fronteira[i].y > Q.y) e


(P.fronteira[i1].y <= Q.y)) ou
((P.fronteira[i1].y > Q.y) e
(P.fronteira[i].y <= Q.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.

Programa 1.20 - Função pontoEmPolígono1 (variação de pontoEmPolígono)


A aplicação do teste de ponto em polígono em SIG depende também do modelo adotado
para representar entidades de área. Caso apenas sejam permitidos polígonos simples, o
teste conforme apresentado poderá ser usado. No entanto, caso o modelo do SIG permita
a existência de regiões formadas por vários polígonos simples isolados, e formando
ilhas e buracos, o teste precisará ser aperfeiçoado. Uma possibilidade é testar a inclusão
do ponto em todos os polígonos simples que compõem a região, verificando os
seguintes casos:

• 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.

• Ponto contido em mais de um polígono: se o número de ilhas for igual ao número de


buracos, o ponto está fora da região (Figura 1.42b); se o número de ilhas for maior
que o número de buracos, o ponto está dentro da região (Figura 1.42a). O caso de se
ter o número de buracos superior ao número de ilhas indica um erro topológico.
Q Q

(a) (b)

Figura 1.42 - Ponto em região


Para o teste em regiões, conforme descrito acima, recomenda-se usar o Programa 1.20,
para evitar conflitos em situações em que o ponto fique na fronteira entre dois ou mais
polígonos, o que pode mascarar o resultado. Em qualquer caso, considera-se que não
existe superposição entre os polígonos que compõem a região.

1.1.5.5 Interseção, união e diferença de polígonos


Operações sobre polígonos são de fundamental importância em SIG. Através da
detecção e processamento da união, interseção e diferença de polígonos, diversos tipos
de operações, conhecidas como em conjunto como polygon overlay, são viabilizadas.
São operações fundamentais para análise espacial, usadas em situações em que é
necessário combinar ou comparar dados colocados em camadas distintas. Por exemplo,
considere-se uma consulta como “identificar fazendas em que mais de 30% da área é de
latossolo roxo”. Para executar esta análise, é necessário combinar uma camada de
objetos poligonais (os limites de propriedades rurais) com outra (o mapa de tipos de
solo), para obter uma nova camada, de cujo conteúdo podem ser selecionados
diretamente os objetos que atendem ao critério de análise colocado.

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

Este problema é também estudado com bastante intensidade em computação gráfica,


onde é denominado recorte de polígonos. O caso mais simples é o recorte de um
polígono por um retângulo, correspondendo à situação corriqueira de apresentação em
tela. O caso geral é o recorte de um polígono por outro, ambos genéricos (não
convexos), que ocorre no processamento de remoção de superfícies escondidas, em
síntese de imagens 3D. Outro uso para o recorte de polígonos é a quebra de objetos em
uma cena para processamento de ray tracing em computadores paralelos. Em
computação gráfica, o problema pode ainda incluir os casos de polígonos não simples e
polígonos com buracos [Vatt92].

Para realizar operações sobre polígonos, é interessante aplicar um passo preliminar de


detecção rápida da possibilidade interseção entre os polígonos. Assim, se não for
possível que dois polígonos P e Q tenham interseção, então podemos concluir
diretamente que P ∪ Q = { P, Q} , P ∩ Q = ∅ , P − Q = P e Q − P = Q . Uma maneira
simples de testar se dois polígonos têm ou não interseção é usar inicialmente o teste de
interseção dos retângulos envolventes mínimos (seção 1.1.2.2).

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

Figura 1.43 - Operações sobre polígonos produzindo buracos e múltiplos polígonos


Existe uma proposta de realizar a análise de interseção e de união entre polígonos
usando a técnica de varredura do plano, de maneira semelhante à interseção de n
segmentos. Esta técnica consiste em dividir os polígonos em fatias horizontais, usando
linhas que passam pelos vértices e pelos pontos de interseção entre arestas, ordenando
os pontos segundo o eixo das abscissas e fazendo a varredura do plano [NiPr82]. Cada
fatia é composta de um ou mais trapezóides, provenientes de um ou de ambos os
polígonos, sendo relativamente simples detectar sua interseção em cada fatia [LaTh92].

No entanto, um método mais interessante foi apresentado por Margalit e Knott


[MaKn89], e permite realizar operações de interseção, união e diferença em tempo
O(n log n), e partindo de polígonos que podem ter ilhas ou buracos. O algoritmo é
sensível à orientação dos polígonos, e exige que os vértices de ilhas sejam codificados
em um sentido (por exemplo, anti-horário) e os vértices de buracos sejam dispostos no
sentido inverso (horário). Isto coincide com a convenção usada para calcular a área de
polígonos, conforme apresentado na seção 1.1.5.2.

Tabela 1.5 - Orientação dos polígonos de entrada de acordo com a operação

Polígonos Operações

P Q P∩Q P∪Q P−Q Q− P

ilha ilha manter manter inverter inverter

ilha buraco inverter inverter manter manter

buraco ilha inverter inverter manter manter

buraco buraco manter manter inverter inverter

O algoritmo tem seis passos, que serão descritos a seguir.

1. Normalizar a orientação dos polígonos de entrada P e Q, e inverter a orientação de


Q dependendo do tipo de operação e da natureza (ilha ou buraco) dos dois polígonos
de entrada, de acordo com a Tabela 1.5.

2. Classificar os vértices, verificando se cada um está dentro, fora ou na fronteira do


outro polígono, usando o teste de ponto em polígono (seção 1.1.5.4). Inserir os
vértices assim classificados em duas listas circulares, PL e QL, onde aparecerão em
seqüência, de modo a definir as arestas por adjacência.

3. Encontrar as interseções entre arestas dos dois polígonos, usando o teste de


interseção de n segmentos (seção 1.1.3). Inserir os pontos de interseção na posição
apropriada em PL e QL, classificando-os como na fronteira. A partir deste ponto,
teremos um conjunto de fragmentos de arestas em lugar das arestas originais. É
necessário cuidar do caso especial de interseção ao longo de uma aresta comum, ou
parte dela. Neste caso, ambos os pontos extremos da aresta devem ser classificados
como na fronteira e inseridos nas listas.

4. Classificar os fragmentos de arestas (definidos pelos pares de vértices) formados


em PL e QL com relação ao outro polígono, entre interior, exterior ou na fronteira.
Não é necessário realizar novamente o teste de ponto em polígono. Uma aresta pode
ser considerada interior ao outro polígono caso pelo menos um de seus vértices esteja
classificado como dentro. Da mesma forma, uma aresta pode ser classificada como
exterior ao outro polígono caso pelo menos um de seus vértices esteja classificado
como fora. Se ambos os vértices estiverem classificados como na fronteira, então é
necessário verificar a situação de um ponto interno ao segmento (por exemplo, seu
ponto médio). Se este ponto estiver fora do outro polígono, então a aresta é
classificada como exterior. Se o ponto estiver dentro do outro polígono, então a
aresta é classificada como interior. Se o ponto estiver na fronteira, a aresta é
classificada como fronteira.

Arestas na fronteira constituem um caso degenerado, que requer tratamento especial.


Se existe um fragmento de aresta na fronteira de P, então necessariamente existe
também um na fronteira de Q. Estes fragmentos podem estar orientados na mesma
direção ou em direções opostas. A implementação pode decidir o que fazer nestes
casos, ou seja, se interseções com dimensão de segmento ou de ponto serão ou não
retornadas. Se as interseções como segmento forem retornadas, serão formadas por
um ciclo de duas arestas sobrepostas, cada uma em uma direção. Interseção em um
ponto será retornada como um ciclo de duas arestas, cada uma em uma direção,
ligando dois vértices sobrepostos. Desta forma preserva-se a topologia do resultado
(sempre cadeia fechada de segmentos), mas em SIG é mais interessante detectar estes
casos e retornar objetos da dimensão adequada (no caso, ponto)12.

5. Selecionar e organizar as arestas para formar os polígonos de resultado. Este


processo de seleção é baseado na combinação das duas listas em uma, denominada
RL, usando apenas as arestas que interessam para a operação, conforme definido na
Tabela 1.6.

6. Construir os polígonos de resultado, selecionando uma aresta e, com base em seu


ponto final, procurar em RL sua continuação, até fechar o polígono. Repetir o
processo, eliminando de RL a cada passo as arestas utilizadas, até que RL fique vazia.

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 Q− P

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

Os polígonos resultantes manterão a orientação adotada para ilhas e buracos, o que é


bastante conveniente.

O exemplo a seguir mostra o funcionamento do algoritmo para realizar operações sobre


os polígonos P e Q, apresentados na Figura 1.44. Ambos os polígonos são ilhas, e
portanto os vértices estão dispostos em sentido anti-horário. Como se pode perceber
visualmente, a interseção destes polígonos é formada por dois polígonos isolados, e a
união é um polígono com um buraco. Os vértices de cada polígono estão numerados da
maneira usual, e os pontos de interseção são identificados como i1, i2, i3 e i4.

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

Figura 1.44 - Interseção de polígonos


De acordo com a Tabela 1.5, para realizar operações de união e interseção sobre dois
polígonos ilha, não é necessário inverter a orientação dos polígonos P e Q dados. O
passo seguinte consiste em classificar os vértices e formar as listas PL e QL, que ficam:
p0 p1 p2 p3 p4 p5 p6 p7 p8 p9

PL f f f f d f f d f f

q0 q1 q2 q3 q4

QL f f d d f

Em seguida, os pontos de interseção i1, i2, i3 e i4 são determinados e inseridos em PL e


QL, que ficam agora:

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

O passo de classificação das arestas vem a seguir, analisando os pares de vértices na


seqüência encontrada nas listas PL e QL, definindo arestas interiores, exteriores ou de
fronteira, a partir da classificação dos vértices. O resultado é organizado na lista RL, que
fica:

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.

A partir de RL é possível construir os polígonos resultantes da interseção de P e Q. De


acordo com a Tabela 1.6, para a união selecionamos as arestas exteriores:

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.

Analisando a complexidade do algoritmo, sendo nP e nQ o número de vértices ds


polígonos originais, e ni o número máximo de interseções, verifica-se que:

1. Encontrar e, se necessário, inverter a orientação de cada polígono custa O(nP + nQ).

2. Classificar os vértices custa O(nQ) em P e O(nP) em Q. Inserir nas listas PL e QL


custa O(1), e portanto o custo total do passo é O(nP + nQ).

3. Encontrar todas as interseções entre as arestas de P e Q custa, conforme verificado na


seção 1.1.3, O((nP + nQ + ni) log(nP + nQ))13. Inserir cada uma destas interseções em
ordem nas listas PL e QL custa O(ni), gerando um custo total de O(ni2). Portanto, a
complexidade total deste passo é O((nP + nQ + ni) log(nP + nQ) + ni2).

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

5. Selecionar as arestas que interessam tem custo proporcional ao número de


fragmentos de aresta produzidos, ou seja, O(nP + nQ + ni). Estas arestas podem ser
organizadas de forma conveniente, de modo a facilitar a execução do último passo,
segundo uma lista ordenada pelo vértice inicial. A ordenação custa O((nP + nQ + ni)
log(nP + nQ + ni)), que é o custo total deste passo.

6. Construir os polígonos resultantes depende da eficiência das pesquisas na estrutura


de dados gerada no passo anterior. No caso de lista ordenada, o custo de localização
do sucessor é O(log(nP + nQ + ni)), utilizando pesquisa binária. O custo total é,
portanto, O((nP + nQ + ni) log(nP + nQ + ni)).

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].

1.1.5.6 Criação de buffers


Um dos recursos mais úteis em SIG é a capacidade de gerar polígonos que contornam
um objeto a uma determinada distância. Sua principal função é materializar os conceitos
de “perto” e “longe”, embora sem o componente fuzzy que caracteriza o raciocínio
humano nestes termos. Um exemplo de consulta que demanda a utilização de buffers:
“localizar todos os postos de gasolina ao longo de uma rodovia”. Considerando que os
postos estejam representados por um ponto, e a rodovia esteja representada pela linha de
seu eixo, é preciso encontrar uma distância que materialize o conceito de “ao longo”,
por exemplo 100 metros. O processamento é feito construindo um polígono que
contenha todos os pontos do plano localizados a 100 metros do eixo da rodovia ou
menos. Em seguida, determina-se quais postos de gasolina estão contidos neste
polígono.

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)

Figura 1.45 - Buffers elementares ao redor de ponto (a) e segmento (b)


O buffer final é exatamente a união dos buffers elementares que foram construídos
(Figura 1.46). No caso de polígonos, a união deve ser feita também com o próprio
polígono, para que todos os pontos interiores a ele sejam considerados (Figura 1.47).
Figura 1.46 - Buffer ao redor de linha

Figura 1.47 - Buffer ao redor de polígono


Ocorre também com freqüência a necessidade de se ter buffers com distância negativa,
ou seja, áreas que são construídas no interior de polígonos a uma dada distância da
fronteira. Este tipo de buffer é conhecido como skeleton, ou como setback. O
processamento é diferente apenas em um ponto: constrói-se a união dos buffers
elementares ao longo da fronteira, considerando o valor absoluto da distância fornecida,
e em seguida determina-se a diferença entre o polígono inicial e a união dos buffers
(Figura 1.48).
Figura 1.48 - Buffer “negativo” de polígono
Observe-se que, conforme foi alertado na seção 1.1.5.5, o resultado de uma operação de
criação de buffers pode ser formado por vários polígonos separados, ou por polígonos
com buracos (Figura 1.49).

(a) (b)

Figura 1.49 - Buffers com buracos (a) e formados por polígonos isolados (b)

1.1.6 Fecho convexo


O fecho convexo é uma das estruturas mais usadas em geometria computacional. Tem
utilidade em diversas situações, na geração de outras estruturas e como apoio a
algoritmos mais complexos. Exemplos do uso de fechos convexos podem ser
encontrados em robótica, reconhecimento de padrões, processamento de imagens, e até
mesmo em otimização.

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.

Numa definição mais formal, o fecho convexo de um conjunto S de pontos é o menor


conjunto convexo que contém S. Um conjunto convexo C é aquele em que
∀P1 , P2 ∈ C 
→ P1 P2 ⊂ C. Geometricamente, o fecho convexo é um polígono convexo
cujos vértices são um subconjunto de S, e que contém todos os pontos de S.

O’Rourke [ORou94] lista uma série de definições alternativas e equivalentes do fecho


convexo, as mais interessantes das quais estão relacionadas a seguir:

• O fecho convexo de um conjunto S de pontos do plano é o menor polígono convexo


P que contém S, sendo “menor” entendido no sentido de que não existe outro
polígono P’ tal que P ⊃ P ' ⊇ S .

• O fecho convexo de um conjunto S de pontos é a interseção de todos os conjuntos


convexos que contêm S.

• O fecho convexo de um conjunto S de pontos do plano é o polígono convexo


envolvente P que tem a menor área.

• O fecho convexo de um conjunto S de pontos do plano é a união de todos os


triângulos determinados por pontos pertencentes a S.

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.1.6.1 Pontos interiores e arestas extremas


Um algoritmo imediato para determinar quais seriam os vértices do fecho convexo pode
ser construído da seguinte maneira [ORou94]:

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;

4. ao final do processamento, os pontos não marcados serão os vértices do fecho


convexo.

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.

Uma alternativa um pouco menos custosa consiste em procurar determinar as arestas do


fecho convexo, da seguinte maneira [ORou94]:

1. para cada par ordenado (pi, pj) de pontos de S, definir uma reta;

2. verificar o posicionamento de todos os demais pontos de S em relação a esta 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.

O quickhull inicialmente determina os pontos extremos de S à esquerda, à direita, acima


e abaixo, ou seja, os pontos com as máximas e mínimas ordenadas e abscissas,
definindo também um retângulo envolvente mínimo para o conjunto de pontos. Isto
pode ser feito em tempo linear. Em seguida, estes quatro pontos são conectados,
formando um quadrilátero. Todos os pontos interiores a este quadrilátero podem ser
imediatamente descartados, pois são pontos interiores. O problema fica, então, reduzido
a encontrar os pontos extremos nos quatro triângulos definidos entre o quadrilátero
inicial e o retângulo envolvente mínimo do conjunto de pontos (Figura 1.50).
A
B

C
D

Figura 1.50 - Quickhull - passo inicial


Em cada triângulo, conhece-se dois pontos pertencentes ao fecho convexo. O problema
é, então, encontrar qual o ponto contido no triângulo que está mais distante do segmento
formado por estes pontos extremos, formando um novo triângulo. Por exemplo, na
Figura 1.51, a região triangular D definida pelo passo inicial contém quatro pontos. Um
triângulo é formado entre os extremos já conhecidos e o mais distante deles, que é
naturalmente pertencente ao fecho convexo. Os pontos interiores ao triângulo D são
descartados, e as novas arestas do triângulo servem de base para a construção de novos
triângulos, recursivamente, até que não seja mais encontrado qualquer ponto interior ou
exterior.

C D

Figura 1.51 - Quickhull - passo recursivo


A análise da complexidade do procedimento recursivo é feita de maneira semelhante à
do quicksort, admitindo que, a cada passo, o conjunto de pontos é dividido ao meio. A
equação de recorrência resultante indica que o algoritmo quickhull é, no pior caso,
O(n2), e portanto melhor que os algoritmos anteriores, mas pior que o ótimo esperado,
que é O(n log n) [ORou94].

1.1.6.3 Algoritmo de Graham


Este algoritmo data de 1972, e é considerado um dos pioneiros no campo da geometria
computacional. A idéia básica do algoritmo de Graham é bastante simples. Parte-se do
pressuposto que é dado um ponto p0, interior ao fecho convexo14, e assume-se que não
existam três pontos colineares, incluindo o ponto dado. Em seguida, calcula-se o ângulo
com a horizontal, no sentido anti-horário, formado pelo segmento entre o ponto p0 e
todos os demais15. Os pontos são ordenados segundo este critério. Os pontos são então
examinados um a um segundo essa ordem crescente, em uma varredura (daí a
denominação usual deste algoritmo, Graham’s scan, ou varredura de Graham), e o fecho
convexo é construído de maneira incremental ao redor de p0.

A cada passo, o fecho já determinado é correto, considerando apenas o conjunto de


pontos examinado até o momento. A avaliação de cada ponto adicional, no entanto,
pode fazer com que pontos sejam retirados do fecho, na ordem inversa à em que foram
inseridos. Por isso, costuma-se armazenar os pontos do fecho convexo em uma pilha.

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

Figura 1.52 - Algoritmo de Graham, origem em ponto interior


Estes problemas podem ser resolvidos com uma escolha mais conveniente da origem,
em particular se a origem for um ponto do fecho convexo. O ponto ideal para servir de
origem é o ponto inferior do conjunto, necessariamente pertencente ao fecho. Se
existirem diversos pontos com a mesma ordenada mínima, toma-se o mais à direita
deles. Com isso, o ângulo formado entre pn-1, p0 e p1 é necessariamente convexo, e
demonstra-se que nesta situação pelo menos os dois primeiros pontos pertencem ao
fecho. A pilha é inicializada com pn-1 e p0, e estes pontos nunca serão desempilhados,
resolvendo o problema de inicialização descrito anteriormente. Além disso, como p0
pertence ao fecho, não ocorrerá também o problema de término ao final da varredura
dos pontos.

p7 p4
p5

p8

p9 p6 p2

p 10 p3
p1
p0

Figura 1.53 - Algoritmo de Graham, origem no ponto inferior mais à direita


Na Figura 1.53, os pontos estão numerados segundo a ordem crescente do ângulo ao
redor de p0. É importante lembrar que a concepção apresentada até o momento se baseia
na hipótese de que não se tem três pontos colineares no conjunto, o que não se pode
garantir em situações práticas. Portanto, a implementação do algoritmo deve prever
recursos para resolver estes casos. Especificamente, é necessário acrescentar um critério
ao algoritmo de ordenação dos pontos ao redor de p0, dando prioridade em caso de
colinearidade para os pontos mais próximos de p0. Ou seja, considera-se pa < pb se os
ângulos forem iguais mas pa − p0 < pb − p0 . Com esta regra, o ponto mais próximo
será eliminado quando o mais distante for analisado. Esta regra também resolve o caso
em que existe uma colinearidade nos últimos pontos, fazendo com que o mais próximo
seja o penúltimo e o mais distante o último, e portanto pertencente ao fecho convexo
conforme desejado.

Um exemplo destas situações degeneradas está apresentado na Figura 1.54. No caso, o


ponto p1 tem que ficar antes de p2 na ordenação para que seja possível eliminá-lo sem
problemas, o que não ocorreria se a situação fosse invertida. Também o ponto p8 deve
vir antes do ponto p9, pois é p9 que pertence ao fecho convexo, e que será colocado
definitivamente no fundo da pilha dos vértices do fecho.

p6 p3
p4

p7 p2
p5
p9 p1

p8

p0

Figura 1.54 - Algoritmo de Graham, situações degeneradas


O Programa 1.21 apresenta o pseudocódigo para a implementação do algoritmo de
Graham, utilizando uma pilha conforme descrito, e também usando a função lado para
fazer o teste da curva à esquerda. Uma característica da implementação usando este
recurso é que apenas pontos que são cantos do contorno convexo são retornados.
Quaisquer pontos pertencentes ao fecho, mas contidos em alguma aresta, são
abandonados. Caso seja interessante ou importante preservar estes pontos, basta alterar a
comparação do resultado da função lado para permitir a igualdade com zero.
função graham(inteiro n, Ponto Q[n]): Pilha;
início
inteiro i;
Ponto P[n];
Pilha S;

P[0] = ponto de Q inferior e mais à direita;

ordenar todos os pontos de Q ao redor de P[0] pelo ângulo ;


em caso de empate no ângulo, favorecer o mais próximo de P[0] ;
acrescentar os demais pontos de Q a P, como P[1]...P[n-1] ;

push(S, (n - 1));
push(S, 0);
i = 1;

enquanto (i < n) faça


início
se lado(P[topo(S)], P[topo(topo(S))], P[i]) > 0 então
início
push(S, i);
i = i + 1;
fim se
senão
pop(S);
fim;

retorne(S);
fim.

Programa 1.21 - Algoritmo de Graham para fecho convexo


A complexidade do algoritmo de Graham pode ser facilmente determinada, observando
que o processo de varredura é claramente O(n). O tempo total é portanto dominado pelo
passo de ordenação dos pontos ao redor de p0, que é O(n log n), correspondendo ao
ótimo teórico.

Diversos algoritmos surgiram após o de Graham, utilizando processos diversos para


atingir resultados também O(n log n), mas apresentando características que facilitam a
extensão para dimensões mais altas. Existe também um algoritmo que usa a técnica de
dividir para conquistar [PrSh88], usando um enfoque parecido com o do algoritmo
merge sort (Merge Hull), e que pode ser paralelizado com maior facilidade.

1.1.7 Diagrama de Voronoi, triangulação de Delaunay e problemas de


proximidade
Esta seção vai analisar uma série de problemas correlacionados e que envolvem o
conceito de proximidade no plano. O principal recurso de que se dispõe para resolver
este tipo de problema é o diagrama de Voronoi, uma estrutura geométrica proposta no
início do século e que é capaz de responder uma grande variedade de perguntas a
respeito de proximidade em um conjunto de pontos: qual ponto está mais próximo, qual
o mais distante, entre outras. Diversos trabalhos buscaram destacar a importância desta
estrutura para SIG [Gold91][Gold92b][OBS92], mas até o momento os pacotes
comerciais não a incorporam explicitamente, para prejuízo de aplicações que demandam
com freqüência a solução de problemas de proximidade.
1.1.7.1 Diagramas de Voronoi

{
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).

A construção do diagrama pode ser melhor compreendida observando o que ocorre


quando o número de locais vai sendo aumentado gradativamente. Inicialmente,
considere-se apenas dois locais, p1 e p2. O diagrama de Voronoi consiste na reta que
secciona ao meio o segmento p1p2 e é perpendicular a este, a mediatriz do segmento
(Figura 1.55). Todos os pontos da reta são igualmente próximos a p1 e a p2. Pontos no
semiplano que contém p1 constituem o polígono de Voronoi correspondente a p1, e
analogamente o outro semiplano corresponde a V(p2).

p2

p1

Figura 1.55 - Diagrama de Voronoi com dois locais


Expandindo para três locais, é fácil perceber que o diagrama de Voronoi será formado
pelas semi-retas que cortam as arestas de p1p2p3 ao meio e segundo uma perpendicular,
portanto as mediatrizes das arestas, partindo do circuncentro do triângulo (Figura 1.56).
O circuncentro é o centro do círculo definido pelos vértices do triângulo, e é possível
que ele não pertença ao triângulo.

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

Figura 1.56 - Diagrama de Voronoi com três locais


Generalizando para um número maior de locais, fica claro que o processo de construção
deve levar em conta as mediatrizes dos segmentos definidos entre cada par de locais. A
mediatriz entre os locais pi e pj será denotada como Mij. Seja Sij o semiplano definido
por Mij e que contém pi. Então Sij contém todos os pontos do plano que estão mais
próximos de pi do que de pj. Para obter o polígono de Voronoi de pi, é necessário
combinar todos os semiplanos Sij com i ≠ j , e portanto

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 Figura 1.57 mostra um exemplo de diagrama de Voronoi com 12 locais. Observe-se


que existem 12 polígonos, um para cada local. Os vértices dos polígonos estão ligados,
em geral, a três arestas, exceto quando se tem quatro ou mais locais co-circulares em P
(Figura 1.58a) Esta situação é considerada degenerada, mas pode ser eliminada com a
introdução de perturbações infinitesimais nos pontos co-circulares (Figura 1.58b).
Figura 1.57 - Diagrama de Voronoi com 12 locais

(a) (b)

Figura 1.58 - Quatro pontos co-circulares e perturbação

1.1.7.2 Triangulação de Delaunay


Assim, considerando que o máximo grau de um vértice seja igual a três, define-se o dual
de um diagrama de Voronoi através de um grafo G, cujos nós correspondem aos locais e
cujos arcos conectam locais cujos polígonos de Voronoi compartilham uma aresta do
diagrama. Demonstra-se que este grafo é planar, e portanto vale a fórmula de Euler: em
um grafo planar com n vértices, existem 3n − 6 arcos e 2n − 4 faces [ORou94].

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.

Figura 1.59 - Diagrama de Voronoi (linhas cheias) e triangulação de Delaunay


(linhas pontilhadas)
[ORou94] e [PrSh88] listam as propriedades da triangulação de Delaunay e dos
diagramas de Voronoi. As mais interessantes são as seguintes:

• A cada triângulo de D(P) corresponde um vértice de Vor(P);

• A cada nó de D(P) corresponde um polígono de Vor(P);

• A fronteira de D(P) coincide com o fecho convexo dos locais de P;

• O interior de cada triângulo de D(P) não contém nenhum local;

• V(pi) é ilimitado se e somente se pi pertence ao fecho convexo de P;

• Se v é um vértice do diagrama de Voronoi, na junção de V(p1), V(p2) e V(p3), então v


é o centro do círculo definido por p1, p2 e p3;

• Se pj é o vizinho mais próximo de pi, então pipj é uma aresta de D(P).

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.

A construção do diagrama de Voronoi pode ser implementada usando a técnica de


dividir para conquistar, gerando um algoritmo ótimo O(n log n) [PrSh88]. Em linhas
gerais, o algoritmo consiste em:

• particionar o conjunto inicial de pontos P em dois subconjuntos, P1 e P2, de tamanho


aproximadamente igual;

• construir Vor(P1) e Vor (P2) recursivamente;

• combinar Vor(P1) e Vor(P2) para obter Vor(P).

A maior dificuldade desta alternativa está em conseguir implementar a etapa de


combinação de dois diagramas em tempo O(n) para que o custo total não exceda
O(n log n). [PrSh88] apresenta uma descrição detalhada deste procedimento, que é
relativamente complexo e de implementação difícil.

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

Outra linha de raciocínio defende a construção da triangulação de Delaunay como passo


intermediário para a obtenção do diagrama de Voronoi, já que foi demonstrado [FiCa91]
que a triangulação de Delaunay pode ser transformada no diagrama de Voronoi em
tempo linear, e vice-versa. Um algoritmo usando a técnica de dividir para conquistar,
muito semelhante ao apresentado para o diagrama de Voronoi, foi proposto por Lee e
Schachter ([LeSc80] apud [FiCa91]). Também neste algoritmo o desafio maior é a etapa
de combinação de triangulações parciais em tempo linear. Para facilitar a construção da
triangulação é utilizada uma estrutura topológica winged-edge (vide seção 1.2.2). Esta

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].

O mesmo ocorre com a triangulação de Delaunay, usada sempre que se tem a


necessidade de particionar o plano com base em um conjunto de pontos. São freqüentes
as situações em que os pontos representam locais onde se consegue amostrar alguma
variável física, como altitude, temperatura ou índice de chuvas, sendo necessário
produzir um mapeamento contínuo da variável para toda uma região de interesse. Nestas
situações, a triangulação de Delaunay é imbatível, pois gera um resultado em que é
maximizado o menor ângulo interno de cada triângulo [Edel87], o que confere à malha
triangular uma aparência mais regular.

A seguir, são apresentadas algumas aplicações do diagrama de Voronoi e da


triangulação de Delaunay que são significativas no contexto de SIG, sem a pretensão de
esgotar o assunto.

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

Uma variação deste problema consiste em localizar os k pontos de P mais próximos de


q. Isto é possível usando o chamado diagrama de Voronoi de ordem k. Conforme foi
apresentado, o diagrama de Voronoi tradicional é o diagrama de ordem 1, ou seja, cada
polígono é o lugar geométrico dos pontos do plano mais próximos do local pi do que de
qualquer outro. Analogamente, um diagrama de Voronoi de ordem k é formado por
polígonos que constituem o lugar geométrico dos pontos do plano cujos k vizinhos mais
próximos são os locais pi1, pi2, pi3,...pik, em qualquer ordem. Algoritmos para obter tais
diagramas têm complexidade O(n3), e não serão discutidos aqui (para maior
aprofundamento, vide [PrSh88], [Edel87] e [ORou94]).

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.

O resultado do problema é um grafo de proximidade (Figura 1.60), definido como sendo


um grafo em que os nós são os locais e as arestas são direcionadas entre cada local e seu
vizinho mais próximo. Este grafo pode ser usado para responder com facilidade a
questões como “qual é o local mais próximo deste” e “que locais são mais próximos
deste do que de qualquer outro”. No segundo exemplo, estas questões seriam traduzidas
como “qual é o aeroporto mais próximo do Aeroporto de Confins” e “que aeroportos
redirecionarão seus pousos para Confins em caso de fechamento”. Observe que este
grafo não é necessariamente conexo, e também que as ligações entre os nós não são
sempre reflexas.

Figura 1.60 - Grafo de proximidade sobre a triangulação de Delaunay


da Figura 1.59
Este problema pode ser resolvido em tempo linear a partir da disponibilidade do
diagrama de Voronoi. Basta analisar cada aresta definida no diagrama, calcular a
distância entre os locais separados por aquela aresta, e manter os menores valores em
associação com cada local. Como o número de arestas do diagrama é, no máximo, igual
a 3n – 6 (vide seção 1.1.7.2), o tempo necessário para esta análise é O(n). Naturalmente,
esta tarefa será facilitada pela construção de uma estrutura de dados adequada ao
problema, como a winged-edge (vide seção 1.2.2). Uma alternativa a esta solução é
utilizar a triangulação de Delaunay, verificando para cada vértice de triângulo
(correspondente a um local) qual é a aresta de menor comprimento que incide sobre ele.
O local na outra extremidade desta aresta é o vizinho mais próximo. A validade desta
estratégia decorre do fato de que o grafo de proximidade está contido em D(P)
[ORou94].

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

Figura 1.61 - Maior círculo vazio


Esta técnica pode ser usada para escolher o ponto de implantação de um novo
empreendimento, desde que se faça algumas hipóteses simplificadoras: (1) a
distribuição da clientela pelo território é uniforme, e (2) é possível encontrar espaço para
a implantação do empreendimento no centro aproximado do círculo vazio. Caso estas
simplificações não sejam aceitáveis, torna-se necessário utilizar técnicas mais avançadas
para escolher o local do empreendimento, tais como a determinação da superfície de
potencial de vendas, ou semelhante.
Outra situação em que este problema se aplica está na escolha de uma área para a
localização de uma atividade potencialmente poluidora, em um lugar que seja tão
distante quanto possível de centros populacionais.

Modelagem Digital de Terrenos. A triangulação de Delaunay é muito usada na criação


de modelos digitais do terreno (MDT). Na criação de MDT, parte-se em geral de um
conjunto de amostras (pontos cotados) distribuídos de maneira irregular pelo terreno. As
fontes de informação são a restituição de fotos aéreas por processo estereoscópico ou
levantamentos topográficos de campo. A partir destas amostras deseja-se construir uma
superfície que represente o relevo do local. Para isso, é criada uma triangulação contida
no fecho convexo dos pontos amostrais, e a superfície é então aproximada pelos
triângulos tridimensionais formados. Como os três vértices de um triângulo definem um
plano, esta estratégia eqüivale a imaginar que o relevo varia linearmente entre dois
pontos cotados conhecidos, o que é suficiente para a maioria das aplicações. Se o grau
de aproximação obtido não for satisfatório, pode-se densificar a malha de triângulos,
introduzindo novos pontos.

A partir da triangulação (denominada por alguns SIG de TIN - Triangulated Irregular


Network) pode-se produzir mapas de curvas de nível, usando um algoritmo simples.
Basta determinar a interseção de cada triângulo com o plano correspondente à cota da
curva de nível que se pretende traçar . Esta interseção pode ser nula (Figura 1.62a), pode
ser um ponto (Figura 1.62b), um segmento de reta (Figura 1.62c) ou mesmo todo o
triângulo (Figura 1.62d) [Bour87]. Nos casos em que a interseção é um segmento, este é
determinado e armazenado para compor a curva de nível. Os outros casos podem ser
ignorados para efeito de traçado das curvas. A continuidade de cada curva está garantida
pelo fato de que os pontos extremos do segmento de interseção entre plano e triângulo
são os mesmos nos triângulos adjacentes.
(a) sem interseção

1. todos os vértices acima do plano 2. todos os vértices abaixo do plano


(b) interseção em um
ponto

3. um dos vértices no plano, os outros


dois acima ou abaixo
(c) interseção em um segmento

4. dois vértices acima e um 5. dois vértices abaixo e um


abaixo do plano acima do plano

6. um vértice no plano, um acima e 7. dois vértices no plano, o terceiro


um abaixo acima ou abaixo
(d) inserção total

8. todos os vértices no plano

Figura 1.62 - Interseção entre triângulo e plano


Naturalmente, a qualidade do resultado depende da densidade de triângulos – quanto
mais triângulos, mais refinado será o aspecto da curva gerada, especialmente nas regiões
onde o relevo muda mais bruscamente. Mesmo assim, curvas de nível traçadas por este
processo tendem a adquirir um aspecto anguloso, pouco natural. Assim, é executada
uma etapa de pós-processamento, em que a curva é suavizada por uma spline ou outro
processo qualquer. Observe-se que é necessário que a suavização não altere as
características topológicas das curvas de nível, ou seja, as curvas suavizadas, assim
como as originais, não podem se interceptar.

Um tipo de consulta freqüentemente associado com o MDT é a determinação da cota do


terreno em um ponto q dado. Isto pode ser feito determinando qual triângulo contém q, e
fazendo uma interpolação linear entre os vértices do triângulo para obter a cota
procurada. Existem também processos de interpolação que utilizam as curvas de nível
para obter a cota de pontos intermediários quaisquer.

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.1 Conceitos básicos (capítulo da apostila)

1.2.2 A estrutura Winged-Edge

1.2.3 Outras estruturas topológicas - Quad-edge?

1.2.4 Topologia de redes

1.2.5 Aplicações
Pesquisas de proximidade em diagramas de Voronoi codificados segundo uma winged-
edge!

OBS: Incluir discussão sobre o uso de estruturas topológicas em SIG: custo de


manutenção x custo de geração, considerando a freqüência de uso

1.3 Indexação Espacial

Estruturas reativas - Oosterom


1.4 Referências

[Baas88] Baase, S. Computer Algorithms: Introduction to Design and Analysis,


2nd Edition, Addison-Wesley, 1988.
[BCA95] Barber, C., Cromley, R., and Andrle, R. Evaluating Alternative Line
Simplification Strategies for Multiple Representations of Cartographic
Lines. Cartography and Geographic Information Systems 22(4): 276-
290, 1995.

[Bear91] Beard, K. Theory of the Cartographic Line Revisited: Implications for


Automated Generalization. Cartographica 28(4): 32-58, 1991.

[Bour87] Bourke, P. D. A Contouring Subroutine. BYTE June 1987, 143-150.

[Butt85] Buttenfield, B. P. Treatment of the Cartographic Line. Cartographica


22(2): 1-26, 1985.

[Butt89] Buttenfield, B. P. Scale Dependence and Self-Similarity in Cartographic


Lines. Cartographica 26(1): 79-100, 1989.

[ChCh96] Chan, W. S. and Chin, F. Approximation of Polygonal Curves with


Minimum Number of Line Segments or Minimum Error. International
Journal of Computational Geometry and Applications 6(1): 59-77, 1996.

[CLR90] Cormen, T. H., Leiserson, C. E., and Rivest, R. L. Introduction to


Algorithms. McGraw-Hill and MIT Press, 1990.

[CrCa91] Cromley, R. G., and Campbell, G. M. Noninferior Bandwidth Line


Simplification: Algorithm and Structural Analysis. Geographical
Analysis 23 (1): 25-38, 1991.

[CrCa92] Cromley, R. G. and Campbell, G. M. Integrating Quantitative and


Qualitative Aspects of Digital Line Simplification. The Cartographic
Journal 29(1): 25-30, 1992.

[Crom88] Cromley, R. G. A Vertex Substitution Approach to Numerical Line


Simplification. In Proceedings of the Third International Symposium on
Spatial Data Handling, 57-64, 1988.

[Crom91] Cromley, R. G. Hierarchical Methods of Line Simplification.


Cartography and Geographic Information Systems 18(2): 125-131,
1991.

[Davi97] Davis Jr., C. A. Uso de Vetores em GIS. Fator GIS 4(21): 22-23, 1997.

[Deve85] Deveau, T. J. Reducing the number of points in a plane curve


representation. In Proceedings of AutoCarto 7, 152-160, 1985.

[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.

[DoPe73] Douglas, D. H. and Peucker, T. K. Algorithms for the Reduction of the


Number of Points Required to Represent a Line or its Caricature. The
Canadian Cartographer 10(2): 112-122, 1973.

[DuHa73] Duda, R. and Hart, P. Pattern Classification and Scene Analysis. John
Wiley & Sons, New York, 1973.

[Edel87] Edelsbrunner, H. Algorithms in Combinatorial Geometry, Springer-


Verlag, 1987.

[FiCa91] Figueiredo, L. H., Carvalho, P. C. P. Introdução à Geometria


Computacional, Instituto de Matemática Pura e Aplicada, 1991.

[Fort87] Fortune, S. A Sweepline Algorithm for Voronoi Diagrams. Algorithms


2:153-174, 1987.

[GHMS93] Guibas, L. J., Hershberger, J. E., Mitchell, J. S. B., and Snoeyink, J. S.


Approximating Polygons and Subdivisions with Minimum Link Paths.
International Journal of Computational Geometry and Applications
3(4): 383-415, 1993.

[Gold91] Gold, C. M. Problems with Handling Spatial Data - The Voronoi


Approach. CISM Journal 45: 65-80, 1991.

[Gold92b] Gold, C. M. Dynamic Spatial Data Structures - The Voronoi Approach.


In Proceedings of, the Canadian Conference on GIS, 245-255, 1992.

[GuSt85] Guibas, L. and Stolfi, J. Primitives for the Manipulation of General


Subdivisions and the Computation of Voronoi Diagrams. ACM
Transactions on Graphics 4(2): 74-123, 1985.

[HeSn92] Hershberger, J. and Snoeyink, J. Speeding Up the Douglas-Peucker


Line-Simplification Algorithm. In Proceedings of the Fifth International
Symposium on Spatial Data Handling, 1: 134-143, 1992.

[Horn85] van Horn, E. K. Generalizing Cartographic Databases. In Proceedings of


AutoCarto 7, 532-540, 1985.

[ImIr86] Imai, H. and Iri, M. Polygonal Approximations of a Curve –


Formulations and Algorithms. In Toussaint, G. T. (editor)
Computational Morphology, North Holland, 1988.

[Jain89] Jain, A. K. Fundamentals of Digital Image Processing. Prentice-Hall,


1989.
[Jenk81] Jenks, G. F. Lines, Computers and Human Frailties. In Annals of the
Association of American Geographers 71(1): 1-10, 1981.

[Jenk89] Jenks, G. F. Geographic Logic in Line Generalization. Cartographica


26(1): 27-42, 1989.

[Joha74] Johannsen, T. M. A Program for Editing and for Some Generalizing


Operations (For Derivation of a Small Scale Map from Digitized Data in
1:50,000). In Csati, E. (editor) Automation: The New Trend in
Cartography, The Geocartotechnical Research Department (Budapest,
Hungary), 131-138, 1974.

[Knut73] Knuth, D. E. The Art of Computer Programming, Volume 3: Sorting and


Searching, 2nd Edition. Addison-Wesley, 1973.

[Knut73a] Knuth, D. E. The Art of Computer Programming, Volume 1:


Fundamental Algorithms, 2nd Edition, Addison-Wesley, 1973.

[Lang69] Lang, T. Rules for Robot Draughtsmen. Geographical Magazine 22: 50-
51, 1969.

[LaTh92] Laurini, R. and Thompson, D. Fundamentals of Spatial Information


Systems. Academic Press, 1992.

[Leac92] Leach, G. Improving Worst-Case Optimal Delaunay Triangulation


Algorithms. In Proceedings of the Fourth Canadian Conference on
Computational Geometry, 1992.

[LeSc80] Lee, D. T., Schachter, B. J. Two Algorithms for Constructing the


Delaunay Triangulation. International Journal of Computer and
Information Science 9(3):219-242, 1980.

[LiOp92] Li, Z. and Openshaw, S. Algorithms for Automated Line Generalization


Based on a Natural Principle of Objective Generalization. International
Journal of Geographic Information Systems 6(5): 373-389, 1992.

[MaKn89] Margalit, A., Knott, G. D. An Algorithm for Computing the Union,


Intersection or Difference of Two Polygons. Computers & Graphics
13(2): 167-183, 1989.

[Mari79] Marino, J. S. Identification of Characteristic Points Along Naturally


Occurring Lines: An Empirical Study. The Canadian Cartographer
16:70-80, 1979.

[McMa86] McMaster, R. B. A Statistical Analysis of Mathematical Measures for


Linear Simplification. American Cartographer 13:103-116, 1986.

[McMa87a] McMaster, R. B. Automated Line Generalization. Cartographica


24(2):74-111, 1987.

[McMa87b] McMaster, R. B. The Geometric Properties of Numerical Generalization.


Geographical Analysis 19(4): 330-346, 1987.

[McMa89] McMaster, R. B. The Integration of Simplification and Smoothing


Algorithms in Line Generalization. Cartographica 26(1): 101-121,
1989.

[McSh92] McMaster, R. B. and Shea, K. S. Generalization in Digital Cartography.


Association of American Geographers, 1992.

[Melk87] Melkman, A. A. On-line Construction of the Convex Hull of a Simple


Polyline. Information Processing Letters 25:11-12, 1987.

[Melk88] Melkman, A. A. and O’Rourke, J. On Polygonal Chain Approximation.


In Toussaint, G. T. (editor) Computational Morphology, North Holland,
1988.

[Mowe96] Mower, J. Developing Parallel Procedures for Line Simplification.


International Journal of Geographical Information Science 10 (6): 699-
712, 1996.

[Mull87] Muller, J. C. Optimum Point Density and Compaction Rates for the
Representation of Geographic Lines. In Proceedings of AutoCarto 8,
221-230, 1987.

[Mull90a] Muller, J. C. The Removal of Spatial Conflicts in Line Generalization.


Cartography and Geographic Information Systems 17 (2): 141-149,
1990.

[Mulm94] Mulmuley, K. Computational Geometry: An Introduction Through


Randomized Algorithms, Prentice-Hall, 1994.

[Nick88] Nickerson, B. G. Automated Cartographic Generalization for Linear


Features. Cartographica 25 (3): 15-66, 1988.

[NiPr82] Nievergelt, J., Preparata, F. P. Plane-Sweep Algorithms for Intersecting


Geometric Figures. Communications of the ACM 25(10): 739-747, 1982.

[OBS92] Okabe, A., Boots, B., Sugihara, K. Spatial Tesselations: Concepts and
Applications of Voronoi Diagrams, John Wiley, 1992.

[OoSc95] van Oosterom, P. and Schenkelaars, V. The Development of an


Interactive Multi-Scale GIS. International Journal of Geographical
Information Systems 9(5), 489-507, 1995.

[Oost93] van Oosterom, P. Reactive Data Structures for Geographic Information


Systems, Oxford University Press, 1993.

[Ophe81] Opheim, H. Smoothing a Digitized Curve by Data Reduction Methods.


In Encarnação, J. L. (editor) Proceedings of Eurographics ’81, 127-135,
North-Holland, 1981.

[ORou94] O’Rourke, J. Computational Geometry in C, Cambridge University


Press, 1994.
[PAF95] Plazanet, C., Affholder, J.-G., and Fritsch, E. The Importance of
Geometric Modeling in Linear Feature Generalization. Cartography and
Geographic Information Systems 22(4): 291-305, 1995.

[Perk66] Perkal, J. An Attempt at Objective Generalization. Michigan Inter-


University Community of Mathematical Geographers, Discussion Paper
No. 10, 1966.
[Peuc75] Peucker, T. K. A Theory of the Cartographic Line. International
Yearbook of Cartography 16: 134-143, 1975.

[Plaz95] Plazanet, C. Measurements, Characterization and Classification for


Automated Line Feature Generalization. In Proceedings of AutoCarto
12, 59-68, 1995.

[PrSh88] Preparata, F. P., Shamos, M. I. Computational Geometry: an


Introduction, Springer-Verlag, 1988.

[Rame72] Ramer, U. An Iterative Procedure for the Polygonal Approximation of


Plane Curves. Computer Vision, Graphics, and Image Processing 1:244-
256, 1972.

[ReWi74] Reumann, K. and Witkam, A. P. M. Optimizing Curve Segmentation in


Computer Graphics. In Proceedings of the International Computing
Symposium 1973, 467-472, North-Holland, 1974.

[Robe85] Roberge, J. A Data Reduction Algorithm for Planar Curves. Computer


Vision, Graphics, and Image Processing 1(3): 244-256, 1985.

[RSM78] Robinson, A. H., Sale, R. D. and Morrison, J. L. Elements of


Cartography, 4th Edition, John Wiley & Sons, 1978.

[Schn97] Schneider, M. Spatial Data Types for Database Systems: Finite


Resolution Geometry for Geographic Information Systems, Lecture
Notes in Computer Science 1288. Springer-Verlag, 1997.
[Sedg90] Sedgewick, R. Algorithms in C, Addison-Wesley, 1990.

[Tarj83] Tarjan, R. E. Data Structures and Network Algorithms, Regional


Conference Series in Applied Mathematics 44, SIAM, 1983.
[Thap88] Thapa, K. Automatic Line Generalization using Zero Crossings.
Photogrammetric Engineering and Remote Sensing 54(4), 511-517,
1988.

[Tobl64] Tobler, W. R. An Experiment in the Computer Generalization of Maps.


Technical Report No. 1, Office of Naval Research Task No. 389-137,
Contract No. 1224 (48), Office of Naval Research, Geography Branch,
1964.

[ToPi66] Topfer, F. and Pillewizer, W. The Principles of Selection. Cartographic


Journal 3 (10-16), 1966.
[Tous83] Toussaint, G. T. Computing Largest Empty Circles with Location
Constraints. International Journal of Computer and Information Science
12(5): 347-358, 1983.

[Vatt92] Vatti, B. R. A Generic Solution to Polygon Clipping. Communications


of the ACM 35(7): 57-63, 1992.

[ViWh90] Visvalingam, M. and Whyatt, J. The Douglas-Peucker Algorithm for


Line Simplification: Re-evaluation through Visualization. Computer
Graphics Forum 9 (213-228), 1990.

[ViWh93] Visvalingam, M. and Whyatt, J. D. Line Generalisation by Repeated


Elimination of Points. Cartographic Journal 30 (1): 46-51, 1993.

[ViWi95] Visvalingam, M. and Williamson, P. J. Simplification and


Generalization of Large Scale Data for Roads: A Comparison of Two
Filtering Algorithms. Cartography and Geographic Information Systems
22 (4), 264-275, 1995.

[Weib95] Weibel, R. Map Generalization in the Context of Digital Systems.


Cartography and Geographic Information Systems, Guest Editorial to
Special Issue on Automated Map Generalization, 22(4): 3-10, 1995.

[Whit85] White, E. R. Assessment of Line-Generalization Algorithms Using


Characteristic Points. The American Cartographer 12(1): 17-28, 1985.

[Will78] Williams, C. M. An Efficient Algorithm for the Piecewise Linear


Approximation of a Polygonal Curve in the Plane. Computer Vision,
Graphics, and Image Processing 8:286-293, 1978.

[Wolb90] Wolberg, G. Digital Image Warping. IEEE Computer Society Press,


1990.
[ZhSa97] Zhao, Z. and Saalfeld, A. Linear-Time Sleeve-Fitting Polyline
Simplification Algorithms. In Proceedings of AutoCarto 13, 1997.

[Zivi96] Ziviani, N. Projeto de Algoritmos com Implementações em Pascal e em


C, 3a. Edição, Editora Pioneira, 1996.
!
"# $ % & ' ( $%'
) * ( )
' +,, - )
$%' .
( ! /
+
( 0
$%' 0 ! " 0 * 1
* &
0 * ! 2 3
* & *
& !
/ # & * &
$%' 0
* & 4 &
* !
"
* * $%' !"
& 1 &
& ! /
( 0 0 0
1 & & )

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
& !

" $%' & 3 0


# & ( 0 0
0( 0 ! " & 3
0 0 0*
6 &
4 3 0 0 $%'
2 7 +,,, !
- 0 1
0 0
0 & . $%' 0 &
4 0 0
( * !
1 0 8 (
4 ! " 0 )( * 0 0
$%' 0
( !9 .
# 1 3
& !

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 # & 1 0 /$< %% 3 ",,


> / ?% ! - &
0 ( . 0 #
6 1
!9 3 & !
!! 3 % $/ 4 "

2 5K7 3 # & > / < !


" < /5
! 2 5K7 3 /$< %% 0 &
/ < 1 0 ! 2 / < 3
0(
O5 ! 2 > 3
$%'
5 K 7!
2 3 1 & 1 0 /$< %% 1
0 !
!5 , + * 6 .

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

2 $5 9$ I $' $ +,, 3 &


$%' . 0

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 !

Figura 3: subtipos de feature

/ 7"/9I G" * 7"/9I G" X %9M


' "2 @ "9G 1 ) B )
< 2 N "G/' "$ 1 B !

Figura 4: Relação entre Feature e Coverage

O padrão OpenGIS relaciona diretamente cada tipo de “coverage” com uma


geometria particular, num relacionamento de especialização. Isto faz com que o
conteúdo semântico de uma “coverage” (os tipos de dados geográficos
representados) sejam confundidos com seu conteúdo sintático (a estrutura de
dados utilizada). Esta relação é incoerente com a definição proposta pelo padrão
OpenGIS para “coverages”, que fala em função, domínio e intervalo.
Figura 5: Subtipos de Coverage

Deste modo, o modelo conceitual do OpenGIS não captura a noção que um


mesmo geo-campo pode ser representado simultaneamente nos formatos vetorial e
matricial.

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

Figura 6: Trecho de um Esquema de aplicação


/ Z3 1 0 # !# "1 &
& !$
O * 1 )
gml:AbstractFeatureType! " &
# 8

Figura 7: Criação de uma tag

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

Figura 8: Exemplo de namespace

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 $%'
!

Figura 10: Esquema de SIG baseado em ontologias, (Fonseca et al., 2000).

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

IMPLEMENTAÇÃO DE BANCOS DE DADOS GEOGRÁFICOS

Karine Reis Ferreira

João Argemiro Paiva

10.1 INTRODUÇÃO

Para a construção de aplicativos geográficos, é necessário dispor de um ambiente


adaptável e modular, e uma das formas tradicionalmente utilizadas em Engenharia de
Software para tal fim são as bibliotecas de funções. Como observa Stroustrup (1999),
construir uma biblioteca de software eficiente é uma das tarefas mais difíceis da
Computação, e das que mais contribuem para o avanço da tecnologia de informação,
Para atender ao duplo requisito de construir aplicativos geográficos modulares baseados
no suporte de SGBD relacionais e objeto-relacionais, está sendo desenvolvida a
TerraLib (Câmara et al, 2000), uma biblioteca de software livre base para a construção
de uma nova geração de aplicativos geográficos baseados na arquitetura integrada. No
entanto, o desenvolvimento de uma biblioteca eficiente e útil apresenta muitos desafios,
alguns dos quais são discutidos e resolvidos neste trabalho, a saber:

• Como compatibilizar, numa única interface de programação (API),


implementações de tipos de dados espaciais realizadas por diferentes fabricantes
de SGBDOR?

• Como estender as facilidades disponíveis nos SGBDOR, para tipos de dados


necessários para os aplicativos geográficos, mas não disponíveis nestes
sistemas?

• Como oferecer uma interface de programação genérica que permita a realização


de operações de consulta espacial sobre diferentes tipos de dados espaciais, de
forma modular e eficiente para o programador de aplicações?

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.

Outra característica importante da API é ser genérica no sentido de suportar diferentes


SGBDs, relacionais e objeto-relacionais, que possuem interface com a TerraLib. No
caso de SGBDORs que possuem extensões espaciais, como o Oracle Spatial, a API
deve explorar ao máximo seus recursos para tratar dados geográficos, como indexação
espacial e operadores e funções para manipular esses dados.

Para cumprir o objetivo do trabalho, a API foi implementada na TerraLib nas classes de
interface com os SGBDs em dois níveis:

(1) Nível genérico: as operações foram implementadas na classe base da interface


com os SGBDs, chamada TeDatabase, utilizando as estruturas de dados
geográficos e as funções da TerraLib. Essas operações serão utilizadas por todos
os SGBDs que não possuem extensão espacial, como o Access, MySQL e
PostgreSQL.

(2) Nível específico: as operações foram reimplementadas na classe de interface


com o SGBD Oracle Spatial, chamada TeOracleSpatial, utilizando os
recursos de sua extensão espacial. Essas operações são computadas pelo próprio
Oracle Spatial através de operadores e funções espaciais que são usados
juntamente com a linguagem SQL.

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.

Seu modelo de dados consiste em uma estrutura hierárquica de elementos, geometrias e


planos de informação (layers), onde planos são formados por um conjunto de
geometrias, que por sua vez são formadas por um conjunto de elementos. Um elemento
pode ser do tipo Ponto, Linha ou Polígono (com ou sem ilhas). Uma geometria pode ser
formada por um único elemento ou por um conjunto homogêneo (MultiPontos,
MultiLinhas ou MultiPolígonos) ou heterogêneo (Coleção) de elementos. Um plano de
informação é formado por uma coleção de geometrias que possuem um mesmo conjunto
de atributos.

Devido à utilização de um modelo objeto-relacional, cada geometria é armazenada em


um objeto espacial chamado SDO_GEOMETRY. Este objeto contém a geometria em si,
suas coordenadas, e informações sobre seu tipo e projeção. Em uma tabela espacial os
atributos alfanuméricos da geometria são definidos como colunas de tipos básicos

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:

create table Estados_do_Brasil


{
nome_estado VARCHAR2(100),
nome_captial VARCHAR2(100),
populacao_03 NUMBER,
fronteira MDSYS.SDO_GEOMETRY
}

O objeto SDO_GEOMETRY é composto pelos seguintes atributos:

SDO_GTYPE: formado por quatro números, onde os dois primeiros indicam a


dimensão da geometria e os outros dois o seu tipo. Os tipos podem ser: 00 (não
conhecido), 01 (ponto), 02 (linha ou curva), 03 (polígono), 04 (coleção), 05
(multipontos), 06 (multilinhas) e 07 (multipolígonos);

SDO_SRID: utilizado para identificar o sistema de coordenadas, ou sistema de


referência espacial, associado à geometria;

SDO_POINT: é definido utilizando um objeto do tipo SDO_POINT_TYPE, que


contém os atributos X, Y e Z para representar as coordenadas de um ponto.
Somente é preenchido se a geometria for do tipo ponto, ou seja, se os dois
últimos números do SDO_GTYPE forem iguais a “01”;

SDO_ELEM_INFO: é um vetor de tamanho variável que armazena as


características dos elementos que compõem a geometria. Cada elemento tem
suas coordenadas armazenadas no SDO_ORDINATES que são interpretadas por
três números armazenados no SDO_ELEM_INFO:

• SDO_STARTING_OFFSET: indica qual a posição da primeira


coordenada do elemento no SDO_ORDINATES;

• SDO_ETYPE: indica o tipo do elemento;

10-4
• SDO_INTERPRETATION: indica como o elemento deve ser
interpretado juntamente com o SDO_ETYPE.

SDO_ORDINATES: é um vetor de tamanho variável que armazena as


coordenadas da geometria.

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.

Cada tipo de índice é apropriado para diferentes situações. A R-tree consiste em


particionar o dado em conjuntos de objetos geográficos, baseando-se na distribuição dos
mínimos retângulos envolventes (MBRs) desses objetos no espaço. A Quadtree
particiona o espaço 2D, recursivamente, em quadrantes, independente da distribuição
dos objetos geográficos no plano. Além das estruturas de indexação, a extensão fornece
funções para avaliar a performance dos índices criados (ANALYZE_RTREE) e para
reconstruir um antigo índice depois da inserção de novas geometrias na tabela espacial
(REBUILD). O modelo global próprio do Oracle Spatial, chamado MDSYS, apresenta
um conjunto de tabelas de metadados que são utilizadas por algumas funcionalidades
internas da extensão, como por exemplo, nas consultas espaciais. Há, basicamente, dois
tipos de tabelas de metadados:

As que contêm informações sobre a indexação espacial de cada tabela e


coluna espacial. Essas tabelas são: USER_SDO_INDEX_METADATA,
ALL_SDO_INDEX_INFO e DBA_SDO_INDEX_INFO;

As que contêm informações sobre as geometrias armazenadas em cada tabela


e coluna espacial, como sua dimensão (mínimo retângulo envolvente) e a
tolerância em cada dimensão. Essas tabelas são:
USER_SDO_GEOM_METADATA, ALL_SDO_GEOM_METADATA e
DBA_SDO_GEOM_METADATA.

10-5
Operações espaciais no Oracle Spatial

A extensão utiliza um modelo de consulta baseado em duas etapas, chamadas de


primeiro e segundo filtro. O primeiro filtro considera as aproximações das geometrias,
pelo critério do mínimo retângulo envolvente (MBR), para reduzir a complexidade
computacional. É considerado um filtro de baixo custo computacional e seleciona um
subconjunto menor de geometrias candidatas que será passado para o segundo filtro. O
segundo filtro trabalha com as geometrias exatas, por isso é computacionalmente mais
caro e só é aplicado ao subconjunto resultante do primeiro filtro. Retorna o resultado
exato da consulta.

Para suportar consultas e operações espaciais, o Oracle Spatial fornece um conjunto de


operadores e funções que são utilizados juntamente com a linguagem SQL. Para
consultar relações espaciais são utilizados os operadores que utilizam os dois filtros do
modelo de consulta:

SDO_RELATE: consulta relações topológicas entre objetos geográficos, com


base no Modelo de 9-Interseções de Engenhofer e Herring (1991). Recebe como
parâmetro o tipo da relação a ser computada, a qual pode ser: EQUAL,
DISJOINT, TOUCH, INSIDE, OVERLAPBDYINTERSECT,
OVERLAPBDYDISJOINT, ANYINTERACT, CONTAINS, ON, COVERS e
COVERREDBY;

SDO_WITHIN_DISTANCE: verifica se dois objetos geográficos estão a uma


determinada distância, a qual é passada como parâmetro;

SDO_NN: identifica n vizinhos mais próximos de um objeto geográfico.

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.

Figura 10.1 - Cenário da Consulta

TABELA 10.1 – TABELAS ESPACIAIS


Zona_sensível area_risco
Nome Atributo Tipo Nome Atributo Tipo

nome VARCHAR2(50) nome VARCHAR2(50)

zona SDO_GEOMETRY local SDO_GEOMETRY

A consulta em SQL utiliza o operador SDO_RELATE, juntamente com a função


SDO_BUFFER, e é computada pelo SGBD Oracle:

SELECT ass.nome, ar.nome


FROM AREA_RISCO ar, AREA_SENSIVEL ass,
USER_SDO_GEOM_METADATA m
WHERE m.table_name = ‘AREA_RISCO’
AND (SDO_RELATE(ass.zona,
SDO_GEOM.SDO_BUFFER(ar.local, m.diminfo,
8000), ‘mask=ANYINTERACT querytype=WINDOW’) = ‘TRUE’);

10-7
10.2 UMA INTERFACE GENÉRICA PARA OPERAÇÕES ESPACIAIS EM
BANCOS DE DADOS GEOGRÁFICOS

Breve Descrição da TerraLib

A interface para operações espaciais, ou API, desenvolvida neste trabalho foi


implementada na TerraLib (Câmara et al, 2000), uma biblioteca de software livre que
oferece suporte para a construção de uma nova geração de aplicativos geográficos,
baseados na arquitetura integrada. Esta biblioteca está sendo desenvolvida pela
DPI/INPE, FUNCATE e TECGRAF(PUC/RIO). A TerraLib (Câmara et al, 2001) é
uma biblioteca de classes desenvolvida em C++ (Stroustrup, 1999), seguindo os
paradigmas de orientação a objetos (Booch, 1994), programação genérica
(Austern,1998) e design patterns (Gamma et al, 1995). É organizada em três partes
principais:

Kernel: composto por classes básicas (estruturas de dados) para representação


dos dados geográficos, tanto no formato vetorial quanto matricial, e algoritmos
sobre esses dados, classes de sistemas de projeção cartográfica e uma classe base
que define uma interface comum para todos os drivers;

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;

Functions: contém os algoritmos que utilizam as estruturas básicas do Kernel,


incluindo análise espacial, linguagens de consulta e simulação e funções para
conversão de dados.

As classes do Kernel para manipulação dos dados geográficos em memória são


mostradas na Figura 10.. Existem classes para representar dados vetoriais, como por
exemplo, TeCoord2D para representar coordenadas de duas dimensões, TeLine2D

10-8
para linhas e TePolygon para polígonos, e classes para representar dados matriciais,
como a classe TeRaster.

Figura 10.2 - Classes do Kernel da TerraLib

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.

Figura 10.3 - Interface com SGBDs

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.

Como exemplo, as figuras a seguir mostram o esquema da tabela de polígonos do


modelo de dados da TerraLib representada em um SGBD relacional (Figura 10.4) e no
Oracle Spatial (Figura ). Essa tabela no SGBD relacional armazena o polígono em um
campo do tipo longo binário (spatial_data), além de guardar informações sobre o
número de coordenadas (num_coords), o número de buracos (num_holes) e o mínimo
retângulo envolvente (lower_x, lower_y, upper_x e upper_y) de cada polígono. No
Oracle Spatial o polígono é armazenado em um campo do tipo SDO_GEOMETRY
(spatial_data), que é um objeto espacial fornecido pela extensão, e as outras
informações referentes aos polígonos não precisam ser armazenadas explicitamente.

10-10
Figura 10.4 - Tabela de polígonos em Figura 10.5 - Tabela de polígonos no
SGBDs relacionais Oracle Spatial

Operações Disponíveis na Interface de Programação Genérica

Além de disponibilizar operações espaciais a um nível maior de abstração na TerraLib,


a API desenvolvida explora uma nova geração de SGBDs objeto-relacionais que
oferecem recursos para tratar dados geográficos, chamados de Sistemas de Banco de
Dados Geográficos. A API fornece operações espaciais sobre dados geográficos
armazenados em SGBDs relacionais (SGBDR) e objeto-relacionais (SGBDOR). No
caso da nova geração de SGBDORs que possuem extensões espaciais, como Oracle
Spatial, a API explora ao máximo seus recursos, como indexação espacial e operadores
e funções para manipular esses dados. Para que esta API fosse aplicada ao pacote
espacial da Oracle, foi também desenvolvido o driver para o Oracle Spatial
(TeOracleSpatial) na TerraLib.

TABELA 10.2 – OPERAÇÕES DISPONÍVEIS NA API


Operações sobre Operações sobre dados
dados vetoriais Matriciais
spatialRelation Buffer Zonal
calculateArea Intersection Mask
calculateLength Union
calculateDistance Difference
NearestNeighbors Xor
ConvexHull

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.

Comparação com ArcSDE

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.

TABELA 10.3 – TERRALIB X ARCSDE

TerraLib ArcSDE

Suporte para a construção de Suporte para os ArcGIS


Arquitetura de SIG SIGs de arquitetura integrada utilizarem uma arquitetura
integrada

Suporte a diferentes tipos de Suporte a diferentes tipos de


SGDBs SGBDs com ou sem extensão SGBDs com ou sem extensão
espacial espacial

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

Servidor de Banco de Dados Servidor de Banco de Dados


Arquitetura de
(SGBD) + cliente (SIG + (SGBD) + servidor de aplicação
software
TerraLib) (ArcSDE) + cliente (ArcSIG)

API para operações Operações a um alto nível de Operações a um baixo nível de


espaciais abstração abstração

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.

A API desenvolvida neste trabalho disponibiliza as operações espaciais em um nível


maior de abstração do que as APIs do ArcSDE. A API da TerraLib encapsula as
operações espaciais de forma que o usuário não precise ter conhecimento de como elas
são computadas, se é pelo SGBD com extensão espacial ou em memória. Já as APIs
disponíveis no ArcSDE exigem que o usuário saiba como as operações devem ser
computadas e escolher qual API utilizar.

Operações sobre dados vetoriais

As operações espaciais sobre dados vetoriais da API foram implementadas em dois


níveis:

(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.

As operações genéricas da classe TeDatabase utilizam funções da TerraLib sobre os


dados espaciais em memória, recuperados do SGBD. Essas operações seguem duas
etapas:

(1) Recuperação das geometrias do SGBD através de uma consulta em SQL: o


SGBD retorna as geometrias como conjuntos de valores binários (BLOB), o
TeDatabase faz a leitura de cada BLOB e transforma para uma das estruturas
de dados geográficos da TerraLib (TePolygon, TeLine2D, TePoint, etc).

(2) Aplicação de uma função da TerraLib sobre as estruturas de dados geradas.

A Figura mostra um exemplo da operação “Calcule a área do estado de Mias Gerais”,


seguindo as duas etapas descritas acima. Neste exemplo, é utilizada uma função
chamada AREA da TerraLib, que recebe um TePolygon como argumento e retorna
sua área. As operações específicas, ou seja, do driver TeOracleSpatial, consistem
em montar uma consulta em SQL utilizando os operadores e funções da extensão
espacial, designando sua computação para o SGBD.

10-14
SELECT * TerraLib
FROM geomTable
WHERE sigla= “MG”

(1) geomArea (“MG”)


SGBD

blob
TePolygon
area (2)

double Area (TePolygon poly)

Figura 10.6 - Cálculo de área no TeDatabase

No TeOracleSpatial, a operação para calcular a área monta uma consulta em


SQL utilizando a função SDO_AREA do Oracle Spatial. Essa consulta é passada para o
SGBD que computa e retorna a área das geometrias especificadas na cláusula WHERE.
A Figura 10.7 ilustra a operação “Calcule a área do estado de Minas Gerais”, utilizando
a extensão Oracle Spatial.

TerraLib
SELECT
SDO_GEOM.SDO_AREA(geomTabl
e, spatial_data, ...)
FROM geomTable
WHERE sigla= “MG”

SGBD geomArea (“MG”)


Oracle Spatial
area

Figura 10.7 - Cálculo de área no TeOracleSpatial

Dentre as classes definidas por Rigaux et al (2002), a API fornece as operações


espaciais sobre dados vetoriais mostradas a seguir.

10-15
TABELA 10.4 – OPERAÇÕES ESPACIAIS DA API SOBRE DADOS VETORIAIS

Valor de retorno da operação

Booleano Escalar Espacial


calculateLength ConvexHull
Unário
Número de argumentos

calculateArea Buffer
da operação

SpatialRelation calculateDistance Intersection


Binário

NearestNeighbors Union
Difference
XOr

As operações unárias da API são executadas sobre um determinado objeto geográfico de


uma tabela espacial. As operações binárias são executadas entre pares de objetos
geográficos, que podem estar armazenados em uma mesma tabela espacial ou em
tabelas distintas.

Na TerraLib, cada representação geométrica de um plano de informação (PI), ou layer,


é armazenada em uma tabela espacial. Como exemplo, serão considerados dois PIs onde
um é formado pelos estados do Brasil, que é representado geometricamente por
polígonos, e outro formado pelos rios do Brasil, representado geometricamente por
linhas. No modelo da TerraLib, cada PI será armazenado no SGBD em uma tabela
espacial distinta. Portanto, as operações binárias podem ser executadas entre geometrias
de um mesmo PI ou entre geometrias de dois PIs distintos. Por exemplo, a consulta
“selecione todos os rios que cruzam a fronteira do estado de Minas Gerais” será
executada pela operação binária SpatialRelation entre as geometrias das duas
tabelas espaciais Estados_polígonos e Rios_linhas. Já a consulta “qual é a distância
entre os estados Acre e Minas Gerais” será executada pela operação binária
calculateDistance entre as geometrias da tabela espacial Estados_polígonos.

10-16
Estados
SGBD

Estados_polígonos

Rios_linhas

Rios

Figura 10.8 - Armazenamento de dados geográficos no SGBD

As funções unárias da API recebem, no mínimo, os parâmetros de entrada: nome da


tabela espacial (actGeomTable); nome da coluna espacial (actGeomColl); tipo da
representação geométrica armazenada na tabela (actRep); os identificadores dos
objetos geográficos sobre os quais a operação será aplicada (actIdsIn); e, a variável
ou a estrutura de dados que conterá o resultado, que pode ser do tipo escalar ou espacial
(TePolygonSet). A seguir são mostradas, como exemplo, as assinaturas das
operações calculateArea e Buffer:

bool calculateArea(const string& actGeomTable, const string&


actGeomColl, TeGeomRep actRep, Keys& actIdsIn, const double&
area);

bool Buffer(const string& actGeomTable, const string&


actGeomColl, TeGeomRep actRep, Keys& actIdsIn, TePolygonSet&
bufferSet, const double& distance);

Quando é passado mais de um objeto geográfico como argumento, a função


calculateArea retorna a soma de suas áreas e a função Buffer retorna o conjunto
das geometrias geradas a partir de todos os objetos. Como cada geometria gerada é
representada por um polígono, a estrutura resultante é um conjunto de polígonos, que é
representado por uma estrutura chamada TePolygonSet.

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:

bool calculateDistance(const string& actGeomTable, const string&


actGeomColl, TeGeomRep actRep, const string& objId1, const
string& objId2, const double& distance);

bool geomIntersection(const string& actGeomTable, const string&


actGeomColl, TeGeomRep actRep, const string& objId1, const
string& objId2, TeGeometryVect& geomVect);

A interseção entre dois objetos geográficos pode resultar em diferentes geometrias,


como um polígono, uma linha ou um ponto, ou ainda em um conjunto dessas
geometrias. Por isso, a estrutura de dados para armazenar esse resultado,
TeGeometryVect, consiste em um conjunto de ponteiros para o tipo abstrato
TeGeometry, do qual todas as outras estruturas geométricas da TerraLib, como
TePolygon, TeLine e TePoint, são derivadas. O mesmo é válido para as outras
funções de conjunto como, geomDifference, geomUnion e geomXOr. A
definição da estrutura TeGeometryVect é mostrada a seguir:

typedef vector<TeGeometry*> TeGeometryVect

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:

bool calculateDistance(const string& actGeomTable, const string&


actGeomColl, TeGeomRep actRep, const string& objId1, const
string& visGeomTable, const string& visGeomColl, TeGeomRep
visRep, const string& objId2, const double& distance);

bool geomIntersection(const string& actGeomTable, const string&


actGeomColl, TeGeomRep actRep, const string& objId1, const
string& visGeomTable, const string& visGeomColl, TeGeomRep
visRep, const string& objId2, TeGeometryVect& geomVect);

Relações topológicas

A função SpatialRelation da API retorna os objetos geográficos que possuem


uma determinada relação topológica com um objeto específico. Assim como as outras
operações binárias, esses objetos podem estar armazenados em uma mesma tabela
espacial ou em tabelas distintas. Além disso, pode-se consultar relações topológicas
entre os objetos de uma tabela espacial e um objeto geográfico específico em memória,
ou seja, armazenado nas estruturas geográficas da TerraLib. A seguir são mostradas as
assinaturas dessa função:

bool spatialRelation(const string& actGeomTable, const string&


actGeomColl, const string& actCollTable, TeGeomRep actRep, Keys&
actIdsIn, TeDatabasePortal *portal, int relate, const double&
tol);

bool spatialRelation(const string& actGeomTable, const string&


actGeomColl, TeGeomRep actRep, Keys& actIdsIn, const string&
visGeomTable, const string& visGeomColl, const string&
visCollTable, TeGeomRep visRep, TeDatabasePortal *portal, int
relate, const double& tol);

bool spatialRelation(const string& actGeomTable, const string&


actGeomColl, const string& actCollTable, TeGeomRep actRep,

10-19
TeGeometry* geom, TeGeomRep geomRep, TeDatabasePortal *portal,
int relate, const double& tol);

Todas as assinaturas acima recebem como parâmetros de entrada: a relação topológica a


ser consultada (relate); a tolerância permitida (tol); e, a estrutura que conterá as
geometrias resultantes (portal). As geometrias resultantes são todos os objetos
geográficos da tabela espacial (actGeomTable) que possuem uma relação topológica
específica (relate) com um determinado objeto geográfico, o qual pode estar
armazenado na mesma tabela espacial (actGeomTable), em uma outra tabela
(visGeomTable) ou pode estar em memória (TeGeometry*). As possíveis relações
topológicas passadas como parâmetros de entrada são: TeDISJOINT, TeTOUCHES,
TeCROSSES, TeWITHIN, TeOVERLAPS, TeCONTAINS, TeINTERSECTS,
TeEQUALS, TeCOVERS e TeCOVEREDBY.

No TeDatabase, a operação SpatialRelation foi implementada em duas etapas,


seguindo a mesma idéia do modelo de consulta do Oracle Spatial. A primeira etapa é
executada sobre aproximações das geometrias, ou seja, sobre seu mínimo retângulo
envolvente, e a segunda, sobre as geometrias exatas. As duas etapas podem ser
resumidas em:

(1) Recuperar do SGBD, através de uma consulta em SQL, somente as geometrias


cujo mínimo retângulo envolvente possui alguma interseção com o mínimo
retângulo envolvente da geometria específica;

(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.

Figura 10.9 - Primeira etapa da consulta espacial

No TeOracleSpatial, a operação SpatialRelation monta uma consulta em


SQL utilizando o operador SDO_RELATE do Oracle Spatial e designa sua computação
ao SGBD. A extensão espacial executa a consulta e retorna o resultado final. Esse
operador recebe como parâmetro a relação topológica a ser consultada e utiliza a
indexação espacial criada sobre as tabelas espaciais envolvidas na 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'

O operador SDO_RELATE é usado sempre na cláusula WHERE de uma consulta em


SQL e recebe como parâmetros: as tabelas e suas colunas espaciais envolvidas na

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.

Operação Buffer no Oracle Spatial

A operação Buffer do TeOracleSpatial monta uma consulta em SQL utilizando


a função SDO_BUFFER da extensão espacial. Essa função retorna um objeto espacial
do tipo SDO_GEOMETRY, que representa a extensão de uma geometria específica
armazenada no banco. Esse objeto retornado é do tipo POLYGON, os dois últimos
dígitos de seu atributo SDO_GTYPE são iguais a “03”, e é formado por um conjunto de
elementos, onde cada elemento pode ser do tipo:

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 formado por segmentos de arcos circulares: SDO_ETYPE igual a


“1003” ou “2003” e SDO_INTERPRETATON igual a “2”;

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:

SELECT SDO_GEOM.SDO_BUFFER(g.spatial_data, m.diminfo, 1.0)


FROM teste_Linhas g, USER_SDO_GEOM_METADATA m
WHERE m.table_name = 'teste_Linhas'

10-22
AND m.column_name = 'spatial_data'
AND object_id = '17';

Essa consulta é executada pelo Oracle Spatial e retorna um SDO_GEOMETRY:

SDO_GEOMETRY (2003, NULL, NULL,


SDO_ELEM_INFO_ARRAY (1, 1005, 8, 1, 2, 2, 5, 2, 1, 9, 2, 2,
13, 2, 1, 15, 2, 2, 19, 2, 1, 23, 2, 2,
27, 2, 1),
SDO_ORDINATE_ARRAY (18, 17, 19, 18, 18, 19, 16.4142136, 19,
14.7071068, 20.7071068, 14, 21,
13.2928932, 20.7071068, 11.2928932,
18.7071068, 11.2928932, 17.2928932,
12.7071068, 17.2928932, 14, 18.5857864,
15.2928932, 17.2928932, 15.6173166,
17.0761205, 16, 17, 18, 17))

O objeto SDO_GEOMETRY retornado é um polígono composto, que é representado


pelo SDO_ETYPE igual a “1005”. Portanto, a decodificação desse objeto deve gerar um
polígono formado por segmentos de linhas retas e arcos circulares. A Figura mostra
esse polígono gerado a partir dos pontos retornados no SDO_GEOMETRY acima.
Pode-se observar que alguns pontos são conectados por um segmento de linha reta e
outros são conectados por um arco.

Figura 10.10 - Buffer formado por um polígono composto

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

Operações de conjunto no Oracle Spatial

As operações de conjunto da API geram as geometrias resultantes da interseção, união,


diferença ou diferença simétrica entre objetos geográficos. Assim como as demais
operações binárias, esses objetos geográficos podem estar armazenados em uma mesma
tabela espacial ou em tabelas distintas. As funções da API são:

geomIntersection: retorna a interseção topológica (operação AND) entre


objetos geográficos;

geomDifference: retorna a diferença topológica (operação MINUS) entre


objetos geográficos;

geomUnion: retorna a união topológica (operação OR) entre objetos


geográficos;

geomXOR: retorna a diferença simétrica topológica (operação XOR) entre


objetos geográficos.

Um exemplo do resultado dessas operações está ilustrado na Figura 10.2.


A
B

A A A A
R R
B R B B
B
R

A AND B = R A MINUS B = R A XOR B = R A OR B = R


Figura 10.2 - Operações de conjunto

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.

Como exemplo, considera-se que as geometrias A e B da Figura 10.2 estão armazenadas


na coluna espacial “spatial_data” das tabelas espaciais “lotes_Poligonos” e
“fronteiras_Poligonos”, respectivamente. Uma consulta em SQL para calcular a
diferença simétrica desses dois objetos geográficos é:

SELECT SDO_GEOM.SDO_XOR(g1.spatial_data, m1.diminfo,


g2.spatial_data, m2.diminfo)
FROM lotes_Poligonos g1, fronteiras_Poligonos g2,
USER_SDO_GEOM_METADATA m1, USER_SDO_GEOM_METADATA m2
WHERE m1.table_name = 'LOTES_POLIGONOS'
AND m1.column_name = 'SPATIAL_DATA'
AND m2.table_name = 'FRONTEIRAS_POLIGONOS'
AND m2.column_name = 'SPATIAL_DATA'
AND g1.object_id = 'A'
AND g2.object_id = 'B';

Essa consulta é executada pelo Oracle Spatial e retorna um SDO_GEOMETRY:

SDO_GEOMETRY (2007, NULL, NULL,


SDO_ELEM_INFO_ARRAY (1, 1003, 1, 15, 1003, 1, 29, 2003, 1),
SDO_ORDINATE_ARRAY (24, 16, 24, 8, 32, 8, 32, 18, 28,
18, 28, 16, 24, 16, 10, 30, 10,

10-25
16, 24, 16, 24, 18, 28, 18, 28,
30, 10, 30, 20, 20, 20, 26, 26,
26, 26, 20, 20, 20))

O objeto SDO_GEOMETRY retornado é do tipo MULTIPOLYGON, os dois últimos


dígitos de seu atributo SDO_GTYPE são iguais a “07”, que é formado por um conjunto
de polígonos. Portanto, a decodificação desse objeto deve gerar um TePolygonSet,
estrutura de dados geográficos da TerraLib para representar conjuntos de polígonos.

Operações sobre dados matriciais

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.

A classe da TerraLib específica para tratar dados matriciais é chamada TeRaster.


Essa classe, juntamente com outras estruturas da biblioteca, é capaz de manipular um
dado matricial armazenado tanto em arquivos de diferentes formatos, como JPEG e
geoTIFF, quanto em SGBDs. Nos SGBDs, cada geo-campo associado a um plano de
informação, ou layer, é armazenado em uma tabela espacial do tipo raster.

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)

bool TeRasterStatisticsInPoly (TePolygon& poly, TeRaster*


raster, TeStatisticsDimensionVect& stat)

TeRaster* TeMask (TeRaster* rasterIn, TePolygon& poly,


TeIteratorStrategic st)

A função TeRasterStatisticsInPoly calcula as estatísticas de um geo-campo


(raster) na região delimitada por um polígono (poly). No caso de geo-campos que
são formados por n dimensões ou bandas, como as imagens se sensoriamento remoto, é
possível calcular as estatísticas de uma dimensão específica passada como parâmetro
(band). Neste caso, a função retorna uma estrutura do tipo TeStatisticValMap,
que faz o mapeamento de cada estatística gerada e seu respectivo valor. Se nenhuma
dimensão específica for passada como parâmetro, como na segunda assinatura, são
calculadas as estatísticas de todas as bandas do raster. Assim, a função retorna uma
estrutura do tipo TeStatisticsDimensionVect, que faz o mapeamento entre
cada dimensão e suas respectivas estatísticas.

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.

A função TeMask recorta um raster de entrada (rasterIn) a partir de um polígono


(poly), segundo alguma estratégia (TeIteratorStrategic), gerando um raster de
saída. A estratégia define como o polígono é considerado no recorte do raster de
entrada, se é considerado sua região interna ou externa.

Para implementar as funções acima, foi necessário desenvolver um mecanismo para


percorrer o dado raster somente na região interna ou externa de um polígono específico.
Para isso, foi implementado o conceito de iterador, sobre a classe TeRaster, capaz de

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 sobre Dados Matriciais

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:

“o elemento atualmente apontado” (dereferência, representada pelos operadores


* e –>);

“apontar para o próximo elemento” (incremento, representado pelo operador +


+);

“verificar se é igual a outro ponteiro, ou seja, se apontam para o mesmo lugar”


(igualdade, representada pelo operador = =).

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

Figura 10.3 - Classe IteratorPoly

A seguir é mostrado, como exemplo, um procedimento para somar os valores de todos


os pixels, da primeira banda de uma imagem, internos a um polígono, utilizando o
iterador implementado. Neste exemplo, o iterador é gerado sobre uma imagem do tipo
TeRaster (Image) e recebe como parâmetros o polígono limitante do tipo
TePolygon (poly) e a estratégia de percurso (TeBoxPixelIn).

TeRaster::iteratorPoly it = Image->begin(poly, TeBoxPixelIn);


double sum=0.0;
while(it != Image->end(poly, TeBoxPixelIn))
{
sum += (*it)[0]; //dereferência

10-29
++it; //incremento
}

Foram implementadas quatro estratégias de percurso para o iterador:

TeBoxPixelIn: percorre todas as células do raster cujo centro é interno ao


polígono;

TeBBoxPixelInters: percorre todas as células do raster cujo segmento


horizontal que passa pelo seu centro possui alguma interseção com o polígono;

TeBoxPixelOut: percorre todas as células do raster cujo centro é externo ao


polígono;

TeBBoxPixelNotInters: percorre todas as células do raster cujo segmento


horizontal que passa pelo seu centro não possui nenhuma interseção com o
polígono.

Figura 10.4 - Estratégias de percurso

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

TeBBoxPixelNotInters: (1,1), (1,2), (1,3), (1,4), (1,5), (1,6), (2,1), (2,6),


(3,1), (3,6), (4,1), (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).

Para calcular o segmento de interseção entre uma determinada linha do geo-campo e o


polígono, é utilizada uma função chamada TeGetIntersections. Essa função é
utilizada pelo método getNewSegment do iteratorPoly e retorna a seqüência
dos segmentos resultantes em uma estrutura chamada TeCoordPairVect. Assim,
cada estratégia foi implementada como um objeto função, ou functor (Austern, 1998), o
qual é aplicado na estrutura TeCoordPairVect resultante da função
TeGetIntersections. O Anexo C mostra a implementação em C++ dessas
estratégias como objeto função e sua utilização pela função applyStrategic.

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.

Função de estatística genérica

A função para calcular as estatísticas da operação Zonal foi implementada de forma


genérica para ser utilizada por qualquer estrutura de dados que possua um iterador capaz

10-31
de percorrê-la, e não somente pelo tipo TeRaster. As assinaturas dessa função são
mostradas abaixo:

template<typename It> bool TeCalculateStatistics(It& itBegin,


It& itEnd, TeStatisticValMap& stat, int dim)

template<typename It> bool TeCalculateStatistics(It& itBegin,


It& itEnd, TeStatisticsDimensionVect& stat)

template<typename It> bool TeCalculateStatistics(It& itBegin,


It& itEnd, TeStatisticValMap& stat)

Todas as assinaturas da função TeCalculateStatistics recebem como


parâmetros de entrada um iterador apontado para o início (itBegin) e outro para o
final (itEnd) da estrutura de dados. As duas primeiras assinaturas são utilizadas para
calcular as estatísticas de uma estrutura de dados que possui n dimensões. E a última,
para calcular as estatísticas de estruturas de dados que possuem apenas duas dimensões.
A implementação em C++ dessa função é mostrada no Anexo B.

Para exemplificar, é mostrada abaixo a utilização da função


TeCalculateStatistics pela função TeRasterStatisticsInPoly:

bool TeRasterStatisticsInPoly ( TePolygon& poly, TeRaster* raster,


int band, TeStatisticValMap& stat)
{
TeRaster::iteratorPoly itBegin = raster->begin(poly, TeBoxPiIn);
TeRaster::iteratorPoly itEnd = raster->end(poly, TeBoxPixelIn);
return(TeCalculateStatistics(itBegin, itEnd, stat, band));
}

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

As operações sobre dados matriciais implementadas na classe TeDatabase utilizam


as funções TeRasterStatisticsInPoly e TeMask, já mostradas anteriormente.
Suas assinaturas são:

bool Zonal (const string& rasterTable, const string&


actGeomTable, Keys& Ids, TeObjectStatistics & result);

bool Zonal (const string& rasterTable, const string&


actGeomTable, const string& actCollTable, TeObjectStatistics&
result);

bool Zonal (const string& rasterTable, TePolygon& poly,


TeRasterStatistics& result);

bool Mask (const string& rasterTable, const string&


actGeomTable, const string& objId, const string& nameLayerOut,
TeStrategicIterator st);

bool Mask (const string& rasterTable, TePolygon& poly, const


string& nameLayerOut, TeStrategicIterator st);

A operação Zonal recebe como parâmetros de entrada o nome da tabela espacial do


tipo raster (rasterTable), onde está armazenado o dado matricial, e as geometrias
que definem as zonas. Essas geometrias podem estar armazenadas em tabelas espaciais
(actGeomTable) ou estar em memória (poly). Quando as geometrias estão em uma

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

A operação Mask, ou de Recorte, recebe como parâmetros de entrada o nome da tabela


do tipo raster (rasterTable) onde está o raster que será recortado, a estratégia de
percurso para definir a região que será recortada (st) e a geometria que irá definir a
máscara do recorte. Essa geometria pode estar armazenada em uma tabela espacial
(actGeomTable) ou estar em memória (poly). O resultado dessa operação é uma
classe TeLayer que contém o raster recortado, cujo nome é passado como parâmetro
(nameLayerOut).

A partir do nome da tabela do tipo raster, as funções recuperam o dado matricial do


SGBD e criam um objeto do tipo TeRaster. As geometrias também são recuperadas
do SGBD através do nome da tabela espacial e são mapeadas para a classe
TePolygon. E, finalmente, essas operações utilizam as funções
TeRasterStatisticsInPoly e TeMask sobre os objetos TeRaster e
TePolygon gerados.

10-34
10.3 UTILIZAÇÃO E RESULTADOS

10.3.1 Introdução

As operações implementadas na API foram testadas através do TerraView, um


aplicativo geográfico construído sobre a TerraLib (Ferreira et al, 2002). A seguir é
mostrada a tela de interface com o usuário desenvolvida para operações sobre dados
vetoriais.

Figura 10.14 - Tela de operações espaciais sobre dados vetoriais

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.

As operações na tela são divididas em consultas sobre relações topológicas e funções


espaciais. Os ícones das relações topológicas são habilitados conforme as
representações geométricas dos temas selecionados. As funções espaciais disponíveis na
tela são: área, comprimento ou perímetro, distância, geração de uma nova geometria a

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.

Figura 10.15 - Tela de operações espaciais sobre dados matriciais

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

//informações sobre o tema estados_Brasil


TeGeomRep actRep = estados_Brasil->visibleRep();
string actTable = estados_Brasil->layer()->tableName(actRep);
string actColTable = estados_Brasil->collectionTable();

Keys IdsIn, IdsOut;


string obj_id = “MG”;
IdsIn.push_back(obj_id);
string collName = “spatial_data”;

int relate = TeTOUCHES;


int tol = 0.001;

db->spatialRelation(actTable, collName, actColTable, actRep, IdsIn,


IdsOut, relate, tol);

No código da consulta 1, as informações são extraídas do tema estados_Brasil: sua


representação geométrica (actRep), o nome da tabela espacial que contém os objetos
(actTable) e o nome da tabela de coleção onde estão armazenadas informações sobre
os objetos do layer que fazem parte do tema (actColTable). O nome da coluna
espacial é fixo nas tabelas geométricas do modelo da TerraLib (collName =
“spatial_data”). O objeto do tipo TeDatabase (db) é instanciado conforme o
SGBD utilizado, podendo ser TeAdo, TeOracleSpatial ou TeMySQL e, a partir
do seu método spatialRelation, a consulta é executada.

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:

TeDatabasePortal* portal = db->getPortal();


db->spatialRelation(actTable, collName, actColTable, actRep, IdsIn,
portal, relate, tol);

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.

Figura 10.16- Objeto selecionado Figura 10.17 - Resultado da consulta

Consulta 2) Encontre todos os rios do Brasil que cruzam a fronteira do estado de Minas
Gerais ou do Paraná.

//TeTheme* estados_Brasil, rios_Brasil


//TeDatabase* db (TeAdo ou TeOracleSpatial ou TeMySQL)
//typedef vector<string> Keys

//informações sobre o tema estados_Brasil


TeGeomRep actRep = estados_Brasil->visibleRep();

10-38
string actTable = estados_Brasil->layer()->tableName(actRep);

//informações sobre o tema rios_Brasil


TeGeomRep visRep = rios_Brasil->visibleRep();
string visTable = rios_Brasil->layer()->tableName(visRep);
string visColTable = rios_Brasil->collectionTable();

string collName = “spatial_data”;

Keys IdsIn, IdsOut;


string obj_id1 = “PR”;
IdsIn.push_back(obj_id1);
string obj_id2 = “MG”;
IdsIn.push_back(obj_id2);

int relate = TeCROSSES;


int tol = 0.001;

db->spatialRelation(actTable, collName, actRep, IdsIn, visTable,


collName, visColTable, visRep, IdsOut, relate, tol);

No código da consulta 2, o método spatialRelation recebe as informações sobre


os dois temas envolvidos, estados_Brasil e rios_Brasil, como parâmetros de entrada, que
são: suas representações geométricas (actRep e visRep), os nomes das tabelas e
das colunas espaciais que contêm os objetos (actTable, visTable e
collName) e o nome da tabela de coleção onde estão armazenadas informações sobre
os objetos do layer que fazem parte do tema rios_Brasil (visColTable). O nome das
colunas espaciais de todas tabelas geométricas do modelo da TerraLib é fixo
(collName = “spatial_data”). Além disso, são passados como parâmetros: a
relação topológica a ser executada (relate = TeCROSSES), o conjunto dos
identificadores dos objetos sobre os quais a consulta será realizada (IdsIn = “MG” e
“PR”), a tolerância permitida (tol = 0.001) e a estrutura que conterá os identificadores
dos objetos resultantes (IdsOut). Há também a opção de retornar todos os objetos

10-39
geográficos resultantes, e não somente seus identificadores, passando um objeto do tipo
TeDatabasePortal (portal), como mostrado abaixo:

TeDatabasePortal* portal = db->getPortal();


db->spatialRelation(actTable, collName, actRep, IdsIn, visTable,
collName, visColTable, visRep, portal, relate, tol);

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.

Figura 10.18 - Objetos selecionados Figura 10.19 - Resultado da consulta

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

//informações sobre o tema rios_Brasil


TeGeomRep actRep = rios_Brasil->visibleRep();
string actTable = rios_Brasil->layer()->tableName(actRep);

string collName = “spatial_data”;


TePolygonSet bufferSet;
double dist = 0.5;

Keys IdsIn;
string obj_id1 = “1140”;
IdsIn.push_back(obj_id1);
string obj_id2 = “1255”;
IdsIn.push_back(obj_id2);

db->Buffer(actTable, collName, actRep, IdsIn, bufferSet, dist);

O método Buffer do TeDatabase é utilizado para essa operação e recebe como


parâmetros de entrada: o nome da tabela e da coluna espacial (actTable e
collName) onde estão armazenados os objetos do tema; sua representação geométrica
(actRep); o conjunto dos identificadores dos objetos sobre os quais as novas
geometrias serão geradas (IdsIn = “1140” e “1255”); a distância considerada (dist
= 0.5); e, a estrutura que conterá as geometrias geradas (bufferSet), que deve ser do
tipo TePolygonSet. Como a função para gerar uma nova geometria a partir de uma
distância em torno de uma geometria específica (buffer) ainda não está implementada na
TerraLib, o TeDatabase tem que ser do tipo TeOracleSpatial para realizar essa
operação. Os resultados são mostrados na Figura .

10-41
Figura 10.20 - Buffers gerados

Figura 10.21 - Buffer do país Hungria Figura 10.22 - Buffer da cidade de Roma

Para ilustrar a geração de novas geometrias ao redor de polígonos e pontos, são


mostradas na Figura uma geometria gerada ao redor do país Hungria e na Figura 10.22
gerada ao redor da cidade de Roma.

Exemplo 2) Encontre os 10 rios mais próximos ao rio Tapaua, cujo identificador é


“1562”.

//TeTheme* rios_Brasil
//TeDatabase* db = new TeOracleSpatial()

//informações sobre o tema rios_Brasil


TeGeomRep actRep = rios_Brasil->visibleRep();
string actTable = rios_Brasil->layer()->tableName(actRep);
string actColTable = rios_Brasil->collectionTable();

10-42
string collName = “spatial_data”;

string objId = “1562”;


Keys IdsOut;
int num_result = 10;

db->nearestNeighbors(actTable, collName, actColTable, actRep,


objId, IdsOut, num_result);

Para a operação de vizinho mais próximo é utilizado o método nearestNeighbors


do TeDatabase. Esse método recebe como parâmetros de entrada: o nome da tabela e
da coluna espacial (actTable e collName) onde estão armazenados os objetos do
layer; o nome da tabela de coleção onde estão as informações sobre o subconjunto
desses objetos que fazem parte do tema (actColTable); sua representação
geométrica (actRep); o identificador do objeto sobre o qual a operação será realizada
(objId = “1562”); o número de vizinhos esperados (num_result); e, a estrutura que
conterá os identificadores dos objetos resultantes (IdsOut). Há também a opção de
retornar todos os objetos geográficos resultantes, e não somente seus identificadores,
passando um objeto do tipo TeDatabasePortal (portal), como mostrado abaixo:

TeDatabasePortal* portal = db->getPortal();


db->nearestNeighbors(actTable, collName, actColTable, actRep,
objId, portal, num_result);

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

Operações sobre dados matriciais

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

A operação Mask da API consiste em recortar um raster a partir de uma máscara


definida por um polígono. O recorte pode ser feito a partir da região interna ou externa
ao polígono, dependendo da estratégia escolhida. Esta operação gera um novo layer que
contém o raster recortado.

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)

//informações sobre o tema Imagem_Brasilia


string rasterTable = Imagem_Brasilia->
layer()->tableName(TeRASTER);

//nome do layer de saída


string nameLayerOut = "Imagem_Brasilia_Mask_In";

//estratégia
TeStrategicIterator strat = TeBoxPixelIn;

//identificador do polígono máscara


string objId = "polígono1";

// informações sobre o tema Poligonos_Mask


string geomTable = Poligonos_Mask->
layer()->tableName(TePOLYGONS);

db->Mask(rasterTable, geomTable, objId, nameLayerOut, strat);

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.

Operação 2) Recortar a imagem de Brasília a partir da região externa ao polígono cujo


identificador é “polígono1”:

// TeTheme* Imagem_Brasilia
// TeTheme* Poligonos_Mask
// TeDatabase* db (TeAdo ou TeOracleSpatial ou TeMySQL)

//informações sobre o tema Imagem_Brasilia


string rasterTable = Imagem_Brasilia->
layer()->tableName(TeRASTER);

//nome do layer de saída


string nameLayerOut = "Imagem_Brasilia_Mask_Out";

//estratégia
TeStrategicIterator strat = TeBoxPixelOut;

//identificador do polígono máscara


string objId = "polígono1";

// informações sobre o tema Poligonos_Mask


string geomTable = Poligonos_Mask->
layer()->tableName(TePOLYGONS);

db->Mask(rasterTable, geomTable, objId, nameLayerOut, strat);

O código mostrado acima é semelhante ao código da operação 1, só mudando o nome


do layer gerado como resultado (strat = "Imagem_Brasilia_Mask_Out") e a
estratégia utilizada no recorte, que nesta operação é a partir da região externa à máscara
(strat = TeBoxPixelOut). O layer resultante dessa operação é mostrado na
Figura .

10-46
Figura 10.25-Imagem de Brasília

Figura 10.26 - layer Figura 10.27 - layer


Imagem_Brasilia_Mask_In Imagem_Brasilia_Mask_Out

Operação Zonal

A operação Zonal consiste em calcular as estatísticas de uma determinada região de


um geo-campo delimitada por um polígono. Como exemplo, será mostrado o código
para a operação “Calcule as estatísticas da imagem de Brasília da zona delimitada pelo
polígono cujo identificador é ‘poligono1’”. Essa operação envolve os temas
Imagem_Brasilia e Poligonos_Mask que contêm, respectivamente, a imagem de Brasília
e o polígono que define a zona de interesse. A sobreposição desses temas é mostrada na
Figura e o código é mostrado a seguir:

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;

//informações sobre o tema Imagem_Brasilia


string rasterTable = Imagem_Brasilia->
layer()->tableName(TeRASTER);

//identificador do polígono máscara


string Id = "poligono1";
Ids.push_back(Id);

// informações sobre o tema Poligonos_Mask


string geomTable = Poligonos_Mask->
layer()->tableName(TePOLYGONS);

db->Zonal(rasterTable, geomTable, Ids, result);

A operação Zonal é executada através de um método do objeto TeDatabase (db),


que é instanciado conforme o SGBD utilizado, podendo ser um TeAdo,
TeOracleSpatial ou TeMySQL. Esse método recebe como parâmetros de entrada:
os nomes das tabelas onde estão armazenados o dado raster (rasterTable) e os
polígonos que definem as zonas (geomTable). Como mostrado no código acima, essas
informações são extraídas dos temas correspondentes. Além desses parâmetros, o
método recebe: os identificadores dos polígonos que definem as zonas (Ids) e a
estrutura de dados que conterá os resultados (result), que é do tipo
TeObjectStatistics, a qual faz o mapeamento de cada zona e suas estatísticas
correspondentes. Na Figura , é mostrada uma interface gráfica desenvolvida no

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.

Figura 10.28 - Tela de estatística

10-49
10.4 CONCLUSÃO E TRABALHOS FUTUROS

Este trabalho apresentou o desenvolvimento de uma API (Application Programming


Interface) para operações espaciais em banco de dados geográficos, implementada na
TerraLib, uma biblioteca base para a construção de aplicativos geográficos de
arquitetura integrada. Essa nova arquitetura consiste em utilizar SGBDs para armazenar
e gerenciar dados geográficos, explorando seus recursos como controle de integridade e
concorrência, gerência de transações, restrições de acessos e mecanismos para
recuperação de falhas.

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:

(1) Algumas operações, quando aplicadas a dados geográficos armazenados em


SGBDs que não possuem extensão espacial, não são realizadas, pois ainda não
foram implementadas na TerraLib para dados em memória. Dentre essas
operações estão: cálculo dos vizinhos mais próximos de um objeto; 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.

(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.

Booch, G. Object-Oriented Analysis and Design - with applications. California:


Benjamin/Cummings Publishing Company, 1994. 500 p.

Burrough, P. A.; McDonnell, R. A. Principles of Geographical Information Systems.


New York: Oxford University Press, 1998. 332 p.

Câmara, G.; Casanova, M. A.; Hemerly, A. S.; Magalhães, G. C.; Medeiros, C. B.


Anatomia de Sistemas de Informação Geográfica. Campinas: 10ª Escola de
Computação, 1996. 193 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.

Cordeiro, J. P. C.; Câmara, G.; Freitas, U. M.; Barbosa, C. C. F. LEGAL: An Object-


Oriented Map Algebra Language. Instituto Nacional de Pesquisas Espaciais : A ser
publicado.

Drexel University. The Math Forum [online], 2003. <http://mathforum.org/dr.math/>.


Visitado em fevereiro de 2003.

Egenhofer, M. Spatial Information Appliances: A Next Generation of Geographic


Information Systems. 1999. First Brazilian Workshop on GeoInformatics .
Egenhofer, M. A Model for Detailed Binary Topological Relationships. Geomatica, v.
47, n. 3 & 4, p. 261-273, 1993.

Egenhofer, M. J. Spatial SQL: A Query and Presentation Language. IEEE


Transactions on Knowledge and Data Engineering , v. 6, n. 1, p. 86-95, 1994.

Egenhofer, M. J.; Herring, J. R. Categorizing Binary Topological Relations Between


Regions, Lines, and Points in Geographic Databases. Maine, USA: University of
Maine, 1991.

Egenhofer, M.; Clementini, E.; Di Felice, P. Topological relations between regions


with holes. International Journal of Geographical Information Systems , v. 8, n. 2,
p. 129-144, 1994.

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.

ESRI ArcSDE[online]. <http://arcsdeonline.esri.com/index.htm>. Mar. 2003.


Ferreira, K. R.; Queiroz, G. R.; Paiva, J. A. C.; Souza, R. C. M.; Câmara, G.
Arquitetura de Software para Construção de Bancos de Dados Geográficos com
SGBD Objeto-Relacionais. p. 57-67, 2002. XVII Simpósio Brasileiro de Banco de
Dados.

Frank, A. U. Requirements for Database Systems Suitable to Manage Large Spatial


Databases. Photogrammetric Engineering & Remote Sensing , v. 11, n. 54, p. 1557-
1564, 1988.

Gamma, E.; Helm, R.; Johnson R.; Vlissides, J. Design patterns - elements of
reusable object-oriented software. USA: Addison-Wesley, 1995.

Güting, R. An Introduction to Spatial Database Systems. VLDB Journal, v. 3, 1994.

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.

IBM Corporation. Working with the Geodetic and Spatial DataBlade


Modules[online]. <http://www-
3.ibm.com/software/data/informix/pubs/manuals/geo_spatial.pdf> 2002.

Korth, F. H.; Silberschatz, A. Sistemas de Bancos de Dados. São Paulo: McGraw-


Hill, 1994. 693 p.

Köthe, U. STL-Style Generic Programming with Images. C++ Report Magazine, v.


12, n. 1. Jan. 2000.

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.

Paiva, J. A. C. Topological Equivalence and Similarity in Multi-Representation


Geographic Database. Maine, USA - University of Maine, 1998.

Ramsey, P. PostGis Manual[online]. <<http://postgis.refractions.net>> 2002.

Ravada, S.; Sharma, J. Oracle8i Spatial: Experiences with Extensible Databases.


SSD'99. R. H. Guting, D. Papadias and F. Lochovsky, p. 355-359, 1999.

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.

TerraLib[online]. <www.TerraLib.org> 2003.

Tomlin, C. D. Geographic Information Systems and Cartographical Modeling.


New York: Prentice-Hall , 1990.

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.

Voisard, A.; Schweppe, H. Abstraction and Decomposition in Open GIS . Berkeley,


California: International Computer Science Institute, 1997. (TR-97-006)

10-53

Você também pode gostar