quarta-feira, julho 08, 2015

Análises Espaciais com o PostGIS Raster - Parte 1


O projeto PostGIS Raster possibilita o armazenamento e manipulação de dados matriciais em Banco de Dados Espaciais através da linguagem SQL.

Nesta série de tutoriais, serão demonstradas algumas funcionalidades desta extensão através da utilização dos dados de uso e ocupação do solo da mesorregião de Aracicaba (SP) e adjacências. Os dados podem ser obtidos através deste link: http://ge.tt/1Hye7zJ2/v/0?c

Caso você ainda não tenha o PostgreSQL e o PostGIS instalados no Ubuntu, este post descreve o processo: Instalação do PostGIS 2.0 no Ubuntu via Terminal

1) Criação do Banco de Dados Espaciais


Com o terminal aberto, entre com o comando:

$ createdb sp

Uma vez criado o Banco de Dados, deve-se então habilitar a extensão PostGIS no mesmo:

$ psql sp
psql (9.4.4)
Type "help" for help.

postgis=# CREATE EXTENSION postgis;

Digite \q para sair do Banco de Dados.

2) Conversão do arquivo Raster para SQL


Para realizar a conversão, abra o terminal e navegue até o diretório onde o arquivo uso_ocupacao.tif se encontra, em seguida, execute o seguinte comando:
$  raster2pgsql -s 4326 -I -M -C uso_ocupacao.tif -F -t 30x30 uso_ocupacao_solo > uso_ocupacao_solo.sql

Cada flag, que são as letras iniciadas com um "-" determina uma propriedade no arquivo sql que é gerado, neste caso em específico, temos:
  • -s : sistema de referência espacial do raster (SRID 4326)
  • -I: cria um índice GiST na coluna do raster
  • -M: adiciona um "Vacuum analise" ao script
  • -C: cria as constraints da tabela raster
  • -F: adiciona uma coluna com o nome do arquivo
  • -t 30×30: resolução espacial do raster

Outras opções sobre as flags e sobre o raster2pgsql  podem ser encontradas no link:


Agora é possível carregar todos os arquivos no Banco de Dados (municipios.sql, hidrografia.sql e uso_ocupacao_solo.sql) através de um único comando:

$  for f in *.sql; do psql -f $f -d sp; done

3) Visualização das tabelas no QGIS:


Uma vez configurada a conexão entre o QGIS e o Banco PostGIS, através do plugin DB Manager podemos então visualizar as tabelas do tipo raster, como mostra a Figura 1:

Figura 1 - Com o botão direito do mouse é possível escolher a opção "Add to canvas"

Para melhor representação visual da tabela, clique com o botão direito no layer e em "Properties -> Style" realize o ajuste exibido na Figura 2:

Figura 2 - Ajuste das cores do mapa temático

A Figura 3 mostra como deve ficar o resultado no QGIS.

Figura 3 - Mapa de uso e ocupação do solo

No próximo post demonstrarei algumas consultas e análises espaciais úteis utilizando os dados desta tabela, através da linguagem SQL... até breve :)

sábado, abril 18, 2015

Instalação do Laravel 5 no Ubuntu 14.10

O framework Laravel é atualmente um dos mais bem conceituados no mundo PHP. Isso se dá não apenas por conta do seu código limpo e elegante, mas também pela suave curva de aprendizado, recursos oferecidos, facilidade de uso e uma boa documentação.

Neste post, será demonstrado a instalação do mesmo no Ubuntu 14.10 utilizando o Terminal. Alguns pacotes e configurações descritos são opcionais, principalmente para quem não trabalha com desenvolvimento Webmapping.

1) Atualizando o Ubuntu:

$  sudo apt-get update && sudo apt-get upgrade -y

2) Servidor Apache

$  sudo apt-get install apache2

Em seguida, deve-se configurar as permissões do seu usuário na pasta de html. Substitua a palavra "marcello" pelo nome do seu usuário:

$  sudo adduser marcello www-data
$  sudo chown marcello:www-data -R /var/www/html
$  sudo chmod 755 -R /var/www/html


 3) PHP 5

$  sudo apt-get install php5

Criação o arquivo info.php dentro do diretório /var/www/html:

$  cd /var/www/html/
$  touch info.php
$  echo '<?php phpinfo(); ?>' >> info.php

Abra o browser e verifique a instalação: http://localhost/info.php

4) PostgreSQL / PostGIS (opcional)

$  sudo apt-get install postgresql-9.4-postgis-2.1 pgadmin3

Troque o seu usuário para o usuário postgres com os comandos:

$  sudo su
$  su postgres
$  postgres@ubuntu:/home/marcello$ createuser -s <seu_usuario> -P

