sexta-feira, 30 de julho de 2021

Consultas encadeadas utilizando With

Neste post estou apresentando o esquema comentado de uma consulta encadeada que agiliza as análises de grandes quantidade de dados.

with alias_1 as (
	select colunas, 
		(row_number() over(partition by coluna order by coluna)) as id -- Exemplo de "Window Function"
		from tabela
	), -- a virgula indica que pode ter outras tabelas disponíveis
	alias_2 as (
		select coluna 
			from tabela
	) -- sem a virgura indica que será feira uma consulta final
select a1.coluna, a2.coluna
	from alias_1 a1, alias_2 a2
	where a1.coluna = a2.coluna;

dica para formatacao do codigo http://hilite.me/

sábado, 5 de junho de 2021

Como criar um retângulo (polígono) a partir de de dois pontos.

Existem situações que é necessário criar um Bounding Box ou Retângulo Envolvente para executar uma filtragem no Banco de Dados. Neste caso vamos utilizar os dois pontos encontrados no comando ogrinfo que foi explicado em https://geoajuda.blogspot.com/2021/01/como-saber-qual-o-bounding-box-envelope.html

st_setsrid( st_makebox2d( st_makepoint(-58.8984,-9.8412), st_makepoint(-46.0608,2.5911)), 4326)

Aqui está o link [https://postgis.net/docs/ST_MakeBox2D.html] para detalhamento do comando no manual 

sexta-feira, 22 de janeiro de 2021

Uso do comando find para organizar diretórios

  •  Identificar o espaço em disco usado:

du -shc /srv/www/users/*
  •  Identificar o número de arquivos:
find /srv/www/users -type f | wc -l
  • Remover arquivos com data de acesso igual ou superior a 30 dias; o parâmetro ctime é para criação e modificação e o tempo é múltiplo de 24hs ou seja +1 representa 2 dias atráz.
find /srv/www/users -type f -atime +30 -delete
  • Remover diretorios com zero bytes
  • find /srv/www/users -type d -empty -delete
  • Remover arquivos com tamanho menor que 1 Kbytes
  • find /srv/www/users -type f -size -1k -delete

    Em 28/06/2024 encontrei outra dificuldade que foi a quantidade de erros por falta de permissão que os comandos find estavam retornando. Assim aprimorei os comando adicionando no final o redirecionamento da saída de erro para o null com a seguinte instrução 2>/dev/null

    Uma boa referência que encontrei https://www.digitalocean.com/community/tutorials/how-to-use-find-and-locate-to-search-for-files-on-linux-pt 

    segunda-feira, 18 de janeiro de 2021

    Como saber qual o Bounding Box, Envelope ou Retângulo Envolvente dos dados vetoriais

     

    Quando você está precisando saber o retângulo envolvente de um shapefile pode utilizar o comando ogrinfo para saber esta informação pois o mesmo possui o atributo Extent que mostra exatamente o ponto inferior esquerdo e o superior direito conforme pode ser visto na figura abaixo.



    O comando:

    ogrinfo -so -rl mun_pa.shp
    INFO: Open of `mun_pa.shp'
          using driver `ESRI Shapefile' successful.
    Layer name: mun_pa
    Metadata:
      DBF_DATE_LAST_UPDATE=2020-04-28
    Geometry: Polygon
    Feature Count: 144
    Extent: (-58.898324, -9.841162) - (-46.060951, 2.591028)
    Layer SRS WKT:
    GEOGCRS["WGS 84",
        DATUM["World Geodetic System 1984",
            ELLIPSOID["WGS 84",6378137,298.257223563,
                LENGTHUNIT["metre",1]]],
        PRIMEM["Greenwich",0,
            ANGLEUNIT["degree",0.0174532925199433]],
        CS[ellipsoidal,2],
            AXIS["latitude",north,
                ORDER[1],
                ANGLEUNIT["degree",0.0174532925199433]],
            AXIS["longitude",east,
                ORDER[2],
                ANGLEUNIT["degree",0.0174532925199433]],
        ID["EPSG",4326]]
    Data axis to CRS axis mapping: 2,1
    NM_MUNICIP: String (254.0)
    CD_GEOCMU: String (254.0)
    gid: Integer (4.0)
    id_0: Integer (2.0)
    id_1: Integer (2.0)

    sábado, 9 de janeiro de 2021

    Filtragem de datas em série temporal utilizando o Python Pandas

     Estou trabalhando com um conjunto de dados da estação meteorológica automática de Taubaté, cujos dados foram obtidos em https://tempo.inmet.gov.br/TabelaEstacoes/A728 .

    Tabela mostrando os dados originais do INMET


    Para leitura dos dados com Python Pandas utilizei:

    df = pd.read_csv('./TAUBATE_A728.csv', 
                     sep=';', 
                     skiprows=1, 
                     parse_dates=[[0,1]], dayfirst=True,
                     index_col=0,
                     usecols= [0,1,3,7,14,15,16,18],
                     decimal= ',',
                     dtype={'Temp. Max. (C)': np.float64, 
                            'Umi. Min. (%)': np.float64, 
                            'Vel. Vento (m/s)': np.float64, 
                            'Dir. Vento (m/s)': np.float64, 
                            'Raj. Vento (m/s)': np.float64, 
                            'Chuva (mm)': np.float64}
                    )

    Note que utilizei vários parâmetros para definir o índice do DataFrame como sendo a união dos campos data e hora que originalmente estão separados. Também fiz a escolha das colunas que me interessavam e defini o tipo do dado a ser manipulado.

    Uma primeira forma de filtrar é utilizando o padrão normalmente utilizado em qualquer coluna, porém considerando o índice do DataFrame:

    df[df.index.month == 6]

    A segunda forma é mais indicada para a situação pois ela considera o índice temporal:

    df['2020-06-02']

    Eu recomendo visitar o seguinte tutorial 


    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".