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

53612594-apostila-i3geo-desenv

Embed Size (px)

Citation preview

Page 1: 53612594-apostila-i3geo-desenv

MINISTÉRIO DO MEIO AMBIENTEMMA

PROGRAMA NACIONAL DE MEIO AMBIENTEPNMA 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

Page 2: 53612594-apostila-i3geo-desenv

Sumário1. MONTAGEM DO SERVIDOR PARA A INSTALAÇÃO DO I3GEO NO UBUNTU...................2

1.1. SERVIDOR WEB APACHE2...................................................................................................31.2. PHP...........................................................................................................................................41.3. MAPSERVER...........................................................................................................................51.4. POSTGRESQL E POSTGIS.....................................................................................................51.5. R E SPATSTAT.........................................................................................................................61.6. GHOSTSCRIPT........................................................................................................................7

2. INSTALAÇÃO E CONFIGURAÇÃO DO I3GEO.........................................................................72.1 CONFIGURANDO O ARQUIVO MS_CONFIGURA.PHP ...................................................72.2. CONFIGURANDO O ARQUIVO GERAL1.MAP...............................................................112.3. TESTE DE INSTALAÇÃO....................................................................................................12

3. CRIAÇÃO DE BANCO DE DADOS ESPACIAL........................................................................123.1. CONEXÃO COM O BANCO DE DADOS POSTGRESQL................................................133.2. USUÁRIOS DO BANCO DE DADOS..................................................................................143.3. BASE DE DADOS ................................................................................................................153.4. TABELAS COM DADOS ESPACIAIS.................................................................................16

3.4.1. IMPORTANDO ESRI SHAPEFILES NO BANCO POSTGRESQL............................163.4.2. CRIANDO TABELAS A PARTIR DA LINGUAGEM SQL.........................................19

4. MAPFILES.....................................................................................................................................204.1. TAGS PRINCIPAIS................................................................................................................214.2. TAGS OPICIONAIS...............................................................................................................254.3. TAGS PARA INCLUSÃO DE LABELS NAS LAYERS......................................................284.4. TAGS PARA CONEXÃO COM BANCO DE DADOS POSTGRESQL..............................304.5. TAGS PARA CONEXÃO COM WEBSERVICES WMS......................................................324.6. TAGS PARA REPRESENTAÇÃO DE ARQUIVOS RASTER............................................34

5. DESENVOLVENDO UMA APLICAÇÃO BASEADA NO I3GEO.............................................34

Page 3: 53612594-apostila-i3geo-desenv

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

Page 4: 53612594-apostila-i3geo-desenv

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

Page 5: 53612594-apostila-i3geo-desenv

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

Page 6: 53612594-apostila-i3geo-desenv

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

Page 7: 53612594-apostila-i3geo-desenv

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

Page 8: 53612594-apostila-i3geo-desenv

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:

Page 9: 53612594-apostila-i3geo-desenv

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

Page 10: 53612594-apostila-i3geo-desenv

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.

Page 11: 53612594-apostila-i3geo-desenv

$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

Page 12: 53612594-apostila-i3geo-desenv

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.

Page 13: 53612594-apostila-i3geo-desenv

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.

Page 14: 53612594-apostila-i3geo-desenv

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.

Page 15: 53612594-apostila-i3geo-desenv

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:

Page 16: 53612594-apostila-i3geo-desenv

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.

Page 17: 53612594-apostila-i3geo-desenv

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

Page 18: 53612594-apostila-i3geo-desenv

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.

Page 19: 53612594-apostila-i3geo-desenv

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:

Page 20: 53612594-apostila-i3geo-desenv

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

Page 21: 53612594-apostila-i3geo-desenv

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.

Page 22: 53612594-apostila-i3geo-desenv

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

Page 23: 53612594-apostila-i3geo-desenv

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

Page 24: 53612594-apostila-i3geo-desenv

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

Page 25: 53612594-apostila-i3geo-desenv

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á

Page 26: 53612594-apostila-i3geo-desenv

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

Page 27: 53612594-apostila-i3geo-desenv

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

Page 28: 53612594-apostila-i3geo-desenv

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.

Page 29: 53612594-apostila-i3geo-desenv

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

Page 30: 53612594-apostila-i3geo-desenv

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.

Page 31: 53612594-apostila-i3geo-desenv

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"

Page 32: 53612594-apostila-i3geo-desenv

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.

Page 33: 53612594-apostila-i3geo-desenv

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

Page 34: 53612594-apostila-i3geo-desenv

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

Page 35: 53612594-apostila-i3geo-desenv

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>

Page 36: 53612594-apostila-i3geo-desenv

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

}

Page 37: 53612594-apostila-i3geo-desenv

}

}

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.

Page 38: 53612594-apostila-i3geo-desenv

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

Page 39: 53612594-apostila-i3geo-desenv

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

Page 40: 53612594-apostila-i3geo-desenv

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:

Page 41: 53612594-apostila-i3geo-desenv

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

Page 42: 53612594-apostila-i3geo-desenv

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

Page 43: 53612594-apostila-i3geo-desenv

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'];

Page 44: 53612594-apostila-i3geo-desenv

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

Page 45: 53612594-apostila-i3geo-desenv

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.

Page 46: 53612594-apostila-i3geo-desenv

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

Page 47: 53612594-apostila-i3geo-desenv

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

Page 48: 53612594-apostila-i3geo-desenv

}

$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++)

{

Page 49: 53612594-apostila-i3geo-desenv

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

Page 50: 53612594-apostila-i3geo-desenv

}

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

Page 51: 53612594-apostila-i3geo-desenv

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

Page 52: 53612594-apostila-i3geo-desenv

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

Page 53: 53612594-apostila-i3geo-desenv

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

Page 54: 53612594-apostila-i3geo-desenv

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"

Page 55: 53612594-apostila-i3geo-desenv

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

Page 56: 53612594-apostila-i3geo-desenv

→ 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;"+

Page 57: 53612594-apostila-i3geo-desenv

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

Page 58: 53612594-apostila-i3geo-desenv

{

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+"&desc="+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";

Page 59: 53612594-apostila-i3geo-desenv

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