![]() |
|
|
Planilha de Dimensionamento de Tubulações
Hidráulicas Água Fria e Água Quente CompletaNossa planilha automática de dimensionamento de tubulações de água fria e quente é uma ferramenta desenvolvida para auxiliar engenheiros e projetistas no cálculo rápido e preciso das redes hidráulicas de edificaçoes. Por meio da inserçao de dados como vazao, diâmetro da tubulaçao, comprimento da rede, material do tubo e coeficientes hidráulicos, a planilha realiza automaticamente os cálculos necessários para verificar velocidade da água, perda de carga e dimensionamento adequado das tubulaçoes. |
||
QGIS ::: PyQGIS API ::: Aplicações com código fonte completo |
Como listar os 5 municípios goianos com maior área em uma camada do QGIS usando PyQGIS - Código Python completoQuantidade de visualizações: 776 vezes |
|
Este código completo mostra uma aplicação QGIS na qual usei PyQGIS para resolver um desafio muito interessante, e complexo. Acredito que servirá de base para muitos códigos interessantes envolvendo QGIS, Python e PyQGIS. Comecei fazendo o download do shapefile do Estado de Goiás, contendo seus 246 municípios no site do IBGE. Em seguida carreguei o shapefile no QGIS usando um objeto QgsVectorLayer. Note que criei uma classe Municipio para guardar cada um dos municípios encontrados no shapefile. E, para agrupar os objetos da classe Municipio eu criei uma lista chamada municipios. Para acessar cada um dos municipios, ou seja, cada uma das 246 feições da camada, eu usei a função getFeatures() da classe QgsVectorLayer. Então, ao percorrer cada uma dessas feições, eu obtive seus atributos, por meio da função attributes(), e os usei para criar os objetos da classe Municipio. Uma vez obtida a lista de municípios, o passo seguinte foi classificar a lista por ordem crescente de área (a área dos municípios). Um laço for me permitiu listar apenas os 5 municípios com maiores áreas e, além de registrar o somatório de seus áreas, obter os seus códigos para selecioná-los na camada, usando a função selectByExpression(). O desafio final foi mostrar as labels, ou seja, os rótulos de cada um dos municípios no mapa do QGIS, porém, eu queria mostrar os rótulos apenas dos 5 municípios com as maiores áreas. Para resolver o desafio, lancei mão da função setFilterExpression(). Veja o código completo para o exemplo:
# uma classe para guardar cada um dos municípios
# do Estado de Goiás
class Municipio:
# método construtor
def __init__(self, codigo, nome, estado, area):
self.codigo = codigo
self.nome = nome
self.estado = estado
self.area = area
# para guardar os municípios
municipios = []
# vamos criar um novo objeto QgsVectorLayer com o local
# do nosso shapefile
camada = QgsVectorLayer("C:\\GOIAS\\GO_Municipios_2022.shp",
"Municípios do Estado de Goiás", "ogr")
# vamos testar se a camada é válida
if not camada.isValid():
print("Não foi possível carregar a camada %s" % camada.name())
else:
# vamos percorrer todas as feições da camada
# e obter os seus atributos
feicoes = camada.getFeatures()
for f in feicoes:
# vamos obter os atributos desta feição
atributos = f.attributes()
# e criamos um novo objeto da classe Municipio
municipio = Municipio(atributos[0], atributos[1],
atributos[2], atributos[3])
# adicionamos este município na lista
municipios.append(municipio)
# agora vamos ordenar a lista por área da maior para
# a menor
municipios = sorted(municipios,
key=lambda municipio:municipio.area, reverse=True)
# vamos adicionar a camada à relação de camadas
QgsProject.instance().addMapLayer(camada)
# vamos calcular a área ocupada pelos 5 maiores municípios
# do Estado de Goiás
area_5_maiores = 0
for i in range(5):
area_5_maiores = area_5_maiores + municipios[i].area
# agora vamos selecionar os 5 maiores municípios na
# camada do QGIS
codigos = ""
for i in range(5):
codigos = codigos + municipios[i].codigo + ", "
codigos = codigos[0:len(codigos) - 2]
camada.selectByExpression('"CD_MUN" IN (' + codigos + ')')
# e mostramos os resultados
print("Os 5 maiores municípios do Estado de Goiás são:\n")
for i in range(5):
print("{0}) {1} - Área: {2} km2".format(i + 1, municipios[i].nome,
municipios[i].area))
print("\nÁrea ocupada pelos 5 maiores municípios: {0} km2".format(
area_5_maiores))
# finalmente vamos exibir os nomes dos municípios. Essa foi
# a parte mais desafiadora do código, pois eu queria mostrar
# somente os rótulos dos cinco maiores municípios
settings = QgsPalLayerSettings()
settings.isExpression = True
settings.placement = QgsPalLayerSettings.Line
settings.placement = QgsPalLayerSettings.Horizontal
# mostra o nome do município
settings.fieldName = "NM_MUN"
format = QgsTextFormat()
format.setColor(QColor('Black'))
settings.setFormat(format)
settings.enabled = True
# cria e adiciona uma nova regra
root = QgsRuleBasedLabeling.Rule(QgsPalLayerSettings())
rule = QgsRuleBasedLabeling.Rule(settings)
rule.setDescription("5 Maiores Municípios do Estado de Goiás")
# define o campo que será usado no filtro. Note que somente
# serão listados os rótulos dos municípios com área maior ou
# igual ao quinto elemento da lista municípios
campo_area = "AREA_KM2"
rule.setFilterExpression(f"\"{campo_area}\" >= {municipios[4].area}")
root.appendChild(rule)
# define as configurações do rótulo
camada.setLabelsEnabled(True)
rules = QgsRuleBasedLabeling(root)
camada.setLabeling(rules)
# redesenha a camada no canvas do QGIS
camada.triggerRepaint()
Ao executar este código QGIS, Python e PyQGIS nós teremos o seguinte resultado: Os 5 maiores municípios do Estado de Goiás são: 1) Niquelândia - Área: 9846.293 km2 2) Mineiros - Área: 9042.844 km2 3) Caiapônia - Área: 8627.961 km2 4) Rio Verde - Área: 8374.255 km2 5) Nova Crixás - Área: 7308.681 km2 Área ocupada pelos 5 maiores municípios: 43200.03399999999 km2 Para fins de compatibilidade este código foi escrito e testado no QGIS 3.34.5-Prizren. |
MySQL ::: Dicas & Truques ::: Data e Hora |
Como calcular a diferença em dias entre duas datas do MySQL usando a função DATEDIFF()Quantidade de visualizações: 19660 vezes |
A função DATEDIFF() é usada quando precisamos obter a diferença entre duas datas. Ela aceita dois argumentos: expr1 e expr2 e retorna expr1 ? expr2 como um valor em dias de uma data para a outra. Tanto expr1 quanto expr2 são campos do tipo DATE, DATETIME ou TIMESTAMP. Somente a parte date é usada nos cálculos. Veja um exemplo de seu uso:
SELECT DATEDIFF('2008-03-10','2008-02-10')
O resultado será 29. Veja mais um exemplo: SELECT DATEDIFF(NOW(), vencimento) FROM tabela_estudos Aqui nós obtemos a quantidade de dias que já se passaram entre a data de hoje e o valor armazenado no campo vencimento. |
Java ::: Desafios e Lista de Exercícios Resolvidos ::: Laços de Repetição |
Exercícios Resolvidos de Java - Escreva um programa Java que usa o laço for para desenhar um padrão de diamante de estrelasQuantidade de visualizações: 1690 vezes |
|
Exercício Resolvido de Java - Escreva um programa Java que usa o laço for para desenhar um padrão de diamante de estrelas Pergunta/Tarefa: Neste exercício para a prática da linguagem Java você deverá usar o laço for para desenhar o famoso padrão de diamante de estrelas. Você pode também usar o laço while, se assim você o desejar. O programa deverá pedir que o usuário informe a quantidade de linhas que marcará a metade do diamante. Seu programa deve apresentar a seguinte saída:
Informe a quantidade de linhas: 5
*
***
*****
*******
*********
*******
*****
***
*
Veja a resolução comentada deste exercício em Java:
package exercicio;
import java.util.Scanner;
public class Exercicio {
public static void main(String[] args) {
// vamos usar um objeto Scanner para ler a entrada do usuário
Scanner leitura = new Scanner(System.in);
// vamos pedir a quantidade de linhas
System.out.print("Informe a quantidade de linhas: ");
// vamos ler a entrada do usuário
int linhas = Integer.parseInt(leitura.nextLine());
int estrelas = 1; // começamos com uma estrela (no topo do diamante)
int espacos = linhas - 1; // se linhas for igual a 5 nós começamos
// com 4 espaços
// repete duas vezes a quantidade de linhas informadas
for(int i = 1; i < linhas * 2; i++){
// vamos imprimir os espaços
for(int j = 1; j <= espacos; j++){
System.out.print(" ");
}
// agora vamos imprimir estrelas
for(int j = 1; j < estrelas * 2; j++){
System.out.print("*");
}
// passamos para a próxima linha
System.out.println();
if(i < linhas){ // é a parte superior do diamante
espacos--; // diminui os espaços
estrelas++; // e aumenta as estrelas
}
else{ // é a parte inferior do diamente
espacos++; // aumenta os espaços
estrelas--; // e diminui as estrelas
}
}
}
}
|
Firebird ::: Dicas & Truques ::: Tipos de Dados |
Como usar o tipo de dados BLOB do Firebird para a gravação de imagens, vídeos e arquivos de músicaQuantidade de visualizações: 19501 vezes |
|
Um BLOB é um tipo de dados que permite armazenar grandes informações no formato binário (Binary Large OBject). Campos deste tipo podem conter dados binários ou ASCII, por exemplo, grandes arquivos de texto, documentos para o processamento de dados, arquivos de programas CAD, imagens e gráficos, vídeos, arquivos de música, etc. O tamanho de um BLOB é quase ilimitado, uma vez que eles podem ser armazenados utilizando-se várias páginas. Isso assume, contudo, que um tamanho de página suficiente tenha sido fornecido para a base de dados. Por exemplo, usando uma página de 1kb, o tamanho do BLOB não pode exceder 0,5Gb. Se usarmos um tamanho de página de 4Kb, o tamanho do BLOB está limitado a 8Gb. O Firebird suporta dois tipos pré-definidos de BLOB, diferenciados pelo atributo sub-type (palavra-chave SQL SUB_TYPE): a) BLOB SUB_TYPE 0 - Este é o tipo BLOB genérico para o armazenamento de qualquer tipo de dados, incluindo texto. Geralmente chamado de "BLOB binário sem registro de tipo". b) BLOB SUB_TYPE 1 (BLOB SUB_TYPE TEXT) - Sub-tipo mais especializado para o armazenamento de texto puro. É equivalente aos tipos CLOB e MEMO implementados em alguns bancos de dados (DBMS). É recomendado para uso com interfaces de aplicações tais como componentes RAD ou motores de pesquisa que fornecem um tratamento especial para tais tipos. Veja um comando DDL CREATE TABLE que cria uma tabela contendo um campo do tipo BLOB (usando o sub-tipo text): CREATE TABLE COMPROMISSOS ( ID INTEGER NOT NULL, DESCRICAO BLOB SUB_TYPE 1 SEGMENT SIZE 4096 NOT NULL, DATA_HORA TIMESTAMP NOT NULL ); Aqui nós temos uma tabela com três campos: ID é do tipo INTEGER, DESCRICAO é do tipo BLOB com o sub-tipo 1 e DATA_HORA é do tipo TIMESTAMP. Veja agora um comando DML INSERT INTO que insere um registro nesta tabela: INSERT INTO COMPROMISSOS VALUES(10, 'REUNIÃO COM CLIENTE - SÃO PAULO', '2010-12-02 12:30:00'); Note que os valores para campos do tipo BLOB devem ser fornecidos entre aspas simples. Agora, veja um comando SQL DML SELECT que lista o registro inserido anteriormente: SELECT * FROM COMPROMISSOS; Este comando vai gerar o seguinte resultado: ID DESCRICAO DATA_HORA 10 REUNIÃO COM CLIENTE - SÃO PAULO 2/12/2010 12:30:00 |
Nossas 20 dicas & truques de programação mais populares |
|
Delphi - Como calcular o cateto adjascente dadas as medidas da hipotenusa e do cateto oposto em Delphi |
Você também poderá gostar das dicas e truques de programação abaixo |
Nossas 20 dicas & truques de programação mais recentes |
Últimos Projetos e Códigos Fonte Liberados Para Apoiadores do Site |
|
Python - Como criar o jogo Pedra, Papel, Tesoura em Python - Jogo completo em Python com código comentado |
Últimos Exercícios Resolvidos |
E-Books em PDF |
||||
|
||||
|
||||
Linguagens Mais Populares |
||||
|
1º lugar: Java |