5) Módulo PostgreSQL para o PHP 5

$  sudo apt-get install php5-pgsql

6) Extensão Mcrypt

$  sudo apt-get install php5-mcrypt
$  sudo php5enmod mcrypt
$  sudo service apache2 reload

7) Habilitando o mod_rewrite

$  sudo a2enmod rewrite
$  sudo service apache2 restart

Abra o arquivo:

$  sudo nano /etc/apache2/sites-available/000-default.conf

Procure por “DocumentRoot /var/www/html” e adicione as linhas a seguir logo abaixo:

<Directory "/var/www/html">
AllowOverride All
</Directory>

Saia do nano digitando control x, confirme as modificações (y) e por último tecle ENTER. Reinicie o servidor novamente:

$  sudo service apache2 reload

8) Composer

$  sudo apt-get install curl
$  curl -sS https://getcomposer.org/installer | php
$  mv composer.phar /usr/local/bin/composer

9) Nosso primeiro projeto com o Laravel 5

Na pasta /var/www/html/, execute o comando abaixo para realizar a instalação do Laravel:

$  composer create-project laravel/laravel <nome-do-projeto> --prefer-dist

Neste exemplo,  o nome do nosso projeto será sirh. Em seguida entre na pasta e execute os comando a seguir:

$  cd sirh
$  sudo chmod -R 777 storage/
$  php artisan serve

Temos então a aplicação funcionando no endereço http://localhost:8000

10) Criando um Virtual Host (opcional)

Embora seja possível acessar o projeto atráves do comando anterior, eu particularmente prefiro acessar através de uma url com o seguinte formato http://nome-do-projeto.dev. Para isso é necessário configurar um Virtual Host, da seguinte forma:
$  cd /etc/apache2/sites-available
$  sudo touch sirh.dev.conf
$  sudo nano sirh.dev.conf

Coloque o conteúdo a seguir dentro do arquivo criado:

<VirtualHost *:80>
  ServerName sirh.dev
  DocumentRoot /var/www/html/sirh/public
   <Directory /var/www/html/sirh/public>
     Options Indexes FollowSymLinks
     AllowOverride All
     Require all granted
   </Directory>
</VirtualHost>

Saia do nano digitando control x, confirme as modificações (y) e por último tecle ENTER. Será necessário ativar o VirtualHost com o comando:

$  sudo a2ensite  sirh.dev.conf

Altere o arquivo de hosts...

$  sudo nano /etc/hosts

...adicionando a seguinte linha ao final do arquivo:

 127.0.0.1 sirh.dev

Por último, reinicie o servidor Apache:

$  sudo service apache2 reload

Acesse o link http://sirh.dev/, você deverá ver a página inicial do Laravel:



Caso não consiga chegar até aqui, entre em contato comigo, dúvidas e sugestões serão bem vindas.

Referências:

Documentação do Laravel:
http://laravel.com/docs/master

Iniciando um Novo Projeto no Laravel:
 http://magazine.softerize.com.br/tutoriais/php/laravel/iniciando-um-novo-projeto-laravel

sexta-feira, janeiro 02, 2015

Trabalhando com Formulários no QGIS

A criação de formulários personalizados no QGIS, é um recurso muito útil para o preenchimento dos campos de uma tabela de atributos. Vejamos então como isso funciona.

Neste exemplo será utilizada uma camada que representa os postes de iluminação pública de uma determinada área, com os seguintes campos (Figura 1):

Figura 1 - Campos da camada postes

Para cada campo deve ser criado um Alias, para facilitar o entendimento do usuário (Figura 2):

Figura 2 - Criação dos Aliases

O campo manutencao será definido como sendo do tipo "Check Box", onde 0 será o valor para os postes que ainda não foram revisados e 1 o valor para os postes revisados (Figura 3):

Figura 3 - Definição do campo manutencao como Check Box

Para campos do tipo Date, é possível adicionar calendários "popup" para o preenchimento dos seus valores. O campo data_manut exemplifica o processo (Figura 4):

Figura 4 - Definição do campo data_manut como Date/Time

Para valores fixos, onde é mostrado uma lista contendo valores predeterminados, utiliza-se a opção Value Map. Este tipo de entrada de dado é muito útil, pois evita possíveis erros de digitação. Os campos tipo_ilum (Figura 5) e cor_lampad (Figura 6) são exemplos do uso desse recurso:

Figura 5 - Lista de valores para o campo tipo_ilum

Figura 6 - Lista de valores para o campo cor_lampad

Já a opção Range é útil quando um campo deve receber um valor a partir de uma variação de números. Também é possível definir o incremento ou step. Para este exemplo, o campo qtde_lampa é configurado da seguinte forma (Figura 7):

