Bem-vindo

Um programador web agora mexendo com cartografia digital e um entusiasta do ciclismo, falando sobre tecnologias web e SIGweb, ciclismo urbano, cultura, política e mimimis

18 abril 2014 ~ 0 Comments

Rascunho automático

Sem categoria

18 abril 2014 ~ 0 Comments

Controlando a camada do MapServer em tempo de execução

Seguindo a dica do Prof. Marcello Benigno (que está ministrando um excelente curso online de MapServer), consegui resolver um “problema” para melhorar a perfomance do MapServer e controlar uma camada de dados em tempo de execução, ao invés de separar todos os itens da mesma em várias camadas, o que geraria uma lentidão gigante que soma o servidor, a transferência dos arquivos e o processamento no cliente.

Eu tenho como teste e fonte de estudos para o MapServer um mapa de uso e ocupação do solo, que tem 19 categorias de uso e ocupação, na área de metade do município do RJ (toda a Zona Oeste), com mais de 11mil polígonos, com milhares de pontos para cada polígono. Na primeira tentativa de mostrar esses dados eu trabalhei apenas com a leitura de um arquivo base (ESRI ShapeFile) e exibição em vetores pelo OpenLayers. Devido a grande quantidade de polígonos e área, e a incapacidade do OpenLayers em reduzir os polígonos em escala maiores, o resultado foi frustrante, pois emperrava as máquinas clientes na construção de tantos polígonos.

Resolvi então adotar o MapServer para gerar um WMS, assim ele se encarrega de construir a imagem completa e entregar ao navegador apenas os tiles dessa imagem, sem a necessidade do cliente processar tantos polígonos. Porém havia a demanda dos usuários poderem escolher a exibição das categorias separadamente. A princípio poderia ter separado cada categoria para uma camada do mapServer, porém isso geraria uma demanda grande de requisições para o servidor, a entrega de mais imagens, fazendo com que ficasse 19 vezes mais pesado e consequentemente lento.

A idéia inicial era tentar de alguma forma poder alterar a seleção dos tipos de uso e ocupação para exibir apenas os tipos desejados ou alterar o estilo dos tipos para fazê-los ficarem transparente. A dica do Prof. Marcello, foi o uso do Run-time Substitution, que permite passar parâmetros para o MapServer que substitui os valores no mapFile com o uso de [%CDATA%], e usar o recurso de FILTER para selecionar os itens. Assim algumas linhas alteradas no mapFile e algumas instruções javascript e obtive o resultado desejado.

Para o MapServer, foram acrescentadas ao LAYER:

1
2
3
4
5
6
7
        METADATA
            "COD_LIST_validation_pattern" "^[0-9,]+$"
            "default_COD_LIST" "1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19"
        END
        FILTERITEM "Cod"
        FILTER ([Cod] IN '%COD_LIST%')

COD_LIST é o nome da variável que escolhi.

Obs.: por alguma razão desconhecida (talvez a diferença do Ubuntu para Debian), ao colocar esse material no meu servidor remoto percebi – depois de muito quebrar a cabeça – que havia uma questão de case sensitive, pois o OpenLayers transforma o parâmetro cod_list em maiúsculo para o MapServer e deixava de ser funcional, por isso fui pelo caminho mais fácil tratando como maiúsculo o nome da variável no mapFile.

O validation_pattern é uma expressão regular para determinar que os valores são números inteiros, que o mapserver exige que seja obrigatório,

default_ , que é obviamente o padrão inicial do filtro, coloquei todos os tipos existentes para começarem ativos. O FILTERITEM determina o campo dos dados que desejo filtrar, no caso o código do tipo de uso e ocupação, e o FILTER receba uma lista como no default_ que irei tratar no javascript.

Para o javascript, eu criei em HTML da mesma lista dos tipos manualmente usando um checkbox com o valor de cada código do tipo de uso, e com bibliotecas jQuery eu controlei o que está marcado para então atualizar a camada através do OpenLayers:

1
2
3
4
5
6
7
    $(".uso_ocupacao input").change(function(){
        var lista = [];
        $(".uso_ocupacao input:checked").each(function(){
            lista.push(this.value);
        });
        tizo.mergeNewParams({cod_list: lista});
    });

Usando a função change, do jQuery, que determina quando houve alteração em algum campo de formulário, ele coloca o valor de cada (.each) um dos inputs que estiverem checados em um array, que então a função .mergeNewParams() do OpenLayers altera o parâmetro cod_list com a lista dos itens atualizados para o WMS do MapServer. 

E assim resolvido de uma forma otimizada. A transição na escolha dos tipos ocorre de forma mais lenta, pois o que o mapServer faz é reconstruir a imagem do mapa e devolvê-la em tiles, mas é melhor uma transição pouca lenta quando requisitada do que todo o carregamento inicial na troca de escala ser dez a vinte vezes mais lento.

O resultado: http://globalgeosig.com.br/tizo - Na janela de camadas, no título em fundo cinza ‘Uso e Ocupação [+]‘ abre a lista de tipos de uso.

21 janeiro 2014 ~ 0 Comments

De volta de novo

Pela enecésima vez, re-blogando. Site ativo, e muita coisa para colocar.

Aqui pelo menos eu não perco as coisas no tempo e no espaço como em outros socia-media-coisas.

Eh vamu que vamu.

Tags: ,

21 janeiro 2014 ~ 0 Comments

De volta de novo

Pela enecésima vez, re-blogando. Site ativo, e muita coisa para colocar.

Aqui pelo menos eu não perco as coisas no tempo e no espaço como em outros socia-media-coisas.

Eh vamu que vamu.

21 janeiro 2014 ~ 0 Comments

De volta de novo

Pela enecésima vez, re-blogando. Site ativo, e muita coisa para colocar. Aqui pelo menos eu não perco as coisas no tempo e no espaço como em outros socia-media-coisas.
Vamu que vamu.

10 outubro 2012 ~ 0 Comments

Diário Fernando Norte já sai…

Diário Fernando Norte já saiu! http://t.co/qoWhukbg ▸ Principais notícias de hoje via @glauco @mariocaraujo

Tags:

09 outubro 2012 ~ 0 Comments

Was out cycling 9.05 km with #…

Was out cycling 9.05 km with #Endomondo See it here: http://t.co/zFnOHNHk

Tags:

09 outubro 2012 ~ 0 Comments

Was out cycling 4.98 km with #…

Was out cycling 4.98 km with #Endomondo See it here: http://t.co/DMB2ixa5

Tags:

08 outubro 2012 ~ 0 Comments

Was out cycling 8.57 km with #…

Was out cycling 8.57 km with #Endomondo See it here: http://t.co/EwL4pxNt

Tags:

08 outubro 2012 ~ 0 Comments

Was out cycling 5.49 km with #…

Was out cycling 5.49 km with #Endomondo See it here: http://t.co/Cqt4F1EZ

Tags: