You are on page 1of 59

MINISTÉRIO DO MEIO AMBIENTE

MMA

PROGRAMA NACIONAL DE MEIO AMBIENTE


PNMA II

APOSTILA DE INSTALAÇÃO, CONFIGURAÇÃO E DESENVOLVIMENTO


DE APLICAÇÕES BASEADAS NO SOFTWARE PÚBLICO I3GEO.

MÓDULO BÁSICO

ANDRÉ LUCIANCENCOV REDIVO

Apoio:
COORDENAÇÃO GERAL DE TECNOLOGIA DA INFORMAÇÃO E INFORMÁTICA – CGTI/MMA

Brasíla, 05 de Agosto de 2010


Sumário
1. MONTAGEM DO SERVIDOR PARA A INSTALAÇÃO DO I3GEO NO UBUNTU...................2
1.1. SERVIDOR WEB APACHE2...................................................................................................3
1.2. PHP...........................................................................................................................................4
1.3. MAPSERVER...........................................................................................................................5
1.4. POSTGRESQL E POSTGIS.....................................................................................................5
1.5. R E SPATSTAT.........................................................................................................................6
1.6. GHOSTSCRIPT........................................................................................................................7
2. INSTALAÇÃO E CONFIGURAÇÃO DO I3GEO.........................................................................7
2.1 CONFIGURANDO O ARQUIVO MS_CONFIGURA.PHP ...................................................7
2.2. CONFIGURANDO O ARQUIVO GERAL1.MAP...............................................................11
2.3. TESTE DE INSTALAÇÃO....................................................................................................12
3. CRIAÇÃO DE BANCO DE DADOS ESPACIAL........................................................................12
3.1. CONEXÃO COM O BANCO DE DADOS POSTGRESQL................................................13
3.2. USUÁRIOS DO BANCO DE DADOS..................................................................................14
3.3. BASE DE DADOS ................................................................................................................15
3.4. TABELAS COM DADOS ESPACIAIS.................................................................................16
3.4.1. IMPORTANDO ESRI SHAPEFILES NO BANCO POSTGRESQL............................16
3.4.2. CRIANDO TABELAS A PARTIR DA LINGUAGEM SQL.........................................19
4. MAPFILES.....................................................................................................................................20
4.1. TAGS PRINCIPAIS................................................................................................................21
4.2. TAGS OPICIONAIS...............................................................................................................25
4.3. TAGS PARA INCLUSÃO DE LABELS NAS LAYERS......................................................28
4.4. TAGS PARA CONEXÃO COM BANCO DE DADOS POSTGRESQL..............................30
4.5. TAGS PARA CONEXÃO COM WEBSERVICES WMS......................................................32
4.6. TAGS PARA REPRESENTAÇÃO DE ARQUIVOS RASTER............................................34
5. DESENVOLVENDO UMA APLICAÇÃO BASEADA NO I3GEO.............................................34
1. MONTAGEM DO SERVIDOR PARA A INSTALAÇÃO DO
I3GEO NO UBUNTU

Este ITEM descreve os passos necessários para a montagem de um Servidor Web,


com todos os programas e bibliotecas exigidas para o funcionamento do software i3GEO,
no Ubuntu 9.10, porém estes procedimentos, os programas e as bibliotecas que serão
instalados são as mesmas para outras distribuições Linux, podendo este servir de base
para a montagem do servidor em outras distribuições Linux.

Alguns pacotes disponíveis no repositório do do Ubuntu 9.10 e 10.04 são


incompatíveis com o i3geo, como é o caso do PHP 5.3 disponível no repositório do
Ubuntu 10.04, bem como as versões 5.4 e 5.6 do mapserver presentes nos repositórios
do Ubuntu 9.10 e 10.04 respectivamente. A utilização destes pacotes afeta algumas
ferramentas do i3geo, sendo recomendado a utilização dos pacotes do Apache2, PHP5 e
do Mapserver presentes no repositório do Ubuntu 9.04. Para instalar estes pacotes faça
os procedimentos a seguir:

1. Copie a source.list do Lucid(Ubuntu 10.04) ou Kamic(Ubuntu 9.10) para sources.list.d/,


pasta onde se adicionam expansões para o apt-get. Não altere o sources.list crie sua lista
e adicione ela nessa pasta, trocando a origem dos pacotes para o Jaunty conforme
comando abaixo:

sed s/lucid/karmic/g /etc/apt/sources.list | sudo tee /etc/apt/sources.list.d/jaunty.list

2. No gerenciador de pacotes synaptic vá ao menu configurações, preferências e clique


na guia distribuição.

3. Na guia distribuição marque a opção preferir versões de: e escolha a opção Jaunty.

4. Instale os pacotes e dependências do Apache2, PHP5 e Mapserver, conforme os


subitens que tratam destas intalações neste tutorial. Após instalar volte a guia distribuição
e marque a opção “Sempre preferir versão mais nova” para continuar as instalações dos
outros pacotes.

1.1. SERVIDOR WEB APACHE2

O primeiro passo para fazer o I3Geo funcionar, é instalar o servidor web Apache
(www.apache.org), para tanto basta o usuário acessar o Gerenciador de Pacotes Synaptic
no menu Sistemas >> Administração e no campo procurar digitar apache2. De um duplo
clique na opção apache2, o gerenciador de pacotes irá procurar todas as dependências
do apache necessárias para a instalação, clique em marcar e depois em aplicar e o
apache será instalado.

Para testar se a instalação esta correta digite a url http://localhost no navegador de


interet, se aparecer na tela uma menssagem do tipo “It Works”, sua instalação foi
realizada com suscesso.

O diretório padrão do Apache2 no Ubuntu é o /var/www/, caso queira alterar este


diretório faça os procedimentos abaixo:

a) Abra o terminal e entre no diretório /etc/apache2/sites-enabled/


b) Abra o arquivo 000-default, como root, em um editor de texto (nano, vim, gedit) da
seguinte forma: sudo nano 000-default.
c) Altere os dois caminhos do bloco DocumentRoot conforme abaixo:

DocumentRoot /var/www (coloque aqui o novo caminho para o DocumentRoot do Apache2)


<Directory />
Options FollowSymLinks
AllowOverride None
</Directory>
<Directory /var/www/> (coloque aqui o novo caminho para o DocumentRoot do Apache2)
Options Indexes FollowSymLinks MultiViews
AllowOverride None
Order allow,deny
allow from all
</Directory>

Onde aparecer o caminho /var/www altere para o novo diretório.


d) Pare o servidor apache utilizando o comando:
sudo /etc/init.d/apache2 stop

e) Reinicie o servidor apache utilizando o comando:


sudo /etc/init.d/apache2 start

Pronto o novo DocumentRoot do Apache esta configurado, para testá-lo mova o


arquivo index.html da pasta /var/www para o novo diretório e em seguida digite localhost
no seu Navegador de Internet. Se aparecer uma página com os dizeres “It Works!” seu
servidor apache esta pronto para ser usado.

1.2. PHP

Da mesma forma que a instalação do apache abra o Gerenciador de Pacotes


Synaptic e em procurar digite PHP5 (www.php.net). Certifique-se que o Ubuntu instale os
seguintes componentes, bem como todas as suas dependências:
Na instalação do php são necessários os seguintes pacotes:

php5; php5-cgi; php5-cli; php5-common; php5-curl; php5-gd; php5-mapscript; php5-odbc;


php5-pgsql; php5-sqlite; php5-xmlrpc; php5-xsl; libapache2-mod-php5;

1.3. MAPSERVER

O MapServer CGI é usado para a criação de webservices cartográficos no padrão


WMS e WFS, sendo também utilizado em alguns processos do i3GEO, por este motivo
recomendamos sua instalação no servidor. Para instalar o MapServer basta digitar
mapserver no Gerenciador, marcar os pacotes cgi-mapserver e mapserver-bin e aplicar a
instalação
Nota: após instalar o MapServer vá para a guia distribuição do menu Configurações >>
Preferências e marque a opção “Sempre preferir versão mais nova”. Feito isto vá ao botão
procurar e digite libpq5, esta biblioteca vai aparecer na lista como instalada, clique com o
mouse sobre ela e marque a opção atualizar e em seguida clique em aplicar. Este
procedimento atualizará a libpq5 para que possamos instalar o postgresql 8.4.

1.4. POSTGRESQL E POSTGIS

O postgreSQL (www.postgresql.org) é um banco de dados livre que possui uma


extensão espacial, o PostGis, para armazenar dados geográficos. O I3Geo não depende
de banco de dados para funcionar corretamente, portanto a instalação do PostgreSQL
deve ser feita apenas se o usuário for mantar seus dados geográficos em um banco de
dados, caso este deseje trabalhar apenas com arquivos vetoriais (Shapefile, GML, …) a
instalação do PostgreSQL não será necessária.
A instalação do postgresql pode ser feita a partir do Gerenciador de Pacotes
Synaptic, digitando no campo procurar postgresql, você pode instalar também o pgadmin
para gerenciar os bancos criados.
Na instalação do postgresql são necessários os seguintes pacotes:
postgresql; postgresql-8.4; postgresql-contrib-8.4; postgresql-common; postgresql-client;
postgresql-client-8.4; postgresql-client-common.
No Ubuntu 10.04 deve-se marcar também o pacote postgresql-8.4-postgis e todas
as suas dependências.
No Ubuntu 9.10 este pacote não esta disponível no repositório, sendo necessário
compilar o postgis a partir dos fontes disponíveis na página http://postgis.refractions.net/.
Para compilar o postgis siga os procedimentos a seguir:

a) Faça o download do postgis versçao 1.4.2 ou 1.5.1 e descompacte-o no seu


computador;
b) Instale o pacote postgresql-server-dev pelo Synaptic ou pelo terminal com o apt-get;
c) Instale as bibliotecas libgeos-dev; libgeos-c1; libgeos-3.1.0; libogdi3.2; libproj-dev; e
libproj0;
d) Entre na pasta do postgis pelo terminal e digite ./configure;
e) Digite o comando Make e em seguida digite Make Install;
f) A instalação do postgis esta completa;

1.5. R E SPATSTAT

O R é um pacote estatístico utilizado pelo I3Geo para gerar gráficos e fazer


algumas análises espaciais. A não instalação do R prejudica algumas funcionalidades do
I3Geo, mas não impede o seu funcionamento.
Para instalá-lo procure no gerenciador synaptic os pacotes r-base e r-base-core
marque-os e mande o gerenciador aplicar, ou digite no terminal sudo apt-get install r-base
r-base-core.
A versão disponível no repositório do Ubuntu 9.10 é incompatível com a versão
mais recente do spatstat, desta forma deve-se baixar a ultima versão do R na página
http://www.r-project.org. Procure os pacotes .deb r-base, r-base-core e r-cran-codetools.
Instale primeiro o r-cran-codetools com o comando dpkg -i, depois instale o r-base e por
fim o r-base-core.
No Ubuntu 10.04 não é necessário realizar o procedimento acima pois a verão do
R disponível é compatível com o spatstat.
Para instalar o SPATSTAT é necessário fazer o download do arquivo tar.gz na
página www.spatstat.org/spatstat. Nesta página além de baixar o spatstat, também é
possível fazer o donwload das bibliotecas gpclib e deldir, obrigatórias para a instalação do
SPATSTAT.
Existem outras bibliotecas que podem ser instaladas para complementar o spatstat,
como a mgcv, rpanel, scatterploter3d e sm.
Após realizar os downloads referidos acima siga os procedimentos abaixo:

a) No terminal dirija-se até a pasta onde estão os arquivos tar.gz do SPATSTAT e das
bibliotecas;
b) Digite o comando R CMD INSTALL nome do arquivo tar.gz da biblioteca gpclib;
c) Repita o procedimento acima para o deldir e para as outras bibliotecas;
d) Por fim digite o mesmo comando para o arquivo tar.gz do spatstat.

1.6. GHOSTSCRIPT

Por fim instale o ghostscript, necessário para geração de imagens pelo R, a partir
do Gerenciador de Pacotes Synaptic. Marque os pacotes:
gs; gs-common; gs-esp; gs-esp-x

2. INSTALAÇÃO E CONFIGURAÇÃO DO I3GEO

Este tutorial tem como finalidade demonstrar a instalação e configuração do i3geo


na distribuição Linux Ubuntu 9.10 e 10.04. Para instalar e configurar o i3geo, copie a
pasta I3geo (http://mapas.mma.gov.br/download ou do SVN do Portal) para o diretório do
apache (padrão do Ubuntu /var/www/) e configure os endereços da aplicação conforme
instruções dos subitens deste tutorial.

2.1 CONFIGURANDO O ARQUIVO MS_CONFIGURA.PHP

Abra o arquivo /i3geo/ms_configura.php em um editor para configurar as


variáveis que guardam os caminhos da aplicação conforme segue abaixo:

→ Variável $mensagemInicia: esta variável é responsável pela mensagem inicial do


I3Geo, você pode colocar uma mensagem personalizada alterando seu texto conforme
exemplo:
$mensagemInicia = “minha aplicação” ;

→ Variável $tituloInstituicao: esta variável é responsável pelo título que aparecerá na


barra de título dos navegadores.
$tituloInstituicao = "Meu Título";

Nota: Se for criar mais de uma aplicação usando o i3geo, comente a variável
$tituloInstituicao e coloque o título da aplicação na tag title do html.

O primeiro bloco de código diz respeito a instalação no windows e o segundo é


responsável pela configuração no Linux. É este ultimo bloco de código que iremos alterar
conforme indica os procedimentos abaixo:

→ Variável $editores: responsável por controlar quais usuários poderão utilizar o


aplicativo de administração do i3geo a partir dos IPs das máquinas destes. Desta forma
esta variável deve ser preenchida conforme exemplo abaixo:

$editores = array("10.0.0.2",”192.23.255.255”);
Obs: No exemplo acima somente as máquinas 10.0.0.2 e 192.23.255.255 terão
permissão para editar os temas do i3geo.

→ Variável $dir_tmp: responsável por guardar o caminho absoluto do diretório temporário


onde serão gravadas as imagens geradas pelo mapserver.
$dir_tmp = "/tmp/";

Obs.: recomenda-se utilizar o diretorio /tmp do Ubuntu, pois este é apagado regularmente
pelo próprio sistema operacional, poupando o trabalho do usuário em ter de esvaziar este
diretório de tempos em tempos, porém pode-se estabelecer qualquer diretório como
sendo o $dir_tmp.
Obs: certifique-se que este diretório esteja visível pelo Apache2 e que este tenha
permissão de escrita no diretório.
Obs: recomenda-se a criação de um link simbólico na pasta /var/www/ direcionado para
diretório temporário. Para criar um link simbólico digite o seguinte comando no terminal do
Ubuntu:
/var/www:~$ sudo ln - s /tmp/ mp ms_tmp

Nota: com o comando acima criaremos um link simbólico chamado ms_tmp que remete-
se ao diretório /tmp do Ubuntu.

→ Variável $temasdir: responsável por guardar o caminho absoluto da pasta onde ficam
os arquivos mapfiles das camadas que serão visualizadas no i3geo.

$temasdir = "/var/www/i3geo/temas";

Variável $temasaplic: responsável por guardar o caminho absoluto da pasta onde ficam
os arquivos html das interfaces do i3geo e onde estão os mapfiles de inicialização do
aplicatovo.

$temasaplic = "/var/www/i3geo/aplicmap";

→ Variável $locmapserv: indica ao apache o caminho relativo do mapserver cgi.


$locmapserv = "/cgi-bin/mapserv";
Obs: o mapserver cgi no Ubuntu fica no diretório /usr/lib/cgi-bin/mapserv, crie um link
simbólico apontando para este diretório, conforme exemplo abaixo:

/var/www/:~$ sudo ln -s /usr/lib/cgi-bin/mapserv cgi-bin

Variável $locaplic: esta variável é responsável por guardar o caminho absoluto da pasta
raiz do i3geo.
$locaplic = "/var/www/i3geo";

Variável $R_path: esta variável indica o path do pacote estatístico R, para que o i3geo
possa acioná-lo a partir de suas ferramentas de gráficos e análise espacial

$R_path = "R";
Obs: se você não instalou o R, deixe essa variável vazia.
A partir da versão 4.1 do i3geo os temas (variável $menutemas), os sistemas
(variável $locsistemas), os sistemas que aparecem na ferramenta identifica (variável
$locidentifica), os mapas da guia Links ($locmapas) e os atlas (variável $mapasxml)
deixaram de ser configuradas por um arquivo xml e passaram a integrar o banco de
dados sqlite do sistema de administração, desta forma estas variáveis devem ficar vazias,
conforme demonstrado abaixo:

$locsistemas= "";
$locidentifica = "";
$locmapas = "";
$menutemas = "";
$atlasxml = "";

→ Variáveis $postgis_con e $srid_area: foram depreciadas e não são mais necessárias


a partir da versão 5.x do MapServer.

→ Variável $utilizacgi: recebe os valores “sim” ou “não”, em caso afirmativo o i3geo


utilizará o cgi do mapserver para gerar os mapas tornando a aplicação mais rápida, em
caso negativo as imagens serão geradas pelo php.
→ Variável $postgis_mapa: tem a função de esconder a string de conexão com o banco
de dados no mapfile. Ao optar por esta funcionalidade do i3geo especifique a sua conexão
com o banco na variável, conforme exemplo abaixo. Se você não for usar esta opção
deixe a variável em branco.

$postgis_mapa = array("exemplo"=>"user=postgres password=postgres


dbname=pgutf8 host=localhost port=5432 options='-c client_encoding=LATIN1'");

Obs.: Optando por esta funcionalidade o mapa será forçado a recusar o modo de
operação CGI.

→ Variável $expoeMapfile: recebe os valores “sim” e “não”, e controla se o nome do


mapfile atual será ou não retornado para a aplicação via ajax. Quando essa variável for
definida como "nao" algumas das funcionalidades do i3geo poderão ficar prejudicadas,
mas sem comprometimento das funções principais.
$expoeMapfile = "sim";

→ Variável $conexaoadmin: define a string de conexão com o banco de dados


administrativo, originalmente montado no banco de dados sqlite. Para usar o banco
default do i3geo deixe esta variável em branco, caso queira utilizar a ferramenta de
administração em outro banco de dados determine a string de conexão com o outro banco
nesta variável.

→ Variável $interfacePadrao: define o arquivo htm, html ou phtml que será usado pelo
i3geo para visualização dos mapas. Este aquivo deve estar armazenado na pasta
i3geo/aplicmapa.

$interfacePadrao = "geral.htm";

2.2. CONFIGURANDO O ARQUIVO GERAL1.MAP

Abra o arquivo /i3geo/aplicmap/geral1.map em um editor e configure os caminhos


no mapfile conforme demonstrado abaixo:
→ Tag FONTSET: fornece para o mapserver o caminho para o diretório onde esta o
arquivo de fontes que será utilizado pelo i3geo.

FONTSET "/var/www/i3geo/symbols/fontes.txt"

→ Tag SYMBOLSET: fornece para o mapserver o caminho para o diretório onde esta o
arquivo de simbolos que será utilizado pelo i3geo.

SYMBOLSET "/var/www/i3geo/symbols/simbolos.sym"

→ Tag SHAPEPATH: fornece para o mapserver o caminho para o diretório onde ficarão
armazenados os arquivo cartográfico (shapefiles) que serão utilizado pelo i3geo.

SHAPEPATH "/var/www/geodados"

→ Tag IMAGE: fornece para o mapserver o caminho para o diretório onde esta a figura
usada como mapa de referência.

IMAGE "/var/www/i3geo/imagens/referencia1.png"

→ Tag IMAGEPATH: fornece para o mapserver o caminho para o diretório onde serão
armazenados as imagens geradas pelo i3geo.

IMAGEPATH "/tmp/"

→ Tag IMAGEURL: fornece para o mapserver o caminho relativo para o diretório


temporário. Recomenda-se que a IMAGEURL seja um link simbólico para a IMAGEPATH.

IMAGEURL "/ms_tmp/"

→ Tag TEMPLATE: fornece para o mapserver o caminho para o diretório onde esta o
arquivo da interface do i3geo (template).

TEMPLATE "/var/www/i3geo/aplicmap/geral.htm"

Configure a Tag DATA de todas as LAYERS do arquivo geral1.map e também do


arquivo estadosl.map que se encontra na mesma pasta, conforme o exemplo abaixo:

LAYER
DATA "/var/www/i3geo/aplicmap/dados/zee"

2.3. TESTE DE INSTALAÇÃO

Para ter certeza se a instalação esta correta vá para o navegador de internet e na


barra de endereços digite http://<host>/i3geo/testainstal.php.

Este programa fará a verificação se todos os pacotes necessários para o


funcionamento do i3geo foram instalados e se os caminhos definidos no
ms_configura.php estão corretos. Além destas verificação listadas acima o programa
testainstal.php verifica se o apache consegue escrever na pasta temporária e testa os
mapfiles geral1.map e estadosl.map.
Se ao final da listagem de verificação aparecer dois mapas do Brasil na
América do Sul, um sem os limites estaduais e outro com os limites sua instalação
esta correta e você pode começar a usar o i3geo. Caso estes mapas não apareçam
verifique as mensagens de erro e tente corrigi-las para utilizar o i3geo.

3. CRIAÇÃO DE BANCO DE DADOS ESPACIAL

Este tutorial tem por objetivo explicar a criação de bancos de dados espaciais
usando o Postgis que é a extensão espacial do PostgreSQL. Os passos que serão
descritos aqui foram feitos no Linux, na distribuição Ubuntu e utilizou o gerenciador de
banco de dados PgAdmin.
Considerando que o pgadmin, o postgresql e o postgis já estão instalados no
servidor (caso ainda não tenha instalado estes pacotes veja o tutorial de instalação do
i3geo e execute os procedimentos descritos no item 4) siga os procedimentos a seguir:

3.1. CONEXÃO COM O BANCO DE DADOS POSTGRESQL

Abra o software PgAdmin e clique com o mouse no botão “Adicionar conexão a um


servidor”, localizado no canto superior esquerdo. Na janela que irá abrir preencha os
campos conforme instrução abaixo:

a) Campo Nome: este campo irá denominar a sua conexão, o nome deve indicar o teor
da conexão, como por exemplo “trabalho” ou “pessoal” ou “desenvolvimento”, entre
outros.

b) Campo Máquina: neste campo você deve por o ip da máquina onde esta o banco
postgresql que será conectado. Caso o banco esteja na sua máquina digite neste campo
a palavra “localhost”, caso este banco esteja em outra máquina entre com o endereço IP
desta, como por exemplo 10.1.0.20.

c) Campo Porta: este campo especifica a porta de instalação dos postgresql, por padrão
a porta do postgresql é a 5432.
d) Campo Manutenção do BD: por default este campo vem preechido com a opção
postgres, mantenha esta opção.

e) Campo Nome de Usuário: como esta é sua primeira conexão você apenas poderá
colocar o usuário postgres, pois este é criado na instalação do banco. Nos próximos
tópicos criaremos novos usuários que poderão ser usados neste campo.

f) Campo Senha: senha do usuário postgres. Geralmente este usuário é criado com a
senha “postgres”.
Após estas configurações clique em concluir e a sua conexão estará definida.

Nota: Caso o conexão seja recusada pelo PgAdmin devido a senha do usuário postgres
não estar correta faça os procedimentos abaixo:
→ Abra o documento pg_hba.conf, digitando no terminal do Ubuntu o seguinte comando:

~$ sudo gedit /etc/postgresql/8.4/main/pg_hba.conf

→ No final deste arquivo encontre as linhas mostradas abaixo:

# IPv4 local connections:


host all all 127.0.0.1/32 md5

→ Altere a linha de conexão local da seguinte forma, onde estiver escrito md5 troque para
trust, conforme segue abaixo:

# IPv4 local connections:


host all all 127.0.0.1/32 trust

→ Salve e feche o arquivo pg_hba.conf, pare o serviço do postgresql e depois inicie-o


novamente, conforme segue:

~$ sudo /etc/init.d/postresql-8.4 stop.


~$ sudo /etc/init.d/postresql-8.4 start.

→ Volte ao PgAdmin e refaça a conexão de acordo com os procedimentos acima.


3.2. USUÁRIOS DO BANCO DE DADOS

Para criar novos usuários para o PostgreSQL basta seguir os procedimentos


descritos abaixo:
a) No PgAdmin entre na conexão que você criou e com o botão direito do mouse clique no
item Login Role e escolha a opção nova role de login.

b) Na janela que irá abrir, na guia Propriedades, coloque um nome para o novo usuário,e
escolha uma senha para este novo usuário.

c) Vá para a guia Role Privileges e atribua os privilégios para este novo usuário. Se este
for um superusuário selecione todas as opções disponíveis nesta guia.

d) Clique com o mouse no botão “ok” e seu novo usuário está criado.

3.3. BASE DE DADOS

Após a criação da conexão e do superusuário o próximo passo é a criação do


banco de dados. Para criar um novo banco de dados siga os procedimentos descritos
abaixo:

a) Entre na sua conexão, com o botão direito do mouse clique em banco de dados e
selecione a opção Novo Banco de Dados.
b) Na janela que irá abrir preencha os campos conforme segue:
1. Nome: crie um nome para o novo banco de dados.
2. Dono: escolha o usuário que será o dono do novo banco de dados. Este
usuário pode ser o usuário postgres ou um outro superusuário, como o que foi
criado no item anterior deste tutorial.
3. Modelo: deixe em branco.
4. Tablespace: selecione a opção pg_default.
c) Clique com o mouse no botão Ok e seu novo banco estará criado.

Para tornar esta base de dados em um banco espacial, que armazenará as


geometrias dos dados espaciais basta seguir os procedimentos a seguir:
a) Selecione o novo banco de dados que você criou e abra a ferramenta SQL Editor do
PgAdmin.

b) Crie a linguagem plpgsql no seu banco a partir do comando:


create language plpgsql
Digite este comando no SQL Editor e clique com o mouse no botão Executar
Consulta. Ou aperte a tecla F5 do teclado.

c) Clique com o mouse no ícone abrir arquivo. Na janela que irá se abrir você deve
procurar o arquivo postgis.sql, este arquivo, no Ubuntu 9.10 ou 10.04, encontra-se na
pasta /usr/share/postgresql/8.4/contrib/postgis.sql.

d) Após localizar o arquivo clique com o mouse no botão Abrir e depois no botão executar
consulta.

e) Repita o procedimento acima para abrir o arquivo /usr/share/postgresql/8.4/contrib/


spatial_ref_sys.sql e clique com o mouse no botão executar consulta do SQL Editor.

f) Feche o SQL Editor e abra o seu banco no PgAdmin. Entre no schema Public e
verifique se foram criadas as tabelas geometry_columns e spatial_ref_sys. Verifique
também o número de funções criadas, este número deve estar em torno de 686 funções.
Se as tabelas e as funções tiverem sido criadas o seu banco espacial esta pronto
para receber os dados espaciais que serão usados pelo i3geo.

Nota: Você pode criar um novo schema para armazenar suas tabelas espaciais como por
exemplo um schema denominado “geodados” . Para criar schemas no postgresql basta
clicar com o botão direito do mouse no item Esquemas e selecionar a opção Novo
Esquema. Na janela que irá se abrir preencha os campos Nome, com o nome do novo
esquema e o campo Dono com o superusuário que será o dono deste esquema e clique
com o mouse no botão OK.
3.4. TABELAS COM DADOS ESPACIAIS

As tabelas que contém dados espaciais diferem das tabelas relacionais


simplesmente pela presença da coluna geométrica que é responsável pelo
armazenamento dos objetos cartográficos, pontos, linhas ou polígonos. Pode-se criar
estas tabelas a partir da importação de arquivos ESRI shapefiles ou pela inclusão dos
dados via comandos em lingagem SQL. Este tópico tem o objetivo de demonstrar a
criação destas tabelas.

3.4.1. IMPORTANDO ESRI SHAPEFILES NO BANCO POSTGRESQL

A inclusão de arquivos ESRI shapefiles no banco de dados postgresql/postgis no


Linux é feita a partir de um comando no terminal, usando o programa shp2pgsql do
postgis. Para realizar a inclusão destes arquivos siga os procedimentos abaixo:

Abra o terminal do Ubuntu e digite o seguinte comando:

shp2pgsql [<opções>] <shapefile>[schema.]<tabela> > nome.sql

Sendo as opções mais utilizadas as seguintes:


-c → cria uma nova tabela e popula esta tabela.
-a → caso a tabela já exita coloque a opção -a em vez de -c assim o shapefile será
carregado na tabela existente.
-s <srid> → define o código srid (referencia espacial, sistema de coordenadas e datum)
do shapefile que será importado para o banco postgresql/postgis.
-I → cria um index do tipo GIST na nova tabela. Se você estiver carregando um shapefile
em uma tabela existente esta opção não é necessária.
- W <encoding> → você pode especificar o encoding dos caracteres do shapefile a partir
desta opção.
-g → esta opção tem a função de especificar o nome da coluna geométrica, por default o
nome da coluna geométrica no postgis é the_geom, se você deseja manter este nome
não use esta opção.

Após definir as opções você deve colocar o nome do arquivo shapefile, lembre-se
de colocar o caminho completo do arquivo caso você esteja em uma pasta diferente da
localização do arquivo shapefile.
Seguindo coloque o nome do schema do banco onde a tabela esta ou onde ela
será criada e por fim acrescente o sinal de > e defina um nome com extensão .sql para
este shapefile. O exemplo a seguir demonstra estes procedimentos.

~$ shp2pgsql -c -I -s 4291 -W LATIN1 uf.shp geodados.tb_uf > uf.sql

No exemplo acima estamos criando um arquivo .sql com instruções para criar uma
nova tabela (-c), criar um index GIST (-I), definindo o código srid (-s) como 4291 (latitude
e longitude com datum SAD69) e definindo o encoding dos caracteres do shapefile como
sendo LATIN1. Após as opções colocamos o caminho correto para o arquivo shapefile
uf.shp e por fim dizemos que este arquivo será importado para o schema geodados na
tabela tb_uf e então geramos o arquivo uf.sql

Para carregar este arquivo .sql no banco de dados postgresql/postgis digitamos no


terminal o seguinte comando:

psql -h <host> -p <porta> -d (banco de dados) -U <usuário> -f <arquivo.sql>

Onde:
-h → nome do host, se a conexão for local use localhost ou então digite o IP da máquina
onde esta o banco.
-p → porta do postgresql, por default o postgresql usa a porta 5432.
-d → nome do banco de dados com postgis que receberá os dados espaciais.
-U → nome do superusuário dono do banco de dados.
-f → nome do arquivo .sql que será carregado no banco.

Desta forma veja o exemplo abaixo:

psql -h localhost -p 5432 -d exemplo -U postgres -f uf.sql

No exemplo acima estamos carregando o arquivo uf.sql no banco de dados


exemplo que esta na máquina local (localhost) na porta 5432.
Nota 01: pode-se importar arquivos shapefiles para o postgresql/postgis a partir de
softwares de geoprocessamento como o gvSIG e o Quantum Gis, pois estes programas
fazem a importação direto para o postgresql.

Nota 02: pode-se fazer o processo inverso, exportar uma tabela postgresql para shapefile
a partir do comando pgsql2shp da seguinte forma:

pgsql2shp -h <host> -p <porta> -u <usuario> -f <nome.shp> -P <senha do usuario>


[nome do banco]<schema.tabela>

O exemplo a seguir demonstra este comando:

pgsql2shp -h localhost -p 5432 -u postgres -f uf.shp -P postgres exemplo


geodados.tb_uf

No exemplo acima estamos exportando a tabela estados do schema geodados que


esta no banco de dados exemplo que esta na máquina local (localhost) e na porta 5432,
gerando o arquivo estados.shp.

3.4.2. CRIANDO TABELAS A PARTIR DA LINGUAGEM SQL.

Pode-se criar tabelas espaciais a partir do PgAdmin e popula-las por comandos na


linguagem SQL, tanto no SQL Editor como em aplicação de carga de dados que podem
ser desenvolvidas em PHP por exemplo. Para criar estas tabelas siga os procedimentos
abaixo:

a) Abra o PgAdmin, entre na sua conexão e depois abra seu banco. Abra o SQL Editor e
digite o seguinte comando para criar a tabela:

create table geodados.tb_ponto_exemplo (gid serial primary key,no_ponto varchar)

b) O próximo procedimento é registrar esta nova tabela espacial na tabela


geometry_columns do esquema public, para isto digite o comando abaixo:
select
AddGeometryColumn('geodados','tb_ponto_exemplo','the_geom',4291,'POINT',2)
c) Sua nova tabela de ponto está criada e registrada na tabela geometry_columns no
esquema geodados sob o nome tb_ponto_exemplo, com a coluna geometrica
denominada de the_geom, o srid foi definido como 4291 (latitude e longitude com datum
SAD69) e armazena pontos em duas dimensões.

d) Para criar tabelas de linhas ou polígonos repita os procedimentos acima e substitua o


'POINT' por 'LINESTRING' ou 'POLYGON'. Você pode trabalhar com geometrias múltiplas
para isto basta especificá-las na criação da tabela como 'MULTIPOINT',
'MULTILINESTRING' ou 'MULTIPOLYGON'.

Para inserir dados na tabela criada use o seguinte comando SQL:

insert into geodados.tb_ponto_exemplo (no_ponto,the_geom) values


('ponto1',GEOMETRYFROMTEXT('POINT(-33.45 -45.33)', 4291))

Nota 01: para inserir linhas você deve utilizar no lugar de 'POINT' a expressão
LINESTRING ou MULTILINESTRING e os pares de coordenadas devem ser separados
por vírgula.

GEOMETRYFROMTEXT('LINESTRING(-33.45 -45.33, -33.55 -45.38)', 4291)).

Nota 02: para inserir polígonos você deve utilizar no lugar de 'POINT' a expressão
POLYGON ou MULTIPOLYGON, os pares de coordenadas devem ser separados por
vírgula e o ultimo ponto deve ser igual ao primeiro.

GEOMETRYFROMTEXT('POLYGON(-77.45 -45.33, -54.43 -33.12, 0 0, -77.45 -45.33)',


4291)).
4. MAPFILES

Os mapfiles são arquivos textos que contém um conjunto de TAGs que são
interpretadas pelo MapServer para que este possa desenhar os mapas. Como o i3geo é
baseado no MapServer os mapfiles (arquivos .map) são a sua base.
O i3geo possui um mapfile principal, denominado geral1.map, este mapfile possui
todas as TAGs obrigatórias para a interpretação do MapServer e nele estão as LAYERs
(camadas de dados espaciais) default do aplicativo. As demais camadas representadas
pelo i3geo constituem um conjunto de mapfiles simplificados que podem conter uma ou
mais LAYERs de um determinado tema (como por exemplo hidrgrafia, rodovias,
vegetação, entre outras) que quando são selecionadas no i3geo são copiadas para o
mapfile principal e representadas no i3geo por intermédio do MapServer.
Neste tutorial explicaremos as diversas TAGs dos mapfiles bem como
exemplificaremos seu uso e como construir os mapfiles simplificados.

4.1. TAGS PRINCIPAIS

Neste item descreveremos todas as TAGs essenciais dos mapfiles simplificados,


estas TAGs são as seguintes:

MAP → todo mapfile a partir da versão 5.x do MapServer devem ser iniciadas por esta
tag. A tag MAP exige um fechamento com uma tag denominada END.

SYMBOLSET → esta tag define a localização do arquivo de símbolos que é utilizado pelo
i3geo.
SYMBOLSET “/var/www/i3geo/symbols/simbolos.sym”.

FONTSET → esta tag define a localização do arquivo de fontes que é utilizado pelo
i3geo.
FONTSET “/var/www/i3geo/symbols/fontes.txt”.

LAYER → esta tag define a layer (camada de dados espaciais) que será representada
pelo MapServer. A tag LAYER exige um fechamento com uma tag denominada END.
NAME → define o nome da layer. Recomenda-se denominar a layer com o mesmo nome
do mapfile, pois o i3geo recorre a este nome em diversas funções. Outra recomendação é
para não utilizar espaço, caracteres especiais e acentos no nome.

NAME estados

TYPE → esta tag define o tipo de dado que será representado. Os principais tipos são:
POINT, LINE, POLYGON e RASTER.

TYPE POLYGON

STATUS → define o status da layer. Recebe os valores ON OFF e DEFAULT. No mapfiles


principal todas as layer, com exceção da layer cartobase, recebem o status DEFAULT pois
aparecem ativas no i3geo sempre que este é iniciado. Nos mapfiles simplificados esta tag
receberá os valores ON ou OFF, pois ela sempre aparecerá desativada na inicialização do
i3geo, tendo seu status modificado para DEFAULT pelo usuário quando este ativa a layer.

TYPE OFF

TEMPLATE → esta tag é obrigatória para o MapServer porém o arquivo templete indicado
não precisa existir devido a programação do i3geo.

TEMPLATE “none.htm”.

DATA → esta tag indica o caminho do arquivo cartográfico, geralmente shapefile ou o


select para o banco de dados.

DATA “/var/www/geodados/estados.shp”.

Nota: esta tag não é necessária para layers do tipo webservices no padrão OGC, WMS
ou WFS.

METADATA → esta tag recebe um conjunto de outras tags que controlam algumas
propriedades do mapfile. Dentro desta tag o desenvolvedor pode criar tags novas para
serem usadas na sua aplicação. O i3geo possui um conjunto destas tags para o controle
da aplicação. A tag METADATA exige um fechamento com uma tag denominada END.
Nota: não confunda a tag METADATA do mapfile com os metadados dos dados espaciais,
os metadados são registrados em outras aplicações como o GeoNetWork e não no
mapfile.

ITENS → esta tag recebe o(s) nome(s) do(s) campo(s) de atributos do mapa que serão
visualizados no i3geo pela ferramenta identifica.

ITENS “ESTADO,SIGLA”

Neste exemplo quando o usuário clicar no mapa com a ferramenta identifica do i3geo ele
terá acesso aos valores dos campos ESTADO e SIGLA.
Nota: o nome dos campos devem ser separados por virgula e estar entre aspas.

ITENSDESC → descrição dos campos listados na tag ITENS. Esta tag serve de alias para
o nome dos campos.

ITENSDESC “UF,Sigla da UF”


Nota: o nome dos campos devem ser separados por virgula, entre aspas e deve-se
manter a correspondência com a tag ITENS.

TEMA → define o nome da layer que aparecerá no i3geo.

TEMA “Limite Estadual”


Nota: Se você deseja que o nome desta layer fique invisível para os usuários defina esta
tag com o valor “NAO”.

CLASSE → define se a classe (representação da simbologia da legenda) da layer será


mostrada ou não pelo i3geo, em caso positivo acrescente o valor “SIM” nesta tag, em
caso negativo atribua o valor “NAO” a esta tag.

CLASSE “SIM”
CLASS → esta tag define como o mapa será representado no i3geo, definindo também a
legenda deste. Esta tag recebe um conjunto de outras tags que irão definir a simbologia
dos dados que serão representados. A tag CLASS exige um fechamento com uma tag
denominada END.

NAME → recebe o nome da classe em questão, caso a classe não receba nenhum nome
específico deixe esta tag vazia. Ex. NAME “de 1 a 10 casas”.

STYLE → define os atributos da simbologia, recebe um conjunto de outras tags que


fazem o controle deste estilo. A tag STYLE exige um fechamento com uma tag
denominada END.
Nota: pode-se conjugar vários estilos para uma mesma classe, como por exemplo um
ponto maior em vermelho e um menor em preto para representar as capitais dos estados.

COLOR → define a cor do elemento da classe. O valor da cor deve ser escrito em RGB e
separado por espaço. Ex. COLOR 255 0 0 (elemento receberá a cor vermelho).
Nota: se você não quiser uma cor de fundo no seu elemento cartográfico defina a tag
COLOR como -1 -1 -1. Esta opção é utilizada com representações de polígonos.

OUTLINECOLOR → esta tag só é usada com representações poligonais, pois define a


cor de contorno do elemento cartográfico. Ex. OUTLINECOLOR 0 255 0 (o elemento
receberá uma cor de contorno verde).
Nota: assim como na tag COLOR se você não quiser uma cor de contorno defina esta tag
com o valor -1 -1 -1.

SYMBOL → define o tipo de simbolo que será utilizado. O nome do simbolo atribuído a
esta tag deve estar definido no arquivo de símbolos usado pelo i3geo. Ex. SYMBOL
“linha”.
Nota: Nas representações poligonais esta tag não é obrigatória, sendo utilizada apenas
se o polígono for preenchido com um desenho ou for hachurado.

SIZE → tag utilizada apenas para representações pontuais, para definir o tamanho do
ponto, ou em representações lineares, para definir a espessura da linha. Ex. SIZE 12

Desta forma um mapfile simplificado para representar camadas geográficas no


i3geo assume a seguinte forma:

MAP
SYMBOLSET /var/ww/symbols/simbolos.sym
FONTSET "/var/ww/symbols/fontes.txt"
LAYER
NAME estados
TYPE LINE
STATUS OFF
DATA "/var/www/geodados/estados.shp"
TEMPLATE "none.htm"
METADATA
ITENS "ESTADO"
ITENSDESC "Estado"
TEMA "Limite Estadual"
CLASSE "SIM"
END
CLASS
NAME " "
STYLE
SYMBOL linha
SIZE 2
COLOR 255 255 0
END
END
END
END

4.2. TAGS OPICIONAIS

Além das tags descritas no item anterior pode-se acrescentar outras para refinar a
representação da LAYER. Estas tags são as seguintes:

TRANSPARENCY → define a transparência do elemento cartográfico. Esta tag recebe os


valores de 0 a 100, onde 0 é transparente e 100 é opaco. Ex. TRANSPARENCY 75.

MAXSCALEDENOM → define o denominador da escala máxima em que a LAYER irá


aparecer no mapa. Ex MAXSCALEDENOM 500000, neste exemplo a LAYER aparecerá
enquanto o mapa estiver em uma escala maior ou igual a 1:500.000

MINSCALEDENOM → define o denominador da escala minima em que a LAYER irá


aparecer no mapa. Ex. MINSCALEDENOM 1000000, neste exemplo a LAYER aparecerá
enquanto o mapa estiver em uma escala menor ou igual a 1:1.000.000.

Nota: A tag MINSCALEDENOM deve ser usada em conjunto com a tag


MAXSCALEDENOM, definindo assim um intervalo de escala em que a camada fica visível
no mapa. Ex. MAXSCALEDENOM 1000000 e MINSCALEDENOM 250000, neste exemplo
a camada ficará visível enquanto o mapa estiver no intervalo entre as escalas de
1:250000 (MINSCALE) e 1:1.000.000 (MAXSCALE).

PROJECTION → esta tag define o sistema de coordenada da LAYER, deve ser usada
quando a LAYER em questão estiver em um sistema diferente do sistema do i3geo, para
que o MapServer possa fazer a conversão das coordenadas. A tag PROJECTION exige
um fechamento com uma tag denominada END.

PROJECTION
"init=epsg:2029"
END.

Nota: O i3geo utiliza o srid 4291 que refere-se a latitude e longitude com o datum SAD69,
se o seu dado estiver em um sistema diferente utilize esta tag.

No bloco METADATA pode-se acrescentar as seguintes tags:

TIP → define os campos que terão seus valores representados pela ferramenta identifica
balão do i3geo. Assim como na tag ITENS os nomes dos campos devem ser separados
por virgula e ficar entre aspas. Ex. TIP “ESTADO,SIGLA”.

ITEMIMG → indica o nome campo onde estão os nomes dos arquivos de imagens que
serão mostrados na ferramenta identifica e identifica balão. Ex. ITEMIMG “ESTADO”.
IMGLOC → indica o diretório onde estão armazenadas as imagens. Ex. IMGLOC
"imagens/bandeiras".

ITENSLINK → indica a url do link que será atribuído a esta LAYER. Para esta tag
funcionar deve-se acrescentar um campo na tag ITENS (copie o nome de um campo
existente) e na tag ITENSDESC deve-se dar um nome para o link e na tag ITENSLINK
deve-se manter a correspondência com a tag ITENS mantendo o número de virgulas até
chegar no campo do link, ou seja, se na tag ITENS temos dois campos e o terceiro
corresponde ao link na tag ITENSLINK mantemos duas virgulas e a url do link. Ex.
ITENSLINK “,,http://mapas.mma.gov.br”.

ESCALA → esta tag guarda o valor do denominador da escala da LAYER e serve para
avisar se o zoom do i3geo corresponde a escala do mapa. Ex. 250000, neste exemplo
indicamos ao i3geo que a escala de mapeamento da LAYER é de 1:250000.

EXTENSAO → esta tag indica o boundary box da LAYER e tem o objetivo de passar este
valor para a função zoom para o tema que mostra um zoom no i3geo de acordo com o
tamanho da LAYER. Ex. EXTENSAO -76.5125927 -39.3925675209 -29.5851853
9.49014852081, desta forma toda vez que o usuário clicar na função zoom para o tema o
i3geo colocará o zoom de modo a contemplar o boundary box especificado.

Nota: esta tag foi criada para corrigir um “bug” do MapServer com o PostGis, sendo
necessária apenas nas camadas que fazem conexão com o PostGis.

No bloco CLASS pode-se acrescentar a seguinte tag:

EXPRESSION → esta tag tem como função criar classe a partir de expressões regulares
com a utilização dos operadores “=, >, <, >=, <=” entre outros. Com as expression pode-
se concatenar as condições com e (and) e ou (OR). Ex. EXPRESSION ('[SIGLA]' = 'DF'),
neste caso esta classe mostrará apenas os estados que possuem a sigla DF.
Desta forma um mapfile simplificado com as tags opicionais assume a seguinte
forma:
MAP
SYMBOLSET ../symbols/simbolos.sym
FONTSET "../symbols/fontes.txt"
LAYER
NAME estados
TYPE POLYGON
STATUS OFF
DATA "/var/www/geodados/estados.shp"
PROJECTION
"init=epsg:2029"
END
TEMPLATE "estados.htm"
TRANSPARENCY 75
MINSCALEDENOM 250000
MAXSCALEDENOM 1000000
METADATA
ITENS "ESTADO,SIGLA,ESTADO"
TIP "ESTADO"
ITENSDESC "Estado,Sigla,link"
ITEMIMG "ESTADO"
IMGLOC "imagens/bandeiras"
ITENSLINK “,,http://mapas.mma.gov.br”
TEMA "Limite Estadual"
ESCALA "250000"
EXTENSAO -76.5125927 -39.3925675209 -29.5851853 9.49014852081
CLASSE "SIM"
END
CLASS
NAME " "
EXPRESSION ('[SIGLA]' = 'DF')
STYLE
COLOR 255 255 0
OUTLINECOLOR -1 -1 -1
END
END
END
END

4.3. TAGS PARA INCLUSÃO DE LABELS NAS LAYERS

Para que os elementos cartográficos de uma LAYER apareçam com labels (valor
de um determinado atributo) quando forem desenhados pelo i3geo basta acrescentar as
seguintes tags no mapfile em questão:

LABELITENS → esta tag é responsável pela definição do campo que terá seu valor
mostrado no mapa. Ex. LABELITENS “ESTADO”.

Os labels também podem ser visualizados conforme a escala, utilizando as tags


LABELMAXSCALEDENOM e LABELMINSCALEDENOM, o funcionamento destas tags é
igual ao descrito no tópico anterior das tags MAXSCALEDENOM e MINSCALEDENOM.
No bloco CLASS deve-se acrescentar um novo bloco denominado LABEL,
fechando com a tag END e contendo as seguintes tags de controle:

SIZE → define o tamanho da fonte.


TYPE → define o tipo de fonte, pode ser bitmap ou truetype.

FONT → define a fonte que será usada. Esta fonte deve estar definida no arquivo de fonte
usado pelo i3geo.

COLOR → define a cor da fonte em RGB.

FORCE → define se pode haver colisão entre as labels, recebe os valores true e false, se
escolher true o MapServer permitirá a colisão entre as label se escolher false não haverá
colisão entre as fontes.

POSITION → posição da label em relação ao elemento cartográfico, pode ser superior


esquerdo (UL), superior central (UC), superior direito (UR), inferior esquerdo (LL), inferior
central (LC), inferior direito (LR), centro esquerdo (CL), centro (CC), centro direito (CR) e
AUTO.

Desta forma um mapfile com labels assume a seguinte forma:


MAP
SYMBOLSET ../symbols/simbolos.sym
FONTSET "../symbols/fontes.txt"
LAYER
NAME estados
TYPE POLYGON
STATUS OFF
DATA "/var/www/geodados/estados.shp"
PROJECTION
"init=epsg:2029"
END
TEMPLATE "estados.htm"
TRANSPARENCY 75
MINSCALEDENOM 250000
MAXSCALEDENOM 1000000
LABELITENS “ESTADO”
LABELMAXSCALEDENOM 750000
LABELMINSCALEDENOM 300000
METADATA
ITENS "ESTADO,SIGLA,ESTADO"
TIP "ESTADO"
ITENSDESC "Estado,Sigla,link"
ITEMIMG "ESTADO"
IMGLOC "imagens/bandeiras"
ITENSLINK “,,http://mapas.mma.gov.br”
TEMA "Limite Estadual"
ESCALA "250000"
EXTENSAO -76.5125927 -39.3925675209 -29.5851853
9.49014852081
CLASSE "SIM"
END
CLASS
NAME " "
STYLE
COLOR 255 255 0
OUTLINECOLOR -1 -1 -1
END
LABEL
FONT arial
TYPE truetype
SIZE 12
COLOR 0 0 0
FORCE FALSE
POSITION UC
END
END
END
END

4.4. TAGS PARA CONEXÃO COM BANCO DE DADOS POSTGRESQL

Para representar dados que estão no PostgreSQL deve-se acrescentar as


seguintes tags ao mapfile:

CONNECTIONTYPE → esta tag define o tipo de conexão que será estabelecida pelo
MapServer.
CONNECTIONTYPE POSTGIS

CONNECTION → nesta tag deve-se especificar os parâmetros de conexão com o banco


de dados postgresql.

CONNECTION “user=usr password=pwd host=host port=5432 dbname=banco”.

Além destas tags deve-se modificar a tag DATA colocando em vez do caminho de
um arquivo, o select que será executado no banco. O padrão para o MapServer realizar o
select no postgresql é o seguinte:

DATA “the_geom FROM (SELECT * FROM geodados.tb_estados) as foo USING


UNIQUE gid USING SRID=4291”.

Onde:
the_geom é o nome da coluna geométrica;
() contém o select que será feito no banco;
gid é a coluna que contém os identificadores únicos dos elementos da tabela;
srid é o código do sistema de projeção do dado espacial.
Desta forma um mapfile com conexão ao banco PostgreSQL assume a seguinte
forma:
MAP
SYMBOLSET ../symbols/simbolos.sym
FONTSET "../symbols/fontes.txt"
LAYER
NAME estados
TYPE POLYGON
STATUS OFF
CONNECTIONTYPE POSTGIS
CONNECTION “user=usr password=pwd host=host port=5432 dbname=banco”
DATA the_geom FROM (SELECT * FROM geodados.tb_estados) as foo
USING UNIQUE gid USING SRID=4291
TEMPLATE "estados.htm"
TRANSPARENCY 75
MINSCALEDENOM 250000
MAXSCALEDENOM 1000000
METADATA
ITENS "ESTADO,SIGLA,ESTADO"
TIP "ESTADO"
ITENSDESC "Estado,Sigla,link"
ITEMIMG "ESTADO"
IMGLOC "imagens/bandeiras"
ITENSLINK “,,http://mapas.mma.gov.br”
TEMA "Limite Estadual"
ESCALA "250000"
EXTENSAO -76.5125927 -39.3925675209 -29.5851853 9.49014852081
CLASSE "SIM"
END
CLASS
NAME " "
STYLE
COLOR 255 255 0
OUTLINECOLOR -1 -1 -1
END
END
END
END

4.5. TAGS PARA CONEXÃO COM WEBSERVICES WMS

Para conectar com webservices nos padrões da OGC/WMS deve-se acrescentar


as seguintes tags no mapfile:

CONNECTIONTYPE → especifica o tipo de conexão que será realizada, neste caso WMS

CONNECTION → nesta tag deve-se colocar a url do webservice.

OFFSITE → usado em dados do tipo raster, define uma máscara de transparência para
determinados pixels. Ex. OFFSITE 255 255 255, neste caso os pixels com o valor 255 255
255 tornam-se transparentes.

No bloco METADATA deve-se acrescentar as seguintes tags específicas do WMS,


as informações para o preenchimento destas tags estão nos serviços e devem ser
recuperadas pela requisição getCapabilities:

"wms_srs" → define o srid que será usado dentre os disponíveis no serviço.


"wms_name" → nome do webservices.

"wms_format" → formato da imagem que será utilizado.

"wms_formatlist" → lista de formatos disponíveis no serviço.

"wms_connectiontimeout" → define o tempo máximo para conectar com o serviço.

"wms_server_version" → define a versão do serviço.

"wms_style" → define o estilo do layer.

Desta forma um mapfile para conexão com um webservices do tipo WMS assume a
seguinte forma:

MAP
SYMBOLSET ../symbols/simbolos.sym
FONTSET "../symbols/fontes.txt"
LAYER
CONNECTION "http://mapas.mma.gov.br/cgi-bin/mapserv?
map=/opt/www/html/webservices/baseraster.map"
CONNECTIONTYPE WMS
NAME "cartobase"
OFFSITE 255 255 255
PROJECTION
"init=epsg:4291"
END
STATUS OFF
TYPE RASTER
METADATA
"wms_srs" "EPSG:4291"
"wms_name" "baseraster"
"wms_format" "image/png"
"wms_formatlist" "image/gif,image/png,image/png;
mode=24bit,image/jpeg,image/wbmp,image/tiff"
"wms_connectiontimeout" "30"
"wms_server_version" "1.1.1"
"wms_style" "default"
"CLASSE" "SIM"
"TEXTO" "NAO"
"TEMA" "Base cartografica RASTER consolidada pelo CIGEX"
END
CLASS
NAME " "
STYLE
COLOR 200 50 0
OUTLINECOLOR 0 0 0
SYMBOL 0
END
END
END
END

4.6. TAGS PARA REPRESENTAÇÃO DE ARQUIVOS RASTER

O mapfiles que representam grades matriciais são semelhantes aos mapfiles que
representam arquivos shapefiles, diferem apenas no tipo e na forma de classificação,
desta forma o mapfile tem a seguinte configuração:

MAP
SYMBOLSET ../symbols/simbolos.sym
FONTSET "../symbols/fontes.txt"
LAYER
NAME imagem
TYPE RASTER
STATUS OFF
DATA "/var/www/geodados/fotoaera.tif"
MINSCALEDENOM 250000
MAXSCALEDENOM 1000000
METADATA
TEMA "Fotografias Aéreas"
ESCALA "250000"
CLASSE "SIM"
END
CLASS
NAME " "
STYLE
COLOR 255 255 0
OUTLINECOLOR -1 -1 -1
END
END
END
END

5. DESENVOLVENDO UMA APLICAÇÃO BASEADA NO I3GEO

Este item tem como objetivo iniciar o usuário no desenvolvimento de aplicações


georreferenciadas utilizando como base o software público i3geo. Será demonstrado aqui
um método de desenvolvimento de aplicações que não altera o código principal do i3geo,
permitindo assim o desenvolvimento de uma série de aplicativos utilizando o mesmo
código do i3geo.

Este método é possível devido a parametrização do i3geo, que recebe parâmetros


de inicialização tanto pela url, como por funções javascript na interface principal do novo
aplicativo. Segue abaixo os procedimentos para o desenvolvimento da aplicação:

1º → Crie uma pasta denominada 'curso' dentro do DocumentRoot do Apache, depois


cries dentro desta as seguintes subpastas:

→ cursojs: nesta pasta ficarão os arquivos javascript que serão desenvolvidos.

→ cursophp: nesta pasta ficarão os arquivos php que serão desenvolvidos.

→ cursomap: nesta pasta colocaremos os mapfiles desenvolvidos.

→ cursoimg: nesta pasta colocaremos as imagens que usaremos na aplicação.

2º → Copie o arquivo index.html da pasta i3geo e coloque-o dentro da pasta curso. Após
este processo edite-o confome instruções abaixo:

→ Mensagem origial

<p> Mapa interativo i3Geo</p>


<p>Elaborado com Mapserver e PHP-Mapscript</p>
<p> O i3Geo é software livre!</p>
<p> Áreas: meio-ambiente, geoprocessamento, SIG</p>
→ Mensagem Personalizada

<p> Curso de Desenvolvimento de Aplicações baseadas no i3Geo</p>


<p>Elaborado com Mapserver e PHP-Mapscript</p>
<p> O i3Geo é software livre!</p>
<p> Áreas: meio-ambiente, geoprocessamento, SIG</p>

→ Modificação do função window.location (redirecionador).

<script>
window.location="http://localhost/i3geo/ms_criamapa.php?interface=../curso/curso.html";
</script>

Nota 01: O redirecionador de página, pode passar um conjunto de parâmetros de inicialização que o i3geo
recebe pela url.
Nota 02: Os principais parâmetros são: Interface → recebe o caminho relativo do arquivo html que será a
interface principal da aplicação; mapext → recebe as coordenadas Xmin,Ymin e Xmax, Ymax definindo a
área geográficas que será mostrada na inicialização da aplicação; temasa → define quais as camadas
serão adicionadas na guia mapas na inicialização da aplicação; layers → define quais as camadas
adicionadas estarão ativas na inicialização da aplicação; perfil → define quais camadas e menus de
camadas o usuário terá acesso ao utilizar a aplicação.
Nota 03: pode-se especificar o mapfile principal, definindo o parâmetro mapfile, além de poder criar outros
parâmetros.

3º → Copie o arquivo geral.htm, que esta na pasta i3geo/aplicmap, para a pasta curso e
renomeie este arquivo para curso.htm.

4º → Crie um arquivo na pasta cursojs e salve este com o nome curso_inicio.js. Este
arquivo será responsável por carregar todos os outros arquivos javascripts e folhas de
estilo css necessários para o funcionamento da aplicação. Segue abaixo o código do
arquivo curso_inicio.js:

var scriptLocation = "";

var scripts = document.getElementsByTagName('script');


for (var i = 0; i < scripts.length; i++) {
var src = scripts[i].getAttribute('src');
if (src) {
var index = src.lastIndexOf("curso_inicio.js");
// is it found, at the end of the URL?
if ((index > -1) && (index + "curso_inicio.js".length == src.length)) {
scriptLocation = src.slice(0, -"curso_inicio.js".length);
break;
}
}
}
var allScriptTags = "";
var jsfiles = new Array(
""
);
for (i = 0; i < jsfiles.length; i++)
{
var currentScriptTag = "<script src='" + scriptLocation + jsfiles[i] + "'></script>";
allScriptTags += currentScriptTag;
}
//css
var allCssTags = "";
var cssfiles = new Array(
""
);
for (i = 0; i < cssfiles.length; i++)
{
var currentCssTag = "<link rel='stylesheet' type='text/css' href='" + scriptLocation + cssfiles[i] + "'/>";
allCssTags += currentCssTag;
}
document.write(allCssTags);
document.write(allScriptTags);

5º → Na variável jsfiles acrescente o caminho para o arquivo i3geo.js, conforme segue


abaixo.

var jsfiles = new Array(


"../../i3geo/classesjs/i3geo.js"
);

6º→ Abra o arquivo curso.htm e registre o arquivo curso_inicio.js, conforme segue abaixo:

<script type="text/javascript" src="cursojs/curso_inicio.js"></script>

7º→ No navegador digite o endereço http://localhost/curso, a aplicação deve ser iniciada


após este procedimento. Caso não inicie reveja os procedimentos acima.

8º → Abra o arquivo curso.htm e siga os procedimentos abaixo para acrescentar um


cabeçalho na aplicação:

→ Localize a tabela (<table>) que possui o id='mst', no inicio do arquivo curso.htm.


→ Crie uma nova linha nesta tabela, com duas colunas como mostra o exemplo abaixo:

<tr>
<td colspan="" style="background-color:#FFCC26;text-align:left">
<img src="cursoimg/logo_mma.jpg">
</td>
<td colspan="" style="background-color:#FFCC26;text-align:right;">
<!--img src="cursoimg/brasil1.gif"-->
</td>
</tr>
→ Crie outra linha, conforme exemplo abaixo:
<tr>
<td colspan="2" style="background-color:#145307; text-align:left; color:#FFFFFF; font-size:10px;
font-family: arial; font-weight:bold">
Curso de Desenvolvimento de Aplicativos Baseado no i3geo
</td>
</tr>
→ Rode o aplicativo no navegador.

9º → Localize no arquivo curso.htm o bloco de código abaixo:

<div class=verdeescuro style="top:0px;cursor:pointer;">


<div id=guia1 class=guia >Temas</div>
<div id=guia2 class=guia >Adiciona</div>
<div id=guia4 class=guia >Legenda</div>
<div id=guia5 class=guia >Links</div>
</div>

10º → Comente ou apague a <div> que possuí o id guia5, conforme segue:

<div class=verdeescuro style="top:0px;cursor:pointer;">


<div id=guia1 class=guia >Temas</div>
<div id=guia2 class=guia >Adiciona</div>
<div id=guia4 class=guia >Legenda</div>
<!-- div id=guia5 class=guia >Links</div -->
</div>

11º → Localize no arquivo curso.htm a <div> que possuí o id guia5obj e apague ou


comente esta <div> também, conforme exemplo abaixo:

<!-- div id='guia5obj' style='display:none;text-align:left'><div id='banners' style='overflow:auto;text-


align:left'>Aguarde...</div></div -->
12º → No bloco de códigos mostrado no procedimento 9 acrescente uma nova <div> com
id guia6, conforme segue abaixo:

<div class=verdeescuro style="top:0px;cursor:pointer;">


<div id=guia1 class=guia >Temas</div>
<div id=guia2 class=guia >Adiciona</div>
<div id=guia4 class=guia >Legenda</div>
<!-- div id=guia5 class=guia >Links</div →
<div id=guia6 class=guia >Curso</div>
</div>

13º → Crie uma nova <div> com o id guia6obj abaixo da <div> guia5obj que foi
comentada ou retirada no procedimento 11, conforme segue abaixo:

<div id='guia6obj' style='display:none;text-align:left'></div>

14º → Dentro da <div> com o id guia6obj coloque a linha de código abaixo:

<br>
<span style='text-align: center; font-size:14px;font-weight:bold'>Funções do Curso</span><br><br>

15º → Rode o aplicativo no navegador e verifique se a guia Curso foi criada no lugar da
guia Links.

16º → Dentro da tag <script> no final do arquivo curso.htm acrescente as seguintes


funções de inicialização do i3geo:

i3GEO.guias.ATUAL = "guia6";
i3GEO.arvoreDeTemas.INCLUIWMS = false
i3GEO.arvoreDeTemas.OPCOESADICIONAIS.downloadbase = false
i3GEO.arvoreDeTemas.OPCOESADICIONAIS.conectargeorss = false
i3GEO.arvoreDeTemas.OPCOESADICIONAIS.nuvemTagsFlash = false
i3GEO.arvoreDeTemas.OPCOESADICIONAIS.qrcode = false
i3GEO.arvoreDeTemas.OPCOESADICIONAIS.mini = false
i3GEO.arvoreDeTemas.OPCOESADICIONAIS.refresh = false
i3GEO.arvoreDeTemas.OPCOESADICIONAIS.carousel = false

Nota: Existem outras funções que parametrizam a inicialização do i3geo, para saber mais leia a
documentação do sistema no portal do software público.

17º → Crie uma nova <div> com o id filtros dentro da <div> guia6obj no arquivo curso.htm
e dentro desta crie uma tabela <table> com duas linhas <tr> e duas colunas <td> em cada
linha. Dentro das colunas da primeira linha escreva as palavras Estado: e Municipío:,
conforme código abaixo:

<div id='filtros' >


<table style='text-align:center;width:100%'>
<tr>
<td style="text-align:center;font-size:10px;font-weight:bold;width:50%">
Estado:
</td>
<td style='text-align:center;font-size:10px;font-weight:bold;width:50%'>
Município:
</td>
</tr>
<tr>
<td style='text-align:center;font-size:10px;font-weight:bold;width:50%'>
<br><br>
</td>
<td style='text-align:center;font-size:10px;font-weight:bold;width:50%'>
<br><br>
</td>
</tr>
</table>
</div>

18º → Nas colunas da segunda linha crie um objeto do tipo <select> que será preenchido
por uma função javascript conforme segue abaixo:

<td style='text-align:center;font-size:10px;font-weight:bold;width:50%'>
<select id="filuf" style="width:120px;font-size:10px" onChange=""></select>

<br><br>
</td>
<td style='text-align:center;font-size:10px;font-weight:bold;width:50%'>
<select id="filmunic" style="width:120px;font-size:10px" onChange=""></select>
<br><br>
</td>

19º → Faremos agora a função listaUf() que preencherá o objeto <select> com id filuf
criado no procedimento 18. As funções no i3geo geralmente são formadas por um par
composto de uma função em javascript e outra em php, tendo a biblioteca CPAINT como
responsável pela ligação entre as duas. Para criar a função listaUf() siga os
procedimentos abaixo:
→ Crie dois arquivos na pasta cursojs, o primeiro chamado curso_filtros.js e o segundo
chamado curso_geral.js, depois crie três arquivos na pasta cursophp, sendo o primeiro
denominado de curso_filtros.php, o segundo chamado curso_controle.php e o terceiro
chamado pgpar.php.

→ Abra o arquivo curso_filtros.js e coloque o código da função listaUf() conforme segue


abaixo:

function listaUf()
{
var montaListaUf = function (retorno)
{
retorno = retorno.data;
if ((retorno != "erro") && (retorno != undefined))
{
var uf = retorno.split("#");
var inner = '<option value="" selected>Escolha a UF</option>'
for (i=0;i<uf.length;i++)
{
var temp = uf[i].split("*");
var ext = temp[2];
inner += '<option value='+temp[0]+'*'+ext+'>'+temp[1]+'</option>'
}
select_innerHTML(document.getElementById("filuf"),inner);
}
}
var p = "cursophp/curso_controle.php?g_sid="+i3GEO.configura.sid+"&funcao=listaUf";
var cp = new cpaint();
//cp.set_debug(2)
cp.set_response_type("JSON");
cp.call(p,"",montaListaUf);
}

→ Abra o arquivo curso_geral.js e faça a função select_innerHTML() que é utilizada na


função listaUf(), conforme código abaixo:

function select_innerHTML(objeto,innerHTML)
{
objeto.innerHTML = ""
var selTemp = document.createElement("micoxselect")
var opt;
selTemp.id="micoxselect1"
document.body.appendChild(selTemp)
selTemp = document.getElementById("micoxselect1")
selTemp.style.display="none"
if(innerHTML.toLowerCase().indexOf("<option")<0){//se n?o ? option eu converto
innerHTML = "<option>" + innerHTML + "</option>"
}
innerHTML = innerHTML.replace(/<option/g,"<span").replace(/<\/option/g,"</span")
selTemp.innerHTML = innerHTML
for(var i=0;i<selTemp.childNodes.length;i++){
if(selTemp.childNodes[i].tagName){
opt = document.createElement("OPTION")
for(var j=0;j<selTemp.childNodes[i].attributes.length;j++){
opt.setAttributeNode(selTemp.childNodes[i].attributes[j].cloneNode(true))
}
opt.value = selTemp.childNodes[i].getAttribute("value")
opt.text = selTemp.childNodes[i].innerHTML
if(document.all){ //IEca
objeto.add(opt)
}else{
objeto.appendChild(opt)
}
}
}
document.body.removeChild(selTemp)
selTemp = null
}

→ Abra o arquivo curso_controle.php e acrescente o código abaixo:

<?php
include_once("../../i3geo/classesphp/pega_variaveis.php");
if ($funcao != "criaMapa")
{
session_name("i3GeoPHP");
if (isset($g_sid) && $g_sid != "")
{
session_id($g_sid);
}
session_start();
foreach(array_keys($_SESSION) as $k)
{
if(!is_array($_SESSION[$k]))
eval("\$".$k."='".$_SESSION[$k]."';");
}
$postgis_mapa = $_SESSION["postgis_mapa"];
if(isset($fingerprint))
{
if (md5('I3GEOSEC' . $_SERVER['HTTP_USER_AGENT'] . session_id()) != $fingerprint)
{exit;}
}
}
if (isset($debug) && $debug == "sim")
{error_reporting(0);}
//for($i==0;$i<5000000000;$i++){}
include_once ("../../i3geo/classesphp/carrega_ext.php");
include_once("../../i3geo/pacotes/cpaint/cpaint2.inc.php");
$cp = new cpaint();
$cp->set_data("");
if ($funcao == "criaMapa")
{
session_destroy();
$d = "";
if(!file_exists("ms_configura.php"))
$d = "../../i3geo/";
include_once($d."ms_configura.php");
chdir($locaplic);
$interface = "mashup";
include_once("../../i3geo/ms_criamapa.php");
$cp->set_data(session_id());
$cp->return_data();
return;
}
if (!isset($map_file))
{
$cp->set_data(array("erro"=>"linkquebrado"));
$cp->return_data();
exit;
}
include_once("../../i3geo/classesphp/classe_vermultilayer.php");
include_once("../../i3geo/classesphp/classe_estatistica.php");
include_once("../../i3geo/classesphp/funcoes_gerais.php");
$protocolo = explode("/",$_SERVER['SERVER_PROTOCOL']);
$protocolo=strtolower($protocolo[0]).'://'.$_SERVER['HTTP_HOST'];//
$_SERVER['SERVER_NAME'] .":". $_SERVER['SERVER_PORT'];
$urli3geo = str_replace("/classesphp/mapa_controle.php","",$protocolo.$_SERVER["PHP_SELF"]);
if($funcao != "recuperamapa")
{
if(!substituiCon($map_file,$postgis_mapa))
{$cp->set_data("erro");$cp->return_data();return;}
}

→ Ainda no arq uivo curso_controle.php, crie um switch e dentro deste crie um case com
a função listaUf(), conforme segue:

switch($funcao)
{
case "listaUf":
include ("curso_filtros.php");
$res = listaUf();
if (count($res) == 0){
$cp->set_data("erro");
}else{
foreach ($res as $r){
$retorno[] = $r[0]."*".$r[1]."*".$r[2];
}
$s = mb_convert_encoding(implode("#",$retorno),"UTF-8","ISO-8859-1");
$cp->set_data($s);
}
$cp->return_data();
break;
}

→ Abra o arquivo o arquivo pgpar.php e coloque neste arquivo a string de conexão com o
banco postgresql conforme segue:

<?php
$pgpar = "host=localhost port=5432 dbname=cgvam user=pgsql password=pgsql";
?>
→ Abra o arquivo curso_filtro.php e crie a função listaUf() conforme código abaixo:

<?php
include ("pgpar.php");
function listaUf()
{
global $pgpar;
$pgconn = pg_connect($pgpar);
pg_set_client_encoding($pgconn, "LATIN1");
$sql = "select
no_uf,
cd_uf,
the_geom,
(xmin(box2d(the_geom))::varchar || ',' ||
ymin(box2d(the_geom))::varchar || ',' ||
xmax(box2d(the_geom))::varchar || ',' ||
ymax(box2d(the_geom))::varchar)::varchar as extent
from
geodados.tb_uf_2007
order by
no_uf";
$result=pg_query($pgconn, $sql);
$numrows = pg_num_rows($result);
if ($numrows == 0)
{$retorno = array();}
else
{
for ($i = 0; $i < $numrows; $i++)
{
$arr = pg_fetch_array($result, $i);
$retorno[] = Array($arr["cd_uf"],$arr["no_uf"],$arr["extent"]);
}
}
pg_close($pgconn);
return ($retorno);
}
?>
→ No arquivo curso_inicio.js, acrescente na variável jsfiles os arquivos curso_filtro.js e
curso_geral.js, conforme segue:

var jsfiles = new Array(


"../../i3geo/classesjs/i3geo.js",
"curso_geral.js",
"curso_filtro.js"
);

→ Por fim chame a função listaUf() na inicialização do aplicativo, colocando-a dentro da


tag <script> no final do arquivo curso.htm. Rode novamente o aplicativo no navegador.
20º Para centralizarmos o Estado no mapa, após sua escolha na caixa do select,
criaremos a função zoomExt no arquivo curso_geral.js. Para a criação desta função só é
necessário o javascript, pois a funçao php já existe no i3geo e nos referenciaremos a ela.
Siga os procedimentos abaixo para criar a função zoomExt:

→ Abra o arquivo curso_geral.js e acrescente o código abaixo:

function zoomExt(codigo)
{
if(codigo == 1)
{
var temp = document.getElementById("filuf").value;
var extensao = temp.split("*")
var ext = extensao[1];
}else{
var temp = document.getElementById("filmunic").value;
var extensao = temp.split("*")
var ext = extensao[1];
}
//faz um zoom na ocorrencia

window.parent.borra("sim");
var p = g_locaplic+"/classesphp/mapa_controle.php?
g_sid="+i3GEO.configura.sid+"&funcao=mudaext&ext="+ext;
var cp = new cpaint();
//cp.set_debug(2)
cp.set_response_type("JSON");
cp.call(p,"mudaExtensao",window.parent.remapaf);
}

→ Chame a função zoomExt() na propriedade onchange da tag <select> com id filuf,


criada no procedimento 18, no arquivo curso.htm, passando o valor 1 na função, conforme
segue abaixo.

onChange="zoomExt('1');”

21º → Faremos agora a função listaMunic() que preencherá o objeto <select> com id
filmunic criado no procedimento 18. Para criar a função listaMunic() siga os
procedimentos abaixo:

→ Abra o arquivo curso_filtros.js e coloque o código da função listaUf() conforme segue


abaixo:

function listaMunic()
{
var temp = document.getElementById("filuf").value;
var codigo = temp.split("*");
var coduf = codigo[0];

var montaListaMunic = function (retorno)


{
retorno = retorno.data;
if ((retorno != "erro") && (retorno != undefined))
{
var mun = retorno.split("#");
var inner = '<option value="" selected>Escolha o Munic&iacute;pio</option>'
for (i=0;i<mun.length;i++)
{
var temp = mun[i].split("*");
var ext = temp[2];
inner += '<option value='+temp[0]+'*'+ext+'>'+temp[1]+'</option>'
}
select_innerHTML(document.getElementById("filmunic"),inner);
}
}
var p = "cursophp/curso_controle.php? g_sid = " +i3GEO.configura.sid+" &funcao =
listaMunic& couf = "+coduf;
var cp = new cpaint();
//cp.set_debug(2)
cp.set_response_type("JSON");
cp.call(p,"",montaListaMunic);
}

→ No arquivo curso_controle.php, crie um case com a função listaMunic(), conforme


segue:

case "listaMunic":
include ("curso_filtros.php");
$res = listaMunic();
if (count($res) == 0){
$cp->set_data("erro");
}else{
foreach ($res as $r){
$retorno[] = $r[0]."*".$r[1]."*".$r[2];
}
$s = mb_convert_encoding(implode("#",$retorno),"UTF-8","ISO-8859-1");
$cp->set_data($s);
}
$cp->return_data();
break;
→ Abra o arquivo curso_filtros.php e crie a função listaMunic() conforme código abaixo:

function listaMunic()
{
global $pgpar,$couf;
$pgconn = pg_connect($pgpar);
pg_set_client_encoding($pgconn, "LATIN1");

$sql = "select
a.no_municipio,
a.cd_municipio,
a.the_geom,
(xmin(box2d(a.the_geom))::varchar || ',' ||
ymin(box2d(a.the_geom))::varchar || ',' ||
xmax(box2d(a.the_geom))::varchar || ',' ||
ymax(box2d(a.the_geom))::varchar)::varchar as extent
from
geodados.tb_municipio_2007 as a
where
a.cd_uf = '$couf'
group by
a.gid,
a.the_geom,
a.no_municipio,
a.cd_municipio
order by
no_municipio";

$result=pg_query($pgconn, $sql);
$numrows = pg_num_rows($result);
if ($numrows == 0)
{$retorno = array();}
else
{
for ($i = 0; $i < $numrows; $i++)
{
$arr = pg_fetch_array($result, $i);
$retorno[] = Array($arr["cd_municipio"],$arr["no_municipio"],$arr["extent"]);
}
}
pg_close($pgconn);
return ($retorno);
}

→ Por fim chame a função listaMunic() na propriedade onchange da tag <select> com id
filuf, criada no procedimento 18, no arquivo curso.htm, conforme segue abaixo:

onChange="zoomExt('1');listaMunic();”

→ Chame a função zoomExt() na propriedade onchange da tag <select> com id filmunici,


criada no procedimento 18, no arquivo curso.htm, passando o valor 2 na função para
centralizar o município escolhido no mapa, conforme segue abaixo.

onChange="zoomExt('2');”

22º → Crie a função desenhaMunic para representar os municípios do Estado


selecionado e destacar o município escolhido da seguinte forma:

→ Crie um arquivo denominado curso_mapa.js na pasta cursojs e um arquivo


denominado curso_mapa.php na pasta cursophp.

→ Abra o arquivo curso_mapa.js e escreva o código da função desenhaMunic(), conforme


segue abaixo:

function desenhaMunic()
{
var temp = document.getElementById("filmunic").value;
var comunic = temp.split("*");
var codm = comunic[0]
var temp1 = document.getElementById("filuf").value;
var couf = temp1.split("*");
var codu = couf[0];
var p = "cursophp/curso_controle.php?g_sid = "+i3GEO.configura.sid+" &funcao =
desenhaMunic&codm="+codm+"&codu="+codu;
var cp = new cpaint();
//cp.set_debug(2)
cp.set_response_type("JSON");
cp.call(p,"",i3GEO.atualiza);
}
→ Abra o arquivo curso_controle.php e acrescente um novo case para a função
desenhaMunic(), da seguinte forma:

case "desenhaMunic":
include ("curso_mapa.php");
$res = desenhaMunic();
$cp->set_data($res);
redesenhaMapa();
break;
→ Agora faça a função desenhaMunic() no arquivo curso_mapa.php, conforme código
abaixo:

function desenhaMunic()
{
global $pgpar,$codm,$codu,$map_file,$locaplic;
if (!function_exists(ms_GetVersion))
{
$exts = get_loaded_extensions();
if (array_search( "MapScript", $exts) != TRUE)
{
if (strtoupper(substr(PHP_OS, 0, 3) == 'WIN'))
{
dl('php_mapscript.dll');
}else{
dl('php_mapscript.so');
}
}
}
$pgconn = pg_connect($pgpar);
pg_set_client_encoding($pgconn,"LATIN1");
$sqllm = " select
a.sg_uf,
a.no_municipio
from
geodados.tb_municipio_2007 as a
where
a.cd_municipio = $codm
and
a.cd_uf = '$codu'";
$result=pg_query($pgconn, $sqllm);
$arr = pg_fetch_array($result, 0);
$legendae = mb_convert_encoding(("Municípios - ".$arr["sg_uf"]),"ISO-8859-1");
$legendam = mb_convert_encoding(($arr["no_municipio"]." - ".$arr["sg_uf"]),"ISO-8859-1");
$sqlm = "the_geom from (
SELECT
the_geom,
gid,
cd_municipio,
no_municipio
FROM
geodados.tb_municipio_2007
WHERE
cd_municipio = $codm) as foo using unique gid using srid=4291";
$sqle = "the_geom from (
SELECT
the_geom,
gid,
cd_municipio,
no_municipio
FROM
geodados.tb_municipio_2007
WHERE
cd_uf = '$codu') as foo using unique gid using srid=4291";
$mapm = ms_newMapObj("/var/www/localhost/htdocs/curso/cursomap/munic.map");
$mapm1 = ms_newMapObj("/var/www/localhost/htdocs/curso/cursomap/munic1.map");
$mapex = ms_newMapObj("/var/www/localhost/htdocs/curso/cursomap/ptcont.map");
$map = ms_newMapObj($map_file);
$tipol = MS_SHP_POLYGON;
$novonomelayer = nomeRandomico();
$layer = $mapm->getlayerbyname("munic");
$layer->setmetadata("tema",$legendam);
$layer->setmetadata("munic","sim");
$layer->set("template","none.htm");
$layer->set("status",MS_DEFAULT);
$layer->set("name",$novonomelayer);
$layer->set("data",$sqlm);
$layer->set("type",MS_LAYER_POLYGON);
$novonomelayer1 = nomeRandomico();
$layer1 = $mapm1->getlayerbyname("munic1");
$layer1->setmetadata("tema",$legendae);
$layer1->setmetadata("munic1","sim");
$layer1->set("template","none.htm");
$layer1->set("status",MS_DEFAULT);
$layer1->set("name",$novonomelayer1);
$layer1->set("data",$sqle);
$layer1->set("type",MS_LAYER_POLYGON);
$layer2 = $mapex->getlayerbyname("ptcont");
$camadas = $map->getalllayernames();
foreach ($camadas as $l)
{
$camada = $map->getlayerbyname($l);
$munic = $camada->getmetadata("munic");
$munic1 = $camada->getmetadata("munic1");
if ($munic != "")
{
$camada->set("status",MS_DELETE);
}
if ($munic1 != ""){
$camada->set("status",MS_DELETE);
}
}
$adicionam1 = ms_newLayerObj($map, $layer1);
$adicionam = ms_newLayerObj($map, $layer);
$adicionaex = ms_newLayerObj($map, $layer2);
$salvo = $map->save($map_file);
return "ok";
}

→ Na pasta cursomap, crie três arquivos denominados de munic.map, munic1.map e


ptcont.map.

→ Abra o arquivo munic.map e escreva o seguinte código:

MAP
FONTSET "/var/www/localhost/htdocs/i3geo/symbols/fontes.txt"
SYMBOLSET "/var/www/localhost/htdocs/i3geo/symbols/simbolos.sym"

LAYER
CONNECTIONTYPE POSTGIS
CONNECTION "host=localhost port=5432 user=pgsql password=pgsql
dbname=cgvam"
DATA ""
METADATA
ITENS "cd_municipio,no_municipio"
ITENSDESC "Código,Município"
#TIP "no_municipio"
"CLASSE" "SIM"
"TEXTO" "NAO"
"TEMA" ""
END
NAME "munic"
SIZEUNITS PIXELS
STATUS OFF
TOLERANCE 0
TOLERANCEUNITS PIXELS
TYPE POLYGON
UNITS METERS
CLASS
NAME " "
STYLE
COLOR 23 56 111
OUTLINECOLOR 255 0 0
END
END
END
END

→ Abra o arquivo munic1.map e escreva o seguinte código:


MAP
FONTSET "/var/www/localhost/htdocs/i3geo/symbols/fontes.txt"
SYMBOLSET "/var/www/localhost/htdocs/i3geo/symbols/simbolos.sym"
LAYER
CONNECTIONTYPE POSTGIS
CONNECTION "host=localhost port=5432 user=pgsql password=pgsql
dbname=cgvam"
DATA ""
METADATA
ITENS "cd_municipio,no_municipio"
ITENSDESC "Código,Município"
#TIP "no_municipio"
"CLASSE" "SIM"
"TEXTO" "NAO"
"TEMA" "munic1"
END
NAME "munic1"
SIZEUNITS PIXELS
STATUS OFF
TOLERANCE 0
TOLERANCEUNITS PIXELS
TYPE POLYGON
UNITS METERS
LABELITEM "no_municipio"
CLASS
NAME " "
STYLE
COLOR 224 222 222
OUTLINECOLOR 255 0 0
END
LABEL
SIZE 8
TYPE TrueType
FONT arial
BUFFER 0
COLOR 0 0 0
FORCE FALSE
MINDISTANCE 0
MINFEATURESIZE 0
OFFSET 0 0
PARTIALS FALSE
POSITION AUTO
END
END
END
END

→ Abra o arquivo ptcont.map e escreva o seguinte código:


MAP
FONTSET "/var/www/localhost/htdocs/i3geo/symbols/fontes.txt"
SYMBOLSET "/var/www/localhost/htdocs/i3geo/symbols/simbolos.sym"
LAYER
CONNECTIONTYPE POSTGIS
CONNECTION "host=localhost port=5432 user=pgsql password=pgsql dbname=cgvam"
DATA "the_geom from (select * from geodados.tb_curso_exemplo) as foo USING UNIQUE gid
USING SRID=4291"
METADATA
ITENS "no_exemplo,ds_exemplo"
ITENSDESC "Nome,Descrição"
TIP "no_exemplo,ds_exemplo"
"CLASSE" "SIM"
"TEXTO" "SIM"
"TEMA" "Pontos de Exemplo"
END
NAME "ptcont"
LABELITEM "no_exemplo"
SIZEUNITS PIXELS
STATUS DEFAULT
TOLERANCE 0
TOLERANCEUNITS PIXELS
TYPE POINT
UNITS METERS
CLASS
NAME " "
STYLE
COLOR 255 0 0
SYMBOL "ponto"
SIZE 12
END
LABEL
SIZE 8
TYPE TrueType
FONT arial
BUFFER 0
COLOR 0 0 0
FORCE FALSE
MINDISTANCE 0
MINFEATURESIZE 0
OFFSET 0 0
PARTIALS FALSE
POSITION AUTO
END
END
END
END

→ Chame a função desenhaMunic() na propriedade onchange da tag <select> com id


filmunic, criada no procedimento 18, no arquivo curso.htm, conforme segue abaixo.

onChange="zoomExt('2'); desenhaMunic();”
→ No arquivo curso_inicio.js, acrescente na variável jsfiles o arquivos curso_mapa.js,
conforme segue:

var jsfiles = new Array(


"../../i3geo/classesjs/i3geo.js",
"curso_geral.js",
"curso_filtro.js",
“curso_mapa.js”
);

23º → Crie um novo arquivo chamado curso_cadastro.js na pasta cursojs e outro arquivo
chamado curso_cadastro.php na pasta cursophp.

24º → Abra o arquivo curso_cadastro.js e crie a função abreInsert() que montará um


formulário para inclusão de pontos no banco de dados, conforme código abaixo:

function abreInsert()
{
document.getElementById("cadastro").style.display = "block";
var formulario = "<table style='width:100%'>"+
"<tr><td colspan='2' style='width:100%;text-align:left'>&nbsp;&nbsp;&nbsp;&nbsp"+
"<span style='color:darkgreen;font-family:arial;font-size:11px;font-weight:bold'> Nome:
</span><br>"+
"</td></tr>"+
"<tr><td colspan='2' style='width:100%;text-align:center'>"+
"<input type='text' id='nome' value='' style='width:250px;height:20px;text-align:left'><br><br>"+
"</td></tr>"+
"<tr><td colspan='2' style='width:100%;text-align:left'>&nbsp;&nbsp;&nbsp;&nbsp"+
"<span style='color:darkgreen;font-family:arial;font-size:11px;font-weight:bold'> Descrição:
</span><br>"+
"</td></tr>"+
"<tr><td colspan='2' style='width:100%;text-align:center'>"+
"<textarea id='desc' cols='37' rows='5' value='teste' style='text-align:left'></textarea><br><br>"+
"</td></tr>"+
"<tr><td style='width:50%;text-align:left'>&nbsp;&nbsp;&nbsp;&nbsp"+
"<span style='color:darkgreen;font-family:arial;font-size:11px;font-weight:bold'> Latitude
</span><br>"+
"</td>"+
"<td style='width:50%;text-align:left'>&nbsp;&nbsp;&nbsp;&nbsp"+
"<span style='color:darkgreen;font-family:arial;font-size:11px;font-weight:bold'> Longitude
</span><br>"+
"</td></tr>"+
"<tr><td style='width:50%;text-align:center'>"+
"<input type='text' id='latd' value='' style='width:30px;height:20px;text-align:left'>&nbsp;&nbsp;"+
"<input type='text' id='latm' value='' style='width:30px;height:20px;text-align:left'>&nbsp;&nbsp;"+
"<input type='text' id='lats' value='' style='width:40px;height:20px;text-align:left'><br><br>"+
"</td>"+
"<td style='width:50%;text-align:center'>"+
"<input type='text' id='lond' value='' style='width:30px;height:20px;text-align:left'>&nbsp;&nbsp;"+
"<input type='text' id='lonm' value='' style='width:30px;height:20px;text-align:left'>&nbsp;&nbsp;"+
"<input type='text' id='lons' value='' style='width:40px;height:20px;text-align:left'><br><br>"+
"</td></tr>"+
"<tr><td style='width:50%;text-align:center'>"+
"<input type='button' name='save' value='Salvar' style='cursor:pointer;width:110px'
onclick='salva();'>"+
"<br><br></td>"+
"<td style='width:50%;text-align:center'>"+
"</td></tr>"+
"</table>";
document.getElementById("cadastro").innerHTML = formulario;
}

25º → Faremos agora a função salva() que é chamada no botão salvar do formulário
criado no procedimento anterior. No arquivo curso_cadastro.js escreva o código da função
salva() conforme segue:

function salva()
{
var temp = document.getElementById("filuf").value;
var vuf = temp.split("*");
var uf = vuf[0];
var temp1 = document.getElementById("filmunic").value;
var vmunic = temp1.split("*");
var munic = vmunic[0];
var nome = document.getElementById("nome").value;
var desc = document.getElementById("desc").value;
var latd = document.getElementById("latd").value;
var latm = document.getElementById("latm").value;
var lats = document.getElementById("lats").value;
var lond = document.getElementById("lond").value;
var lonm = document.getElementById("lonm").value;
var lons = document.getElementById("lons").value;
var lat = i3GEO.calculo.dms2dd(latd,latm,lats);
var lon = i3GEO.calculo.dms2dd(lond,lonm,lons);
var save = function(retorno)
{
var temp = retorno.data;
if(temp == "ok")
{
alert("Registro Incluído com Sucesso !!!");
i3GEO.atualiza();
}
}
var p = "cursophp/curso_controle.php?
g_sid="+i3GEO.configura.sid+"&funcao=salva&uf="+uf+"&munic="+munic+"&nome="+nome+"&des
c="+desc+"&lat="+lat+"&lon="+lon;
var cp = new cpaint();
//cp.set_debug(2)
cp.set_response_type("JSON");
cp.call(p,"",save);
}

→ Abra o arquivo curso_controle.php e acrescente o case da função salva, conforme


segue:

case "salva":
include("curso_cadastro.php");
$res = salva();
$cp->set_data($res);
$cp->return_data();
break;

→ Abra o arquivo curso_cadastro.php e crie a função salva() conforme código abaixo:

function salva()
{
global $pgpar,$uf,$munic,$nome,$desc,$lat,$lon;
$pgconn = pg_connect($pgpar);
pg_set_client_encoding($pgconn,"LATIN1");
$sql = "INSERT INTO
geodados.tb_curso_exemplo(cd_municipio,cd_uf,no_exemplo,ds_exemplo,the_geom)
VALUES ($munic,$uf,'$nome','$desc',GEOMETRYFROMTEXT('POINT($lon
$lat)',4291))";
$result = pg_query($pgconn,$sql);
$numrows = pg_affected_rows($result);
if($numrows == 0)
{
$retorno = "erro";
}else{
$retorno = "ok";
}
pg_close($pgconn);
return($retorno);
}

→ Por fim, abra o arquivo curso.htm e crie uma nova <div> com o id cadastro dentro da
<div> guia6obj, da seguinte forma:

<div id="cadastro" style=display:none></div>

26º Abra o navegado e teste sua nova aplicação baseada no software público i3geo.

You might also like