quinta-feira, 17 de dezembro de 2020

Criação de ações personalizadas com Python no Qgis

 A partir de uma leitura feita em https://courses.spatialthoughts.com/pyqgis-in-a-day.html  eu criei uma versão do exemplo para que quando o usuário executar uma action sobre um ponto de foco o Qgis selecione todos os pontos do mesmo dia.


As ações no QGIS fornecem uma maneira rápida e fácil de acionar o comportamento personalizado em resposta à ação de um usuário - como clicar em um recurso na tela ou um valor de atributo na tabela de atributos.

As ações são definidas no nível da camada e fornecem uma maneira fácil de adicionar comportamento personalizado ao QGIS sem ter que escrever plug-ins. As ações são integradas na GUI do QGIS e permitem que você execute o código PyQGIS em camadas vetoriais.

Vamos definir uma ação para a camada de focos de modo que quando um usuário clicar em um ponto, todos do mesmo dia serão selecionados. Para isto a camada de dados deve possuir um atributo que será utilizado para seleção. Neste exemplo foi criado um campo virtual chamado data que não possui o horário da passagem do satélite que detectou o foco.

Clique com o botão direito na camada, entre em propriedades e alterne para a guia Ações. 

Clique em Adicionar um novo botão de ação. 

Selecione Python como o tipo. 

Nomeie e defina uma descrição para a ação como "Selecionar mesma data". Esta ação deve ser usada para selecionar recursos na tela do mapa, portanto, marque Canvas como o Escopo da ação. Insira o seguinte trecho de código no Texto da Ação e clique em OK.

layer = QgsProject.instance().mapLayer('[% @layer_id %]')

layer.selectByExpression('"data"=\'[% data %]\'')

quarta-feira, 11 de novembro de 2020

Como criar ponto do centro do pixel.

 Por meio do Qgis é possível fazer um ponto no centro do pixel da imagem sendo que estes pontos estão contidos em um polígono. Ou seja vc já tem uma AOI e vai querer ver o valor de cada píxel. O nome da ferramenta é "Generate points (pixel centroids) inside polygons".




sexta-feira, 6 de novembro de 2020

Como acessar o banco de dados na linha de comando sem password

 Uma maneira que permite o usuário fazer acesso sem ter que digitar a senha é configurando o arquivo .pgpass maiores detalhes podem ser encontrados em https://www.postgresql.org/docs/10/libpq-pgpass.html 

Configuração de acesso remoto com SSH

 O ssh permite o acesso remoto ao servidor, porém além da tradicional forma de acessar:

user@servidor.dominio 

é possível criar pontes de acesso para facilitar o uso na máquina local.

No exemplo:

ssh -f -N -L 9995:localhost:5435 bd25

Estou mapeando na maquina local a porta 9995 para comunicar diretamente com a porta 5435 do servidor remoto bd25. Porém existe um pulo a mais nesta história, pois quando estou fora da rede corporativa não tenho acesso direto, por isso preciso me autenticar em um servidor VPN e acessar apenas uma única máquina. 

Configurando o arquivo ~/.ssh/config eu posso definir o acesso com jump direto


Host srv1

        HostName 192.160.25.1

        User mysuer

        Port 22


Host bd25

        HostName bd.dominio

        Port 22

        User mysuer

        ProxyJump srv1

Conforme apresentado no exemplo acima eu posso fazer acesso direto ao srv1 da seguinte maneira:

ssh srv1

ele vai fazer ssh mysuer@192.160.25.1 automaticamente, e além disso, conforme apresentado no inicio do post estou acessando diretamente o bd25 que nesta configuração vai primeiro no srv1.


sexta-feira, 4 de setembro de 2020

Como calcular área de um polígono no Postgis

 O link para o manual do Postgis é https://postgis.net/docs/ST_Area.html onde você vai encontrar detalhes da documentação. Neste post eu considerei que os dados do meu banco estão todos em projeção EPSG:4326 e então efetuo a conversão de tipo da geometria de Geometry para Geography e em seguida utilizo a função st_area.

