Mini-curso MapServer Avançado PHP/MapScript Carlos Henrique Bughi bughi@univali.br Laboratório de Computação Aplicada G10 Centro de Ciências Tecnológicas da Terra e do Mar Universidade do Vale do Itajaí 1
PHP/MapScript Agenda Sobre o G10 Introdução ao PHP/MapScript O que é Porque usar Estrutura Requisitos PHP Conceitos básicos Programação OO Acessando PostGreSQL AJAX Modelo de objetos PHP/MapScript Modelando a aplicação Requisitos do sistema Diagrama de classes Codificando a aplicação 2
Laboratório de Computação Aplicada G10 Histórico e Características Início das atividades: 2001 Áreas: Engenharia Ambiental Ciências da Computação Oceanografia Geografia Linhas de Pesquisa: Desenvolvimento de sistemas de informação e apoio à decisão com suporte geoespacial 3
Laboratório de Computação Aplicada G10 Histórico e Características Equipe atual: 1 Doutor 1 Mestre 2 Mestrandos 6 Técnicos 12 Graduandos 4
Laboratório de Computação Aplicada G10 Histórico e Características Infra-estrutura (80m2): 4 Servidores 6 Workstations 20 PCs 4 Notebooks 5
Laboratório de Computação Aplicada G10 6
Laboratório de Computação Aplicada G10 Histórico e Características 42 Projetos Troféu FINEP de Inovação Tecnológica Etapa Sul 2003 Etapa Sul 2006 Finalista do Prêmio Empreendedorismo Guia do Estudante - 2005 7
Laboratório de Computação Aplicada G10 Histórico e Características Projetos em desenvolvimento Projeto TAMAR SITAMAR SEAP/PR RASTRO e COB Porto de Itajaí Sistema de Informação Ambiental MMA/SRH Censo Gestão de Recursos Hídricos MMA/FNMA Pesca Responsável 8
Laboratório de Computação Aplicada G10 Foco: 9
Introdução ao PHP/MapScript 10
PHP/MapScript Definição O PHP/MapScript é um módulo desenvolvido para a linguagem de script PHP que permite o uso de funções e classes existentes no Mapserver (desenvolvido utilizando a linguagem C); Desenvolvido e mantido pela DM Solutions Group, atualmente encontra-se na versão 4.8.1 (03/01/06); Permite aliar as facilidades de uma linguagem de programação com as funcionalidades SIG do MapServer; 11
PHP/MapScript Definição 12
PHP/MapScript Porque usar O PHP/MapScript permite fazer coisas que o MapServer CGI não consegue: Criação de layers dinâmicas; Navegação customizada; Classificação de layers em tempo real; Maior capacidade de pesquisa; Suporte à leitura e gravação de shapefiles; Manipulação dinâmica de definições do arquivo MapFile; Liberdade para a criação de lógica e algoritmos complexos; 13
PHP/MapScript Requisitos Para utilizar o PHP/MapScript, alguns requisitos básicos são necessários: Conhecimento do MapServer CGI e da estrutura do MapFile; Conhecimento da linguagem PHP; Seguindo as últimas tendências, conhecimento em AJAX para a construção de aplicações com PHP/MapScript mais eficientes e amigáveis ao usuário final; 14
Estrutura do MapFile QUERYMAP WEB SYMBOL 0..1 0..1 0..* PROJECTION REFERENCE_MAP 0..1 MAP 0..1 0..1 GRID SCALEBAR 0..1 0..1 0..* LAYER 0..1 LEGEND 0..* FEATURE 1..* CLASS 0..1 0..1 LABEL 0..1 0..* STYLE 15
Estrutura do MapFile Objetos MapFile Map: Objeto mestre do MapFile Web: Define parâmetros para uma interface web Layer: Descreve as camadas utilizadas para fazer o mapa Class: Define classes temáticas para uma camada; Label: Define formatos de fonte e apresentação de textos; Style: Mantém parâmetros para simbolização Parâmetros da requisição (para testes com CGI): Mode: Modo de operação do MapServer (map) Map: Caminho para o arquivo MapFile 16
Estrutura do MapFile Criação do mapfile para o sistema em PHP/MapScript Layers vetoriais brasil.shp capitais.shp eixo_geo.shp lote_geo.shp quadra_geo.shp via_geo.shp Layers raster Rectifyikonos_mini.tif Obtendo informações sobre o Shapefile: ogrinfo.exe -al fid 0 arqshape.shp 17
Estrutura do MapFile Criação do mapfile para o sistema em PHP/MapScript Limites do mapa -47.886453-15.809809-47.848327-15.786974 Imagem para o mapa de referência dados/referencia.png 18
Construindo uma aplicação WebGIS com PHP/MapScript Definindo os requisitos do sistema 19
Requisitos Requisitos contemplados Pan Zoom in pontual Zoom in por seleção Zoom out Retorno aos limites originais Pesquisa pontual Pesquisa por seleção Mapa de referência dinâmico Listagem dinâmica de camadas Cálculo de distância 20
Arquitetura Requisição AJAX Cliente Web (Navegador) Servidor HTTP Motor PHP Resposta index.html rotinas.js Mapscript requisicao principal.css MapFile 21
Estrutura de arquivos e diretórios Pasta app1 (dentro de htdocs) 22
Arquivos lado cliente index.html 23
Arquivos lado cliente principal.css: arquivo de definição de estilos Referenciado no index.html através de: <link rel="stylesheet" href="estilos/principal.css" type="text/css"/> 24
Arquivos lado cliente rotinas.js Variáveis globais: btnacao: define a ação atual requisicaoacao: define a ação passada para a requisição requisicaoparametros: define parâmetros adicionais passados para a requisição Valores possíveis Valores possíveis btnacao 1 zoomin 2 zoomout 3 query 4 reset 5 distancia 6 pan 7 inserirmarco requisicaoacao iniciarsistema retornarlimite mudarstatuscamada realizarzoomporselecao realizarzoompontual realizarpesquisaporselecao realizarpesquisapontual inserirmarco inserirpontodistancia cancelardistancia 25
Arquivos lado cliente rotinas.js Variáveis do mapa: limite: limites do mapa separados por vírgula (retornado pelo servidor); largurapadrao: largura da imagem (deve ser definido direto no arquivo); alturapadrao: altura da imagem (deve ser definido direto no arquivo); Variáveis de seleção: offsetx e offsety: armazenam o clique inicial do mapa; minx, miny, maxx e maxy: armazenam as coordenadas da seleção; arrastando: status da seleção, arrastando = true indica que uma seleção está em andamento; 26
Arquivos lado cliente rotinas.js Métodos: inicia(): chamado no evento onload() do elemento body, realiza a primeira requisição ao servidor; iniciabtn(): define as imagens desabilitadas de cada botão; selecionabtnacao(acao): define a imagem habilitada para o botão definido pelo argumento acao; criaajax(): retorna o objeto XMLHttpRequest; enviarequisicao(): realiza uma requisição em segundo plano utilizando Ajax; codificaxml(xmldoc): analisa XML de retorno decidindo, através da ação, qual método deve ser chamado; 27
Arquivos lado cliente rotinas.js Métodos: montarmapa(xmldoc): atualiza o mapa principal, a imagem de referência, a imagem de escala, os limites do mapa de acordo com os valores existentes no arquivo xmldoc; montarcamadas(xmldoc): Cria a lista de camadas de acordo com os valores existentes do arquivo xmldoc; atualizarcamadas(xmldoc): atualiza a visibilidade das camadas do sistema; montarresultado(xmldoc): Cria uma lista com os resultados de uma pesquisa; ocultarresultado(): oculta elemento DIV contendo a lista de resultados da pesquisa; 28
Arquivos lado cliente rotinas.js Métodos: mudastatuscamada(camada): envia requisição com a camada que terá o status alterado; aguardar(mostrar): mostra ou oculta o elemento DIV com a mensagem aguarde ; montardistancia(xmldoc): atualiza o mapa principale os dados de distância de acordo com os valores existentes no arquivo xmldoc; cancelardistancia(): envia uma solicitação para limpar os pontos de cálculo de distância; 29
Arquivos lado cliente rotinas.js Métodos: iniciamovimento(e): função associada ao evento onmousedown do DIV mapa responsável por iniciar o processo de seleção de uma área no mapa; movimentamouse(e): função associada ao evento onmousemove do DIV mapa responsável por desenhar o DIV de seleção e mostrar as coordenadas do mapa; levantamouse(e): função associada ao evento onmouseup do DIV mapa responsável por obter as coordenadas finais da seleção e realizar a requisição para zoom ou pesquisa; pixelparageo(x,y, largura,altura,limite): Converte píxel para coordenada geográfica; decimaistogms(grau): converte de grau decimal para grau, minuto e segundo; 30
Estrutura dos arquivos XML trocados pelo sistema 31
Documentos XML Retorno da ação iniciarsistema 32
Documentos XML Retorno das ações retornarlimite, realizarzoompontual, realizarzoomporselecao, mudarstatuscamada 33
Documentos XML Retorno das ações realizarpesquisapontual e realizarpesquisaporselecao 34
Definindo o esqueleto da nossa classe Mapscript.php 35
Classe MapScript Classe MapScript: responsável pela integração entre o sistema e o MapServer; Atributos: private $mapfileusuario: indica o arquivo MapFile utilizado para a sessão do usuário; private $limiteatual: indica os limites do mapa; private $objmapa: objeto mapobj; const MAPFILEORIGINAL: indica o arquivo MapFile padrão, deve ser informado pelo programador; const LIMITEORIGINAL: indica os limites iniciais do mapa, deve ser informado pelo programador; 36
Classe MapScript Métodos: CONSTRUCT($mapfile = null, $limite = null) Construtor da classe MapScript, se os parâmetros $mapfile e $limite não forem informados serão utilizados os valores das constantes MAPFILEORIGINAL e LIMITEORIGINAL; public retornamapfile() Salva arquivo MapFile para a sessão do usuário; public retornaimagemescala() Salva imagem da escala e retorna o caminho; public retornaimagemmapa() Salva imagem do mapa e retorna o caminho; 37
Classe MapScript Métodos: public retornaimagemreferencia () Salva imagem de referência dinâmica e retorna o caminho; public alterastatuscamada($camada) Inverte status da camada passada por parâmetro public realizazoompontual ($x, $y, $direcao) Realiza zoom pontual na coordenada $x e $y; Direção: 2 zoom in (2 vezes) -2 zoom out (2 vezes) 1 pan 38
Classe MapScript Métodos: public realizazoomporselecao ($minx,$miny, $maxx, $maxy) Realiza zoom na seleção definida por $minx, $miny, $maxx e $maxy; public retornaraoslimitesoriginais () Ajusta os limites do mapa conforme definido na constante LIMITEORIGINAL; private alteralimite($limite) Altera os limites do mapa para o definido pela variável $limite; 39
Classe MapScript Métodos: public retornalimite() Retorna os limites atuais do mapa; public realizapesquisapontual ($x, $y, $camada) Realiza pesquisa pontual (coordenada $x e $y) na layer definida pela variável $camada; Retorna documento XML contendo o resultado da pesquisa; public realizapesquisaporselecao ($minx, $miny, $maxx, $maxy, $camada) Realiza pesquisa espacial na layer $camada através do polígono defino pelas variáveis $minx, $miny, $maxx, $maxy; Retorna documento XML contendo o resultado da pesquisa; 40
Classe MapScript Métodos: private montarxmlpesquisa ($objlayer) Constrói documento XML de pesquisa segundo resultados do objeto $objlayer; Retorna o documento; public retornacamadas ($classificar=true) Constrói documento XML contendo a relação das camadas existentes; Se $classificar for igual a false então não é inserido os dados de classificação (útil para ajuste de status); Retorna o documento; 41
Classe MapScript Métodos: private pixelparageox ($x) Retorna valor em coordenada do mapa de um valor $x em píxel; private pixelparageoy ($y) Retorna valor em coordenada do mapa de um valor $y em píxel; Os métodos utilizados para calcular distância serão apresentados mais adiante; 42
Estrutura do PHP/MapScript 43
Modelo de objetos do PHP/MapScript 44
Entendendo a estrutura do MapScript mapobj (objeto do mapa) Construtor: ms_newmapobj($mapfile); Membros da classe: Tabela 10, página 22; Métodos da classe: páginas 23 a 33; Métodos utilizados pelo sistema: int save(string filename) Salva o estado do objeto map atual em um arquivo. Retorna -1 em caso de erro. Use caminhos absolutos. Se um caminho relativo for usado, então ele será relativo ao local do MapFile. imageobj drawscalebar() Renderiza a barra de escala e retorna o manuseamento em um objeto image. 45
Entendendo a estrutura do MapScript mapobj (objeto do mapa) imageobj draw() Renderiza o mapa e retorna o manuseamento em um objeto image. imageobj drawscalebar() Renderiza a barra de escala e retorna o manuseamento em um objeto image. mapobj clone() Retorna o handle para um novo mapobj que é um clone do mapobj atual. Todos os parâmetros do mapobj são copiados para o novo mapobj. Retorna NULL em caso de erro. 46
Entendendo a estrutura do MapScript mapobj (objeto do mapa) layerobj getlayerbyname(string layer_name) Retorna um layerobj de um mapa dado um nome de um layer. Retorna FALSE se o layer não existir. void zoompoint(int nzoomfactor, pointobj opixelpos, int nimagewidth, int nimageheight, rectobj ogeorefext) Faz zoom para uma posição XY. Os parâmetros são: Zoom factor: valores positivos aumentam o zoom, valores negativos diminuem o zoom. Fator 1 centraliza. Pixel position (pointobj): coordenadas x, y do click com (0,0) no canto superior-esquerdo. Width: largura da imagem atual em pixel. Height: altura da imagem atual em pixel. Georef extent (rectobj): extents georeferenciados atuais. MaxGeoref extent (rectobj): (opcional) extent georeferenciado máximo. Se provido então será impossível fazer zoom para fora desses extents. 47
Entendendo a estrutura do MapScript mapobj (objeto do mapa) void zoomrectangle(rectobj opixelext, int nimagewidth, int nimageheight, rectobj ogeorefext) Ajusta os extents do mapa para os extents passados. Os parâmetros são: opixelext (rect object): Extents em pixel, com (0,0) no canto superior-esquerdo; Width: largura em pixel da imagem atual Height: altura em pixel da imagem atual Georef extent (rectobj): extents georeferenciados atual. 48
Entendendo a estrutura do MapScript mapobj (objeto do mapa) void setextent(double minx, double miny, double maxx, double maxy) Ajusta os extents do mapa (no sistema de referência definido no MapFile). array getlayersdrawingorder() Retorna um array contendo os índices dos layers na ordem que eles serão desenhados. layerobj getlayer(int index) Retorna um layerobj da layer informada pelo index (0=primeira layer) 49
Entendendo a estrutura do MapScript layerobj (objeto da layer) Objetos layerobj podem ser retornados pelo mapobj; Construtor: ms_newlayerobj ($mapobj [, layerobj]); Membros da classe: Tabela 7, página 12; Métodos da classe: páginas 13 a 20; Métodos utilizados pelo sistema: int set(string property_name, new_value) Ajusta um novo valor à uma propriedade de um objeto. Retorna -1 em caso de erro. 50
Entendendo a estrutura do MapScript layerobj (objeto da layer) int querybypoint(pointobj point, int mode, double buffer) Pesquisa no layer em uma localização pontual especificada em coordenadas do mapa georeferenciado (não em pixels). A pesquisa é feita em todos os shapes que fazem parte de uma CLASSE que contém um valor TEMPLATE ou qualquer classe de um layer que contenha um valor LAYER TEMPLATE. O modo é MS_SINGLE ou MS_MULTIPLE dependendo do número de resultados que você quer. Passar buffer <=0 opta-se pelas tolerâncias ajustadas no arquivo map (em pixels) mas você pode usar um buffer especificado em unidade do mapa. Retorna MS_SUCCESS se shapes foram encontrados ou MS_FAILURE se nada foi encontrado ou se algum outro erro ocorreu. 51
Entendendo a estrutura do MapScript layerobj (objeto da layer) int querybyrect(rectobj rect) Pesquisa no layer usando um retângulo especificado em coordenadas do mapa georeferenciado (i.e. não em pixels). A pesquisa é feita em todos os shapes que fazem parte de uma CLASSE que contém um valor TEMPLATE ou qualquer classe de um layer que contenha um valor LAYER TEMPLATE. Retorna MS_SUCCESS se shapes foram encontrados ou MS_FAILURE se nada foi encontrado ou se algum outro erro ocorreu. 52
Entendendo a estrutura do MapScript layerobj (objeto da layer) int getnumresults() Retorna o número de resultados do layer na última pesquisa. int getmetadata(string name) Busca uma entrada de metadado em um layer por nome. Retorna "" se nenhuma entrada combina com o nome. Perceba que a busca é caso sensitivo. int open() Abre o layer para uso com o getshape(). Retorna MS_SUCCESS/MS_FAILURE. 53
Entendendo a estrutura do MapScript layerobj (objeto da layer) resultcachememberobj getresult(int index) Retorna um objeto resultcachememberobj com os índices de um objeto layer Parâmetro index varia de 0 à numresults-1. Retorna um objeto válido ou FALSE(0) se o index é inválido. shapeobj getshape(int tileindex, int shapeindex) Recupera um shapeobj de um layer pelo seu índice. tileindex é usado apenas para shapefiles indexados (você recebe ele de um resultcachememberobj retornado por um getresult() por instância). Simplesmente passe tileindex = -1 para outras fontes de dados. 54
Entendendo a estrutura do MapScript layerobj (objeto da layer) voidclose() Fecha o layer aberto anteriormente com open(). boolean isvisible() Retorna MS_TRUE ou MS_FALSE dependendo se a layer está visível no mapa. classobj getclass(int classindex) Retorna um classobj da layer dada um valor de index (0=primeira classe); Para descobrir o total de classes, utilize layerobj->numclasses; 55
Entendendo a estrutura do MapScript layerobj (objeto da layer) int addfeature(shapeobj shape) Adiciona uma nova feature em um layer. Retorna -1 em caso de erro. 56
Entendendo a estrutura do MapScript RectObj (objeto que define um retângulo) Podem estar embutidos em outros objetos ou criados a partir do construtor; Construtor: RectObj ms_newrectobj() Membros da classe: Tipo de dado double double double double Nome minx miny maxx maxy 57
Entendendo a estrutura do MapScript RectObj (objeto que define um retângulo) Métodos da classe: int set(string property_name, new_value) Ajusta um novo valor à propriedade de um objeto. Retorna -1 em caso de erro. void setextent(double minx, double miny, double maxx, double maxy) Ajusta os extents do retângulo. int draw(mapobj map, layerobj layer, imageobj img, int class_index, string text) Desenha um retângulo individual usando layer. O class_index é usado para classificar o retângulo baseado nas classes definidas para o layer. A string text é usada para anotar o retângulo. Retorna MS_SUCCESS/MS_FAILURE. 58
Entendendo a estrutura do MapScript RectObj (objeto que define um retângulo) double fit(int width, int height) Ajusta o extents do retângulo para se encaixar na largura/altura especificada. int project(projectionobj dentro, projectionobj fora) Projeta o retângulo da projeção "dentro" (primeiro argumento) para a projeção "fora" (segundo argumento). Retorna MS_SUCCESS/MS_FAILURE. void free() Destrói os recursos usados por um objeto rect. 59
Entendendo a estrutura do MapScript PointObj (objeto que define um ponto) Construtor: Point = ms_newpointobj(); Membros da classe: Tipo de dado double Nome x Observações double y double double z m Usado para arquivos shape 3D. Ajuste para zero para outros tipos. Usado apenas para arquivos shape medidos. Ajuste para zero para outros tipos. 60
Entendendo a estrutura do MapScript PointObj (objeto que define um ponto) Métodos da classe: int setxy(double x, double y [, double m]) Ajusta os valores das coordenadas X,Y. O terceiro parâmetro m é usado apenas para medição de shape files e não é obrigatório. Retorna 0 em caso de sucesso, -1 caso contrário. int setxyz(double x, double y, double z [, double m]) Ajusta os valores das coordenadas X,Y e Z. O quarto parâmetro m é usado apenas para medição de shape files e não é obrigatório. Retorna 0 em caso de sucesso, -1 caso contrário. int draw(mapobj map, layerobj layer, imageobj img, int class_index, string text) Desenha o ponto individual usando layer. A classe_index é usado para classificar o ponto baseado nas classes definidas no layer. A string text é usada para anotar o ponto. Retorna MS_SUCCESS/MS_FAILURE. 61
Entendendo a estrutura do MapScript PointObj (objeto que define um ponto) double distancetopoint(pointobj popoint) Calcula a distância entre dois pontos. double distancetoline(pointobject p1, pointobject p2) Calcula a distância entre um ponto e uma linha definida por dois pontos passados por argumento. double distancetoshape(shapeobj shape) Calcula a menor distância entre um ponto e um shape. int project(projectionobj dentro, projectionobj fora) Projeta o ponto da projeção de "dentro" (primeiro argumento) à projeção "fora" (segundo argumento). Retorna MS_SUCCESS/MS_FAILURE. void free() Libera todos os recursos usados pelo objeto. 62
Entendendo a estrutura do MapScript LineObj (objeto que define uma linha) Construtor: LineObj = ms_newlineobj() ; Membros da classe: Tipo de dado Int Nome numpoints Observações Somente leitura 63
Entendendo a estrutura do MapScript LineObj (objeto que define uma linha) Métodos da classe: int add(pointobj ponto) Adiciona um ponto ao fim da linha. int addxy(double x, double y [, double m]) Adiciona um ponto ao fim da linha. O terceiro parâmetro m é usado apenas para shapefiles medidos. Não é obrigatório. int addxyz(double x, double y, double z [, double m]) Adiciona um ponto ao fim da linha. O quarto parâmetro m é usado apenas para shapefiles medidos. Não é obrigatório. 64
Entendendo a estrutura do MapScript LineObj (objeto que define uma linha) PointObj point(int i) Retorna a referência para o ponto número i. A referência é válida apenas durante a vida do lineobj que contém o ponto. int project(projectionobj in, projectionobj out) Projeta a linha desde a projeção "in" (primeiro argumento) até a projeção "out" (segundo argumento). Retorna MS_SUCCESS/MS_FAILURE. void free() Destrói os recursos usados pelo objeto linha. 65
Entendendo a estrutura do MapScript ShapeObj (objeto que define um shape) Construtor: ShapeObj = ms_newshapeobj(int type) ; Membros da classe: Tipo de dado string Nome text Observações int classindex int int int int rectobj int array type numlines index tileindex bounds numvalues values Somente leitura Somente leitura Somente leitura Somente leitura Somente leitura Somente leitura Somente leitura 66
Entendendo a estrutura do MapScript ShapeObj (objeto que define um shape) Métodos da classe:páginas 43 a 46; Método utilizados pelo sistema: int add(lineobj line) Adiciona uma linha no shape. 67
Entendendo a estrutura do MapScript ClassObj (objeto que define uma classe) Pode ser retornado por uma classe LayerObj; Construtor: classobj ms_newclassobj(layerobj layer, classobj class) Membros da classe: Tabela 1, página 4; Métodos da classe: Páginas 4 a 6; Método utilizado pelo sistema: imageobj createlegendicon(int width, int height) Desenha o ícone da legenda e retorna um novo objeto imageobj. 68
Entendendo a estrutura do MapScript StyleObj (objeto que define um estilo) Instâncias de styleobj estão sempre embutidas dentro de classobj. Construtor: styleobj ms_newstyleobj(classobj class, styleobj style) Membros da classe: Tabela 21, página 47; 69
Entendendo a estrutura do MapScript StyleObj (objeto que define um estilo) Métodos da classe: int set(string property_name, new_value) Ajusta um novo valor à propriedade de um objeto. Retorna -1 em caso de erro. styleobj clone() Retorna uma cópia do estilo. 70
Realizando pesquisa Por atributo: int querybyattributes(string qitem, string qstring, int mode) Pesquisa no layer por shapes que fazem intersecção com os atuais extents do mapa. O parâmetro qitem é o item (atributo) no qual a pesquisa é realizada e o parâmetro qstring é a expressão a ser procurada. A query é realizada em todos os shapes que fazem parte de uma CLASSE que contém um valor TEMPLATE ou qualquer classe de um layer que contenha um valor LAYER TEMPLATE. 71
Realizando pesquisa Espacial: int querybyfeatures(int slayer) Realiza um conjunto de pesquisas baseadas em um conjunto de resultados anteriores de outro layer. Atualmente os resultados devem ser baseados em layers de poligonos. Retorna MS_SUCCESS se shapes foram encontrados ou MS_FAILURE se nada foi encontrado ou se algum outro erro ocorreu. 72
Realizando pesquisa Espacial: int querybyshape(shapeobj shape) Pesquisa no layer baseado em um único shape, sendo que o shape deve ser um polígono. Retorna MS_SUCCESS se shapes foram encontrados ou MS_FAILURE se nada foi encontrado ou se algum outro erro ocorreu. 73
Liberando pesquisa Para liberar o resultado de uma pesquisa, utiliza-se o método freequery do objeto map: void freequery(layerindex) Libera um resultado de uma pesquisa em um layer especificado; Se o layerindex for -1, todas as pesquisas no layer serão liberadas; 74
Entendendo a estrutura do MapScript Exemplo de uso do PHP/MapScript Retornando uma imagem do mapa: 75
Construindo a aplicação 76
Alterações no arquivo MapFile Definir todas as referências a arquivos a partir da raiz; /var/www/html/ Inserir no objeto Metadata das layers que poderão ser pesquisadas: "pesquisa" "1" "campos" "QUADRAS,RA Tamanho da imagem de saída Width600 Height 540 77
Codificando o script requisicao.php 78
Codificando o script Mapscript.php 79