Professional Documents
Culture Documents
MMA
MÓDULO BÁSICO
Apoio:
COORDENAÇÃO GERAL DE TECNOLOGIA DA INFORMAÇÃO E INFORMÁTICA – CGTI/MMA
3. Na guia distribuição marque a opção preferir versões de: e escolha a opção Jaunty.
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.
1.2. PHP
1.3. MAPSERVER
1.5. R E SPATSTAT
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
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.
$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.
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 $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 = "";
Obs.: Optando por esta funcionalidade o mapa será forçado a recusar o modo de
operação CGI.
→ 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";
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/"
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"
LAYER
DATA "/var/www/i3geo/aplicmap/dados/zee"
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:
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:
→ Altere a linha de conexão local da seguinte forma, onde estiver escrito md5 troque para
trust, conforme segue abaixo:
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.
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.
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.
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
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.
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
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.
Nota 02: pode-se fazer o processo inverso, exportar uma tabela postgresql para shapefile
a partir do comando pgsql2shp da seguinte forma:
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:
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.
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.
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.
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
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 “/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.
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”.
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.
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
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
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:
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.
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.
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
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”.
FONT → define a fonte que será usada. Esta fonte deve estar definida no arquivo de fonte
usado pelo i3geo.
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.
CONNECTIONTYPE → esta tag define o tipo de conexão que será estabelecida pelo
MapServer.
CONNECTIONTYPE POSTGIS
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:
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
CONNECTIONTYPE → especifica o tipo de conexão que será realizada, neste caso WMS
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.
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
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
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
<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:
6º→ Abra o arquivo curso.htm e registre o arquivo curso_inicio.js, conforme segue 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.
13º → Crie uma nova <div> com o id guia6obj abaixo da <div> guia5obj que foi
comentada ou retirada no procedimento 11, conforme segue 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.
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:
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.
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);
}
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
}
<?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:
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);
}
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:
function listaMunic()
{
var temp = document.getElementById("filuf").value;
var codigo = temp.split("*");
var coduf = codigo[0];
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();”
onChange="zoomExt('2');”
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";
}
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
onChange="zoomExt('2'); desenhaMunic();”
→ No arquivo curso_inicio.js, acrescente na variável jsfiles o arquivos curso_mapa.js,
conforme segue:
23º → Crie um novo arquivo chamado curso_cadastro.js na pasta cursojs e outro arquivo
chamado curso_cadastro.php na pasta cursophp.
function abreInsert()
{
document.getElementById("cadastro").style.display = "block";
var formulario = "<table style='width:100%'>"+
"<tr><td colspan='2' style='width:100%;text-align:left'>  "+
"<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'>  "+
"<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'>  "+
"<span style='color:darkgreen;font-family:arial;font-size:11px;font-weight:bold'> Latitude
</span><br>"+
"</td>"+
"<td style='width:50%;text-align:left'>  "+
"<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'> "+
"<input type='text' id='latm' value='' style='width:30px;height:20px;text-align:left'> "+
"<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'> "+
"<input type='text' id='lonm' value='' style='width:30px;height:20px;text-align:left'> "+
"<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);
}
case "salva":
include("curso_cadastro.php");
$res = salva();
$cp->set_data($res);
$cp->return_data();
break;
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:
26º Abra o navegado e teste sua nova aplicação baseada no software público i3geo.