No primeiro exemplo a função está retornando o dado em metros quadrados, portanto este é a unidade padrão;

   st_area( ucf.geom::geography) m2


Para obter o resultado em quilômetros quadrados foi realizada a divisão por 1 milhão;

   st_area( a_ucf_aq1km_16.intersection_geom::geography)/1000000 km2


Para obter o resultado em hectares foi realizada a divisão por 10 mil;

   st_area( a_ucf_aq1km_16.intersection_geom::geography)/10000 ha


sábado, 22 de agosto de 2020

Converter string para data no Python Pandas

 

Com o comando abaixo foi recortado do nome de uma imagem a parte que representa o ano e dia Juliano (DOY) e convertido para o formato data.

dados["data_pas"] = pd.to_datetime(dados.cena_atual.str.slice(9,16), format='%Y%j')

Truncar data no Python Pandas

 


# este comando é pra truncar a data mantendo os valores dentro da hora ex. 16:54 -> 16:00

df["data_hora"] = df.data_hora_gmt.dt.floor("H")

segunda-feira, 4 de maio de 2020

Comandos mágicos para edição rápida de arquivos txt em Shell

Estes comandos são apenas para recordar a sintaxe rápida pois a explicação depende de muita leitura, recomendo os livros do Verde (Aurélio Jargas) https://aurelio.net/ em especial https://aurelio.net/sed/sed-howto/#conhecendo-o-sed

# insere o texto "begin transation" na primeira linha do arquivo
# focos_terrama2q.sql
sed -i '1s/^/begin transaction; /' focos_terrama2q.sql 


# insere o texto na linha específica (linha 29322846)
sed -i '29322846s/^/commit; /' focos_terrama2q.sql

# insere o texto na ultima linha
echo "commit; " >> focos_terrama2q.sql

# insere algum texto a cada 100000 linhas
sed '0~100000 s/$/\ncommit;\nbegin;/g' < focos_terrama2q.sql > focos.sql



segunda-feira, 20 de abril de 2020

Time Zone no Banco de Dados PostgreSQL


Neste post estou preocupado como a definição de tempo do meu banco de dados. Pois quando o sistema for instalado em usuários de outros fusos o sistema pode apresentar erro. Com os comandos SQL abaixo direitamente no PGSQL você poderá saber o que está definido e como fazer a devida conversão.
-- Show timezone of current session.
show timezone;

 -- Set timezone of current session.
set time zone 'Brazil/East';

 -- Identify or remembering timezone.
select * from pg_timezone_names;


Uma dica de como manter o fuso definido está em:

https://kb.objectrocket.com/postgresql/postgresql-set-time-zone-1064


Para definir definitivamente nas configuração do Banco e não na seção devem ser utilizado os seguintes comandos:

sudo -u postgres pg_conftool 11 main set timezone "UTC" 
sudo -u postgres pg_conftool 11 main set log_timezone "UTC" 
service postgresql restart

sexta-feira, 27 de março de 2020

Como combinar todos os arquivos CSV de uma mesma pasta para um pandas dataframe automaticamente


Muitas vezes temos que ler vários arquivos idênticos, por exemplo focos por dia, para depois analisar todos os registros juntos. Uma maneira de fazer isto muito rápido foi publicado por Kade Killary
 em:

https://medium.com/@kadek/elegantly-reading-multiple-csvs-into-pandas-e1a76843b688

Resumindo o texto o que deve ser realizado está apresentado nas 3 linhas abaixo

import glob
import pandas as pd
df = pd.concat([pd.read_csv(f) for f in glob.glob('data*.csv')], ignore_index = True)

A explicação disto pode ser interpretada por partes da seguinte maneira

# glob.glob('data*.csv') - returns List[str]
# pd.read_csv(f) - returns pd.DataFrame()
# for f in glob.glob() - returns a List[DataFrames]
# pd.concat() - returns one pd.DataFrame()