Figura 7 - Definição do campo qtde_lampa

Também é possível utilizar o recurso conhecido como "autocomplete", onde a medida que o usuário digita, são sugeridos valores que foram armazenados anteriormente. Para isso, deve-se escolher a opção Unique Values. O campo tipo_poste será utilizado como exemplo, a seguir (Figura 8): 

Figura 8 - Habilitando o autocomplete no campo tipo_poste

Para o campo altura_pos mais uma vez é escolhida a opção Range, como mostra a Figura 9:

Figura 9 - Campo altura_pos

Por último, para o campo foto deve-se escolher a opção Photo,  dessa forma o QGIS exibirá uma miniatura da imagem escolhida (Figura 10).

Figura 10 - Campo foto


O RESULTADO:


Ao entrar em modo de edição, o usuário terá um formulário personalizado que ajudará a diminuir a entrada de inconsistências por digitação... e o que é melhor, isso foi feito sem escrever uma só linha de código (Figura 11). 

Figura 11 - Resultado do formulário

sábado, outubro 18, 2014

A Função row_number() em Consultas de Agregação Espacial

Em Banco de Dados, as funções de agregação são utilizadas para agrupar valores de acordo com um ou vários campos, agregando em uma única linha o conteúdo de vários registros. Dessa forma, os detalhes da informação original são postos de lado e as informações são tratadas em conjunto. São exemplos de funções de agregação: count(), sum(), max(), avg(), dentre outras. 

As funções de agregação também são empregradas em dados espaciais, é o caso da função ST_Union(), onde os vértices adjacentes da nova camada são dissolvidos a partir dos valores armazenados em um campo específico. 

Entretanto, para visualizar o resultado desta nova camada em um software de GIS ou de Webmapping, a maioria deles necessita que a camada tenha um campo com valores únicos. E é exatamente aí que a função row_number() se torna útil neste tipo de análise, permitindo gerar um campo “ID” (identificador único) a partir do número da linha dentro da consulta, de acordo com o “order by” informado. 

Para ilustrar o uso função row_number(), vejamos o exemplo a seguir (Figura 1). Utilizando o QGIS e uma camada de um BD Espacial PostGIS é realizada uma agregação dos municípios a partir do campo “meso” (mesorregiões do estado). 

Figura 1 - Consulta no DB Manager do QGIS

Desta forma, o campo id é criado e povoado através da função row_number() e o resultado pode ser visualizado no QGIS (Figura 2).

Figura 2 - Resultado em forma de mapa temático

Existem outras formas de se obter o mesmo resultado do campo id, neste tipo de situação, porém, o emprego da função row_number() é muito simples, como foi demonstrado no exemplo.

domingo, agosto 17, 2014

WMS GetFeatureInfo Utilizando MapServer e Leaflet

No Leaflet existem duas formas bem usuais de se obter os dados tabulares de uma feição através do clique do usuário em uma determinada camada. Uma delas é através do uso de marcadores (Markers), que é mais utilizada para a representação de pontos. A outra  é  o formato GeoJSON, que é uma excelente opção para exibir camadas de polígonos e de linhas neste aplicativo.

Porém, quando uma camada GeoJSON possui muitas feições ou uma grande quantidade de vértices, seu carregamento pode comprometer o desempenho do aplicativo. Uma saída para este problema é utilizar o formato WMS habilitando a requisição GetFeatureInfo como é mostrado no exemplo a seguir.

1 - Configuração do Mapfile como Servidor WMS:


A configuração do servidor WMS é feita através da definição dos itens obrigatórios para o seu funcionamento, a nível de MAP e de LAYER, definidos na documentação do MapServer no item "Setting Up a WMS Server Using MapServer". 



2 - Configuração do Template HTML para a requisição GetFeatureInfo:


Neste arquivo são definidos os dados que serão exibidos na janela de atributos através do GetFeatureInfo WMS Request. 


3 - Configuração do Leaflet:


Para habilitar esta funcionalidade  é necessário configurar a camada WMS no Leaflet, como é exibido a seguir:

Já com a função IDENTIFY abaixo, é possível associar ao clique do mouse uma requisição GetFeatureInfo, através da obtenção das variáveis BBOX, WIDTH, HEIGHT, X e Y. Com elas é definida a variável URL que fará esta requisição ao servidor WMS e trará o resultado de forma assíncrona com método $.ajax do jQuery.

A página HTML contendo o Leaflet fica então desta forma:


4 - Resultado:


Ao clicar em um município, é exibido uma janela contendo os atributos, como mostra a figura abaixo:


Você pode baixar os códigos deste exemplo neste link.

Sugestões de Leitura: